blob: ab509bc85fa519ee627838516ce324672b884da2 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
with builtins;
rec {
fold = op: nul: list:
if list == [ ]
then nul
else op (head list) (fold op nul (tail list));
concat =
fold (x: y: x + y) "";
and = fold (x: y: x && y) true;
flatten = x:
if isList x
then fold (x: y: (flatten x) ++ y) [ ] x
else [ x ];
sum = foldl' (x: y: add x y) 0;
hasSuffix = ext: fileName:
let
lenFileName = stringLength fileName;
lenExt = stringLength ext;
in
!(lessThan lenFileName lenExt) &&
substring (sub lenFileName lenExt) lenFileName fileName == ext;
# Split a list at the given position.
splitAt = pos: list:
if pos == 0 then { first = [ ]; second = list; } else
if list == [ ] then { first = [ ]; second = [ ]; } else
let res = splitAt (sub pos 1) (tail list);
in { first = [ (head list) ] ++ res.first; second = res.second; };
# Stable merge sort.
sortBy = comp: list:
if lessThan 1 (length list)
then
let
split = splitAt (div (length list) 2) list;
first = sortBy comp split.first;
second = sortBy comp split.second;
in
mergeLists comp first second
else list;
mergeLists = comp: list1: list2:
if list1 == [ ] then list2 else
if list2 == [ ] then list1 else
if comp (head list2) (head list1) then [ (head list2) ] ++ mergeLists comp list1 (tail list2) else
[ (head list1) ] ++ mergeLists comp (tail list1) list2;
id = x: x;
const = x: y: x;
range = first: last:
if first > last
then [ ]
else genList (n: first + n) (last - first + 1);
}
|