mirror of
https://github.com/mrkkrp/megaparsec.git
synced 2024-11-23 10:23:39 +03:00
f8ef95c025
The methods ‘failure’ and ‘fancyFailure’ of ‘MonadParsec’ are now ordinary functions and live in ‘Text.Megaparsec’. They are defined in terms of the new ‘parseError’ method of ‘MonadParsec’. This method allows us to signal parse errors at a given offset without manipulating parser state manually.
140 lines
3.4 KiB
Nix
140 lines
3.4 KiB
Nix
{ pkgs ? (import ./nix/nixpkgs)
|
||
, ghc ? "ghc865"
|
||
}:
|
||
|
||
let
|
||
|
||
megaparsecSource = pkgs.lib.sourceByRegex ./. [
|
||
"^CHANGELOG\.md$"
|
||
"^LICENSE\.md$"
|
||
"^README\.md$"
|
||
"^Text.*$"
|
||
"^bench.*$"
|
||
"^megaparsec\.cabal$"
|
||
];
|
||
|
||
megaparsecTestsSource = pkgs.lib.sourceByRegex ./megaparsec-tests [
|
||
"^LICENSE\.md$"
|
||
"^README\.md$"
|
||
"^megaparsec-tests\.cabal$"
|
||
"^src.*$"
|
||
"^tests.*$"
|
||
];
|
||
|
||
parsersBenchSource = pkgs.lib.sourceByRegex ./parsers-bench [
|
||
"^README\.md$"
|
||
"^parsers-bench\.cabal$"
|
||
"^ParsersBench.*$"
|
||
"^bench.*$"
|
||
"^data.*$"
|
||
];
|
||
|
||
doBenchmark = p:
|
||
let targets = ["bench-speed" "bench-memory"];
|
||
copying = pkgs.lib.concatMapStrings
|
||
(t: "cp dist/build/${t}/${t} $out/bench/\n")
|
||
targets;
|
||
in pkgs.haskell.lib.doBenchmark
|
||
(p.overrideAttrs (drv: {
|
||
postInstall = ''
|
||
mkdir -p $out/bench
|
||
if test -d data/
|
||
then
|
||
mkdir -p $out/bench/data
|
||
cp data/* $out/bench/data/
|
||
fi
|
||
${copying}
|
||
'';
|
||
}));
|
||
|
||
megaparsecOverlay = self: super: {
|
||
"megaparsec" = doBenchmark
|
||
(super.callCabal2nix "megaparsec" megaparsecSource { });
|
||
"megaparsec-tests" =
|
||
super.callCabal2nix "megaparsec-tests" megaparsecTestsSource { };
|
||
# The ‘parser-combinators-tests’ package is a bit special because it
|
||
# does not contain an executable nor a library, so its install phase
|
||
# normally fails. We want to build it and run the tests anyway, so we
|
||
# have to do these manipulations.
|
||
"parser-combinators-tests" = pkgs.haskell.lib.dontHaddock
|
||
(super.parser-combinators-tests.overrideAttrs (drv: {
|
||
installPhase = "mkdir $out";
|
||
broken = false;
|
||
}));
|
||
"modern-uri" = doBenchmark super.modern-uri;
|
||
"mmark" = doBenchmark super.mmark;
|
||
"parsers-bench" = doBenchmark
|
||
(super.callCabal2nix "parsers-bench" parsersBenchSource { });
|
||
};
|
||
|
||
updatedPkgs = pkgs // {
|
||
haskell = pkgs.haskell // {
|
||
packages = pkgs.haskell.packages // {
|
||
"${ghc}" = pkgs.haskell.packages.${ghc}.override {
|
||
overrides = megaparsecOverlay;
|
||
};
|
||
};
|
||
};
|
||
};
|
||
|
||
haskellPackages = updatedPkgs.haskell.packages.${ghc};
|
||
|
||
patch = p: patch:
|
||
pkgs.haskell.lib.appendPatch p patch;
|
||
|
||
in {
|
||
# Base: Megaparsec and its unit tests:
|
||
base = pkgs.recurseIntoAttrs {
|
||
inherit (haskellPackages)
|
||
hspec-megaparsec
|
||
megaparsec
|
||
megaparsec-tests
|
||
parser-combinators-tests;
|
||
};
|
||
|
||
# Dependent packages of interest:
|
||
deps = pkgs.recurseIntoAttrs {
|
||
inherit (haskellPackages)
|
||
cachix
|
||
cassava-megaparsec
|
||
cue-sheet
|
||
hledger
|
||
hnix
|
||
language-puppet
|
||
mmark
|
||
modern-uri
|
||
replace-megaparsec
|
||
stache
|
||
tomland;
|
||
dhall = patch haskellPackages.dhall ./nix/patches/dhall.patch;
|
||
idris = patch haskellPackages.idris ./nix/patches/idris.patch;
|
||
};
|
||
|
||
# Benchmarks:
|
||
benches = pkgs.recurseIntoAttrs {
|
||
inherit (haskellPackages)
|
||
megaparsec
|
||
mmark
|
||
modern-uri
|
||
parsers-bench;
|
||
};
|
||
|
||
# For development:
|
||
shell = haskellPackages.shellFor {
|
||
packages = ps: [
|
||
ps.megaparsec
|
||
ps.megaparsec-tests
|
||
];
|
||
buildInputs = with haskellPackages; [
|
||
cabal-install
|
||
ghcid
|
||
];
|
||
};
|
||
|
||
# Distribution tarballs:
|
||
dist = with pkgs.haskell.lib; pkgs.recurseIntoAttrs {
|
||
megaparsec = sdistTarball haskellPackages.megaparsec;
|
||
megaparsec-tests = sdistTarball haskellPackages.megaparsec-tests;
|
||
};
|
||
}
|