about summary refs log tree commit diff
path: root/tvix/eval/src/tests/tvix_tests/lib.nix
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);

}