1{
2 pkgs,
3 lib,
4 config,
5 ...
6}:
7let
8
9 cfg = config.services.ihaskell;
10 ihaskell = pkgs.ihaskell.override {
11 packages = cfg.extraPackages;
12 };
13
14in
15
16{
17 options = {
18 services.ihaskell = {
19 enable = lib.mkOption {
20 type = lib.types.bool;
21 default = false;
22 description = "Autostart an IHaskell notebook service.";
23 };
24
25 extraPackages = lib.mkOption {
26 type = lib.types.functionTo (lib.types.listOf lib.types.package);
27 default = haskellPackages: [ ];
28 defaultText = lib.literalExpression "haskellPackages: []";
29 example = lib.literalExpression ''
30 haskellPackages: [
31 haskellPackages.wreq
32 haskellPackages.lens
33 ]
34 '';
35 description = ''
36 Extra packages available to ghc when running ihaskell. The
37 value must be a function which receives the attrset defined
38 in {var}`haskellPackages` as the sole argument.
39 '';
40 };
41 };
42 };
43
44 config = lib.mkIf cfg.enable {
45
46 users.users.ihaskell = {
47 group = config.users.groups.ihaskell.name;
48 description = "IHaskell user";
49 home = "/var/lib/ihaskell";
50 createHome = true;
51 uid = config.ids.uids.ihaskell;
52 };
53
54 users.groups.ihaskell.gid = config.ids.gids.ihaskell;
55
56 systemd.services.ihaskell = {
57 description = "IHaskell notebook instance";
58 wantedBy = [ "multi-user.target" ];
59 after = [ "network.target" ];
60 serviceConfig = {
61 User = config.users.users.ihaskell.name;
62 Group = config.users.groups.ihaskell.name;
63 ExecStart = "${pkgs.runtimeShell} -c \"cd $HOME;${ihaskell}/bin/ihaskell-notebook\"";
64 };
65 };
66 };
67}