···1{ lib }:
23-let
4- inherit (lib)
5- all
6- concatStringsSep
7- findFirst
8- flip
9- getAttr
10- head
11- isFunction
12- length
13- recursiveUpdate
14- splitVersion
15- tail
16- take
17- versionAtLeast
18- versionOlder
19- zipListsWith
20- ;
21-in
22-recursiveUpdate lib (rec {
23-24- versions =
25- let
26- truncate = n: v: concatStringsSep "." (take n (splitVersion v));
27- opTruncate =
28- op: v0: v:
29- let
30- n = length (splitVersion v0);
31- in
32- op (truncate n v) (truncate n v0);
33- in
34- rec {
35-36- /*
37- Get string of the first n parts of a version string.
38-39- Example:
40- - truncate 2 "1.2.3-stuff"
41- => "1.2"
42-43- - truncate 4 "1.2.3-stuff"
44- => "1.2.3.stuff"
45- */
46-47- inherit truncate;
48-49- /*
50- Get string of the first three parts (major, minor and patch)
51- of a version string.
52-53- Example:
54- majorMinorPatch "1.2.3-stuff"
55- => "1.2.3"
56- */
57- majorMinorPatch = truncate 3;
58-59- /*
60- Version comparison predicates,
61- - isGe v0 v <-> v is greater or equal than v0 [*]
62- - isLe v0 v <-> v is lesser or equal than v0 [*]
63- - isGt v0 v <-> v is strictly greater than v0 [*]
64- - isLt v0 v <-> v is strictly lesser than v0 [*]
65- - isEq v0 v <-> v is equal to v0 [*]
66- - range low high v <-> v is between low and high [**]
67-68- [*] truncating v to the same number of digits as v0
69- [**] truncating v to low for the lower bound and high for the upper bound
70-71- Examples:
72- - isGe "8.10" "8.10.1"
73- => true
74- - isLe "8.10" "8.10.1"
75- => true
76- - isGt "8.10" "8.10.1"
77- => false
78- - isGt "8.10.0" "8.10.1"
79- => true
80- - isEq "8.10" "8.10.1"
81- => true
82- - range "8.10" "8.11" "8.11.1"
83- => true
84- - range "8.10" "8.11+" "8.11.0"
85- => false
86- - range "8.10" "8.11+" "8.11+beta1"
87- => false
88- */
89- isGe = opTruncate versionAtLeast;
90- isGt = opTruncate (flip versionOlder);
91- isLe = opTruncate (flip versionAtLeast);
92- isLt = opTruncate versionOlder;
93- isEq = opTruncate pred.equal;
94- range = low: high: pred.inter (versions.isGe low) (versions.isLe high);
95- };
96-97- /*
98- Returns a list of list, splitting it using a predicate.
99- This is analogous to builtins.split sep list,
100- with a predicate as a separator and a list instead of a string.
101-102- Type: splitList :: (a -> bool) -> [a] -> [[a]]
103-104- Example:
105- splitList (x: x == "x") [ "y" "x" "z" "t" ]
106- => [ [ "y" ] "x" [ "z" "t" ] ]
107- */
108- splitList =
109- pred: l: # put in file lists
110- let
111- loop = (
112- vv: v: l:
113- if l == [ ] then
114- vv ++ [ v ]
115- else
116- let
117- hd = head l;
118- tl = tail l;
119- in
120- if pred hd then
121- loop (
122- vv
123- ++ [
124- v
125- hd
126- ]
127- ) [ ] tl
128- else
129- loop vv (v ++ [ hd ]) tl
130- );
131- in
132- loop [ ] [ ] l;
133-134- pred = {
135- # Predicate intersection, union, and complement
136- inter =
137- p: q: x:
138- p x && q x;
139- union =
140- p: q: x:
141- p x || q x;
142- compl = p: x: !p x;
143- true = p: true;
144- false = p: false;
145-146- # predicate "being equal to y"
147- equal = y: x: x == y;
148- };
149-150- /*
151- Emulate a "switch - case" construct,
152- instead of relying on `if then else if ...`
153- */
154- /*
155- Usage:
156- ```nix
157- switch-if [
158- if-clause-1
159- ..
160- if-clause-k
161- ] default-out
162- ```
163- where a if-clause has the form `{ cond = b; out = r; }`
164- the first branch such as `b` is true
165- */
166-167- switch-if = c: d: (findFirst (getAttr "cond") { } c).out or d;
168-169- /*
170- Usage:
171- ```nix
172- switch x [
173- simple-clause-1
174- ..
175- simple-clause-k
176- ] default-out
177- ```
178- where a simple-clause has the form `{ case = p; out = r; }`
179- the first branch such as `p x` is true
180- or
181- ```nix
182- switch [ x1 .. xn ] [
183- complex-clause-1
184- ..
185- complex-clause-k
186- ] default-out
187- ```
188- where a complex-clause is either a simple-clause
189- or has the form { cases = [ p1 .. pn ]; out = r; }
190- in which case the first branch such as all `pi x` are true
191-192- if the variables p are not functions,
193- they are converted to a equal p
194- if out is missing the default-out is taken
195- */
196-197- switch =
198- var: clauses: default:
199- with pred;
200- let
201- compare = f: if isFunction f then f else equal f;
202- combine =
203- cl: var:
204- if cl ? case then compare cl.case var else all (equal true) (zipListsWith compare cl.cases var);
205- in
206- switch-if (map (cl: {
207- cond = combine cl var;
208- inherit (cl) out;
209- }) clauses) default;
210211 /*
212 Override arguments to mkCoqDerivation for a Coq library.
···1{ lib }:
23+lib.recursiveUpdate lib (
4+ import ../rocq/extra-lib-common.nix { inherit lib; } // {
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000056 /*
7 Override arguments to mkCoqDerivation for a Coq library.
···1+{ lib }:
2+3+let
4+ inherit (lib)
5+ all
6+ concatStringsSep
7+ findFirst
8+ flip
9+ getAttr
10+ head
11+ isFunction
12+ length
13+ recursiveUpdate
14+ splitVersion
15+ tail
16+ take
17+ versionAtLeast
18+ versionOlder
19+ zipListsWith
20+ ;
21+in
22+rec {
23+24+ versions =
25+ let
26+ truncate = n: v: concatStringsSep "." (take n (splitVersion v));
27+ opTruncate =
28+ op: v0: v:
29+ let
30+ n = length (splitVersion v0);
31+ in
32+ op (truncate n v) (truncate n v0);
33+ in
34+ rec {
35+36+ /*
37+ Get string of the first n parts of a version string.
38+39+ Example:
40+ - truncate 2 "1.2.3-stuff"
41+ => "1.2"
42+43+ - truncate 4 "1.2.3-stuff"
44+ => "1.2.3.stuff"
45+ */
46+47+ inherit truncate;
48+49+ /*
50+ Get string of the first three parts (major, minor and patch)
51+ of a version string.
52+53+ Example:
54+ majorMinorPatch "1.2.3-stuff"
55+ => "1.2.3"
56+ */
57+ majorMinorPatch = truncate 3;
58+59+ /*
60+ Version comparison predicates,
61+ - isGe v0 v <-> v is greater or equal than v0 [*]
62+ - isLe v0 v <-> v is lesser or equal than v0 [*]
63+ - isGt v0 v <-> v is strictly greater than v0 [*]
64+ - isLt v0 v <-> v is strictly lesser than v0 [*]
65+ - isEq v0 v <-> v is equal to v0 [*]
66+ - range low high v <-> v is between low and high [**]
67+68+ [*] truncating v to the same number of digits as v0
69+ [**] truncating v to low for the lower bound and high for the upper bound
70+71+ Examples:
72+ - isGe "8.10" "8.10.1"
73+ => true
74+ - isLe "8.10" "8.10.1"
75+ => true
76+ - isGt "8.10" "8.10.1"
77+ => false
78+ - isGt "8.10.0" "8.10.1"
79+ => true
80+ - isEq "8.10" "8.10.1"
81+ => true
82+ - range "8.10" "8.11" "8.11.1"
83+ => true
84+ - range "8.10" "8.11+" "8.11.0"
85+ => false
86+ - range "8.10" "8.11+" "8.11+beta1"
87+ => false
88+ */
89+ isGe = opTruncate versionAtLeast;
90+ isGt = opTruncate (flip versionOlder);
91+ isLe = opTruncate (flip versionAtLeast);
92+ isLt = opTruncate versionOlder;
93+ isEq = opTruncate pred.equal;
94+ range = low: high: pred.inter (versions.isGe low) (versions.isLe high);
95+ };
96+97+ /*
98+ Returns a list of list, splitting it using a predicate.
99+ This is analogous to builtins.split sep list,
100+ with a predicate as a separator and a list instead of a string.
101+102+ Type: splitList :: (a -> bool) -> [a] -> [[a]]
103+104+ Example:
105+ splitList (x: x == "x") [ "y" "x" "z" "t" ]
106+ => [ [ "y" ] "x" [ "z" "t" ] ]
107+ */
108+ splitList =
109+ pred: l: # put in file lists
110+ let
111+ loop = (
112+ vv: v: l:
113+ if l == [ ] then
114+ vv ++ [ v ]
115+ else
116+ let
117+ hd = head l;
118+ tl = tail l;
119+ in
120+ if pred hd then
121+ loop (
122+ vv
123+ ++ [
124+ v
125+ hd
126+ ]
127+ ) [ ] tl
128+ else
129+ loop vv (v ++ [ hd ]) tl
130+ );
131+ in
132+ loop [ ] [ ] l;
133+134+ pred = {
135+ # Predicate intersection, union, and complement
136+ inter =
137+ p: q: x:
138+ p x && q x;
139+ union =
140+ p: q: x:
141+ p x || q x;
142+ compl = p: x: !p x;
143+ true = p: true;
144+ false = p: false;
145+146+ # predicate "being equal to y"
147+ equal = y: x: x == y;
148+ };
149+150+ /*
151+ Emulate a "switch - case" construct,
152+ instead of relying on `if then else if ...`
153+ */
154+ /*
155+ Usage:
156+ ```nix
157+ switch-if [
158+ if-clause-1
159+ ..
160+ if-clause-k
161+ ] default-out
162+ ```
163+ where a if-clause has the form `{ cond = b; out = r; }`
164+ the first branch such as `b` is true
165+ */
166+167+ switch-if = c: d: (findFirst (getAttr "cond") { } c).out or d;
168+169+ /*
170+ Usage:
171+ ```nix
172+ switch x [
173+ simple-clause-1
174+ ..
175+ simple-clause-k
176+ ] default-out
177+ ```
178+ where a simple-clause has the form `{ case = p; out = r; }`
179+ the first branch such as `p x` is true
180+ or
181+ ```nix
182+ switch [ x1 .. xn ] [
183+ complex-clause-1
184+ ..
185+ complex-clause-k
186+ ] default-out
187+ ```
188+ where a complex-clause is either a simple-clause
189+ or has the form { cases = [ p1 .. pn ]; out = r; }
190+ in which case the first branch such as all `pi x` are true
191+192+ if the variables p are not functions,
193+ they are converted to a equal p
194+ if out is missing the default-out is taken
195+ */
196+197+ switch =
198+ var: clauses: default:
199+ with pred;
200+ let
201+ compare = f: if isFunction f then f else equal f;
202+ combine =
203+ cl: var:
204+ if cl ? case then compare cl.case var else all (equal true) (zipListsWith compare cl.cases var);
205+ in
206+ switch-if (map (cl: {
207+ cond = combine cl var;
208+ inherit (cl) out;
209+ }) clauses) default;
210+}
···1+{ lib }:
2+3+lib.recursiveUpdate lib (
4+ import ./extra-lib-common.nix { inherit lib; } // {
5+6+ /*
7+ Override arguments to mkRocqDerivation for a Rocq library.
8+9+ This function allows you to easily override arguments to mkRocqDerivation,
10+ even when they are not exposed by the Rocq library directly.
11+12+ Type: overrideRocqDerivation :: AttrSet -> RocqLibraryDerivation -> RocqLibraryDerivation
13+14+ Example:
15+16+ ```nix
17+ rocqPackages.lib.overrideRocqDerivation
18+ {
19+ defaultVersion = "9999";
20+ release."9999".hash = "sha256-fDoP11rtrIM7+OLdMisv2EF7n/IbGuwFxHiPtg3qCNM=";
21+ }
22+ rocqPackages.QuickChick;
23+ ```
24+25+ This example overrides the `defaultVersion` and `release` arguments that
26+ are passed to `mkRocqDerivation` in the QuickChick derivation.
27+28+ Note that there is a difference between using `.override` on a Rocq
29+ library vs this `overrideRocqDerivation` function. `.override` allows you
30+ to modify arguments to the derivation itself, for instance by passing
31+ different versions of dependencies:
32+33+ ```nix
34+ rocqPackages.QuickChick.override { ssreflect = my-cool-ssreflect; }
35+ ```
36+37+ whereas `overrideRocqDerivation` allows you to override arguments to the
38+ call to `mkRocqDerivation` in the Rocq library.
39+40+ Note that all Rocq libraries in Nixpkgs have a `version` argument for
41+ easily using a different version. So if all you want to do is use a
42+ different version, and the derivation for the Rocq library already has
43+ support for the version you want, you likely only need to update the
44+ `version` argument on the library derivation. This is done with
45+ `.override`:
46+47+ ```nix
48+ rocqPackages.QuickChick.override { version = "1.4.0"; }
49+ ```
50+ */
51+ overrideRocqDerivation =
52+ f: drv:
53+ (drv.override (args: {
54+ mkRocqDerivation = drv_: (args.mkRocqDerivation drv_).override f;
55+ }));
56+})