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 description = "Autostart an IHaskell notebook service.";
20 };
21
22 extraPackages = mkOption {
23 default = self: [];
24 example = literalExample ''
25 haskellPackages: [
26 haskellPackages.wreq
27 haskellPackages.lens
28 ]
29 '';
30 description = ''
31 Extra packages available to ghc when running ihaskell. The
32 value must be a function which receives the attrset defined
33 in <varname>haskellPackages</varname> as the sole argument.
34 '';
35 };
36 };
37 };
38
39 config = mkIf cfg.enable {
40
41 users.extraUsers.ihaskell = {
42 group = config.users.extraGroups.ihaskell.name;
43 description = "IHaskell user";
44 home = "/var/lib/ihaskell";
45 createHome = true;
46 uid = config.ids.uids.ihaskell;
47 };
48
49 users.extraGroups.ihaskell.gid = config.ids.gids.ihaskell;
50
51 systemd.services.ihaskell = {
52 description = "IHaskell notebook instance";
53 wantedBy = [ "multi-user.target" ];
54 after = [ "network.target" ];
55 serviceConfig = {
56 User = config.users.extraUsers.ihaskell.name;
57 Group = config.users.extraGroups.ihaskell.name;
58 ExecStart = "${pkgs.stdenv.shell} -c \"cd $HOME;${ihaskell}/bin/ihaskell-notebook\"";
59 };
60 };
61 };
62}