about summary refs log tree commit diff
path: root/tvix/eval/src/tests/tvix_tests/eval-okay-value-pointer-equality.nix
blob: 206881d7d9c237e2be6281535898d3e9baf1addd (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
# For an explanation of this behavior see //tvix/docs/value-pointer-equality.md
let
  # Some incomparable values
  f = MC: "Boing";
  t = [ (throw "is a little blue man") ];
  a = { "with" = abort "headphones and a big smile."; };

  # Aliases
  f' = f;
  t' = t;
  a' = a;

  peq1 = a: b: [ a ] == [ b ];
  peq2 = a: b: { x = a; } == { x = b; };
in

[
  # pointer equality of functions
  (peq1 f f)
  (peq2 f f)
  (peq1 f f')
  (peq2 f f')

  # encapsulation is necessary for pointer equality
  (f == f)
  (f == f')
  # works with !=
  ([ f ] != [ f' ])

  # thunks that fail to evaluated wrapped in sets/lists
  (peq1 t t)
  (peq2 t t)
  (peq1 a a)
  (peq2 a a)
  (peq1 t t')
  (peq2 t t')
  (peq1 a' a)
  (peq2 a' a)

  # function equality with builtins.elem
  (builtins.elem f [ 21 f 42 ])

  # pointer inequality
  (peq1 f (x: x))
  (peq2 (x: x) f)
]