1{ pkgs, lib, config, ... }:
2
3with lib;
4
5let
6
7 cfg = config.services.ihaskell;
8 ihaskell = pkgs.ihaskell.override {
9 packages = self: cfg.extraPackages self;
10 };
11
12in
13
14{
15 options = {
16 services.ihaskell = {
17 enable = mkOption {
18 default = false;
19 example = true;
20 description = "Autostart an IHaskell notebook service.";
21 };
22
23 haskellPackages = mkOption {
24 default = pkgs.haskellPackages;
25 defaultText = "pkgs.haskellPackages";
26 example = literalExample "pkgs.haskell.packages.ghc784";
27 description = ''
28 haskellPackages used to build IHaskell and other packages.
29 This can be used to change the GHC version used to build
30 IHaskell and the packages listed in
31 <varname>extraPackages</varname>.
32 '';
33 };
34
35 extraPackages = mkOption {
36 default = self: [];
37 example = literalExample ''
38 haskellPackages: [
39 haskellPackages.wreq
40 haskellPackages.lens
41 ]
42 '';
43 description = ''
44 Extra packages available to ghc when running ihaskell. The
45 value must be a function which receives the attrset defined
46 in <varname>haskellPackages</varname> as the sole argument.
47 '';
48 };
49 };
50 };
51
52 config = mkIf cfg.enable {
53
54 users.extraUsers.ihaskell = {
55 group = config.users.extraGroups.ihaskell.name;
56 description = "IHaskell user";
57 home = "/var/lib/ihaskell";
58 createHome = true;
59 uid = config.ids.uids.ihaskell;
60 };
61
62 users.extraGroups.ihaskell.gid = config.ids.gids.ihaskell;
63
64 systemd.services.ihaskell = {
65 description = "IHaskell notebook instance";
66 wantedBy = [ "multi-user.target" ];
67 after = [ "network.target" ];
68 serviceConfig = {
69 User = config.users.extraUsers.ihaskell.name;
70 Group = config.users.extraGroups.ihaskell.name;
71 ExecStart = "${pkgs.stdenv.shell} -c \"cd $HOME;${ihaskell}/bin/ihaskell-notebook\"";
72 };
73 };
74 };
75}