mirror of
https://github.com/vale981/nix-development-configs
synced 2025-03-04 17:31:40 -05:00
Add haskell-project
This commit is contained in:
parent
8eed91f4cd
commit
3d1f7a9685
7 changed files with 144 additions and 0 deletions
8
haskell-project/Main.hs
Normal file
8
haskell-project/Main.hs
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
module Main where
|
||||||
|
|
||||||
|
import HaskellSay (haskellSay)
|
||||||
|
import ExampleLibrary
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
main = haskellSay $ "If inverted, False is " ++ writeBool (invert False)
|
||||||
|
|
16
haskell-project/README.md
Normal file
16
haskell-project/README.md
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
**Nix flake for an example haskell package**
|
||||||
|
|
||||||
|
To get started:
|
||||||
|
- In the `package.yaml`, set any names beginning with `example` to your chosen name - for example, change the `name` setting on the first line from `example-package` to the nameof your new package.
|
||||||
|
- Run `hpack` from the terminal; this will generate a cabal file for your project.
|
||||||
|
- Run `cabal test` or `cabal run ${executable-name}`, where `${executable-name}` is the name of your executable, defined under `executables` in the `package.yaml`.
|
||||||
|
|
||||||
|
**Overview of what's here**
|
||||||
|
This flake has a simple executable, a library that that executable depends on, and a test suite which tests the library.
|
||||||
|
|
||||||
|
It uses cabal to build, hpack as the format for the cabal project specification, and hspec to run tests.
|
||||||
|
|
||||||
|
Remember to run hpack after any changes to the `package.yaml`, in order to re-create the `${project-name}.cabal` file, as well as the first time you try to use this.
|
||||||
|
|
||||||
|
The executable can be run via cabal using `cabal run example-executable`, whereas tests can be run via `cabal test`.
|
||||||
|
|
40
haskell-project/flake.lock
generated
Normal file
40
haskell-project/flake.lock
generated
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"flake-utils": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1659877975,
|
||||||
|
"narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1628427351,
|
||||||
|
"narHash": "sha256-WuZUIQ07AvRw+T9wvQ3qFf8MXmKZ+ktZz9drNgWXDbs=",
|
||||||
|
"path": "/nix/store/aqinic6h77nrsrzwdsq2mxihw0kd87ml-source",
|
||||||
|
"rev": "348bc5de8bca09c624f5c4975f538684da4713d2",
|
||||||
|
"type": "path"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"id": "nixpkgs",
|
||||||
|
"type": "indirect"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-utils": "flake-utils",
|
||||||
|
"nixpkgs": "nixpkgs"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
36
haskell-project/flake.nix
Normal file
36
haskell-project/flake.nix
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
{
|
||||||
|
description = "Example haskell package with library, executable and tests";
|
||||||
|
inputs = {
|
||||||
|
nixpkgs.url = "nixpkgs";
|
||||||
|
flake-utils.url = github:numtide/flake-utils;
|
||||||
|
};
|
||||||
|
outputs = { self, nixpkgs, flake-utils }:
|
||||||
|
flake-utils.lib.eachDefaultSystem (system:
|
||||||
|
let
|
||||||
|
overlay = (final: prev: {
|
||||||
|
inherit example-package;
|
||||||
|
});
|
||||||
|
pkgs = import nixpkgs {
|
||||||
|
inherit system;
|
||||||
|
overlays = [ overlay ];
|
||||||
|
};
|
||||||
|
example-package = pkgs.haskellPackages.callCabal2nix "example-package" ./. {};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
packages = { inherit example-package; };
|
||||||
|
defaultPackage = example-package;
|
||||||
|
devShell = pkgs.haskellPackages.shellFor {
|
||||||
|
name = "example-package";
|
||||||
|
packages = p: [ example-package ];
|
||||||
|
withHoogle = true;
|
||||||
|
buildInputs = with pkgs; with pkgs.haskellPackages; [
|
||||||
|
haskell-language-server
|
||||||
|
ghcid
|
||||||
|
cabal-install
|
||||||
|
hpack
|
||||||
|
];
|
||||||
|
shellHook = "command -v fish &> /dev/null && fish";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
26
haskell-project/package.yaml
Normal file
26
haskell-project/package.yaml
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
name: example-package
|
||||||
|
|
||||||
|
dependencies:
|
||||||
|
- base == 4.*
|
||||||
|
- haskell-say
|
||||||
|
|
||||||
|
library:
|
||||||
|
source-dirs: src
|
||||||
|
exposed-modules: ExampleLibrary
|
||||||
|
|
||||||
|
executables:
|
||||||
|
example-executable:
|
||||||
|
main: Main.hs
|
||||||
|
dependencies:
|
||||||
|
- example-package
|
||||||
|
|
||||||
|
tests:
|
||||||
|
spec:
|
||||||
|
main: Spec.hs
|
||||||
|
source-dirs:
|
||||||
|
- test
|
||||||
|
- src
|
||||||
|
dependencies:
|
||||||
|
- hspec == 2.*
|
||||||
|
- HUnit >= 1.6.0.0
|
||||||
|
build-tools: hspec-discover
|
9
haskell-project/src/ExampleLibrary.hs
Normal file
9
haskell-project/src/ExampleLibrary.hs
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
module ExampleLibrary where
|
||||||
|
|
||||||
|
invert :: Bool -> Bool
|
||||||
|
invert True = False
|
||||||
|
invert False = True
|
||||||
|
|
||||||
|
writeBool :: Bool -> String
|
||||||
|
writeBool True = "True"
|
||||||
|
writeBool False = "False"
|
9
haskell-project/test/Spec.hs
Normal file
9
haskell-project/test/Spec.hs
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
import Test.Hspec
|
||||||
|
import ExampleLibrary(invert)
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
main = hspec $ do
|
||||||
|
describe "test simple functions" $ do
|
||||||
|
it "ensures invert True is False" $ do
|
||||||
|
invert True `shouldBe` False
|
||||||
|
|
Loading…
Add table
Reference in a new issue