ribosome-app-0.9.9.9: lib/Ribosome/App/Templates/Hpack.hs
module Ribosome.App.Templates.Hpack where
import Exon (exon)
import Ribosome.App.Data (
Author (Author),
Github (Github),
GithubOrg (GithubOrg),
GithubRepo (GithubRepo),
Maintainer (Maintainer),
ProjectName (ProjectName),
Year (Year),
)
githubField ::
Github ->
Text
githubField (Github (GithubOrg org) (GithubRepo repo)) =
[exon|github = "#{repo}/#{org}";|]
hpackNix ::
ProjectName ->
Author ->
Maintainer ->
Year ->
Maybe Github ->
Text
hpackNix (ProjectName name) (Author author) (Maintainer maintainer) (Year year) github =
[exon|{ config, lib, ... }:
with builtins;
with lib;
let
mergeAttr = a: b:
if isAttrs a
then merge a b
else if isList a
then a ++ b
else b;
merge = l: r:
let
f = name:
if hasAttr name l && hasAttr name r
then mergeAttr l.${name} r.${name}
else l.${name} or r.${name};
in genAttrs (concatMap attrNames [l r]) f;
paths = name: {
when = {
condition = false;
generated-other-modules = ["Paths_${replaceStrings ["-"] ["_"] name}"];
};
};
meta = {
version = "0.1.0.0";
license = "BSD-2-Clause-Patent";
license-file = "LICENSE";
author = "#{author}";
maintainer = "#{maintainer}";
copyright = "#{show year} #{author}";
category = "Neovim";
build-type = "Simple";
#{foldMap (githubField) github}
};
base = {
name = "base";
version = ">= 4 && < 5";
mixin = "hiding (Prelude)";
};
options.ghc-options = [
"-Wall"
"-Wredundant-constraints"
"-Wincomplete-uni-patterns"
"-Wmissing-deriving-strategies"
"-Widentities"
"-Wunused-packages"
"-fplugin=Polysemy.Plugin"
];
dependencies = [
{ name = "base"; version = ">= 4.12 && < 5"; mixin = "hiding (Prelude)"; }
{ name = "prelate"; version = ">= 0.1"; mixin = ["(Prelate as Prelude)" "hiding (Prelate)"]; }
"polysemy"
"polysemy-plugin"
];
project = name: merge (meta // options) {
inherit name;
library = paths name // {
source-dirs = "lib";
inherit dependencies;
};
default-extensions = config.ghci.extensions;
};
exe = name: dir: merge (paths name // {
main = "Main.hs";
source-dirs = dir;
inherit dependencies;
ghc-options = [
"-threaded"
"-rtsopts"
"-with-rtsopts=-N"
];
});
in {
#{name} = merge (project "#{name}") {
synopsis = "A Neovim Plugin";
description = "See https://hackage.haskell.org/package/#{name}/docs/#{name}.html";
library.dependencies = [
"ribosome"
"ribosome-host"
"ribosome-menu"
];
executables.#{name} = exe "#{name}" "app" {
dependencies = ["#{name}"];
};
tests.#{name}-unit = exe "#{name}" "test" {
dependencies = [
"#{name}"
"polysemy-test"
"ribosome"
"ribosome-host"
"ribosome-host-test"
"ribosome-test"
"tasty"
];
};
};
}
|]