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