# 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)
]
