--
--
-- Base
--
--

eq :=
  matcher
    | #$val as () with
      | $tgt -> if val = tgt then [()] else []
    | $ as (something) with
      | $tgt -> [tgt]

bool := eq
char := eq
integer := eq
float := eq

--
-- Utility
--

id := 1#%1

fst := 2#%1

snd := 2#%2

apply f x := f x

compose f g := \x -> g (f x)

flip fn := \$x $y -> fn y x

eqAs a x y :=
  match x as a with
    | #y -> True
    | _ -> False

--
-- Boolean
--

(&&) b1 b2 := if b1 then b2 else False
(||) b1 b2 := if b1 then True else b2

not b :=
  match b as bool with
    | #True -> False
    | #False -> True

--
-- Unordered Pair
--

unorderedPair m :=
  matcher
    | ($, $) as (m, m) with
      | ($x, $y) -> [(x, y), (y, x)]
    | $ as (eq) with
      | $tgt -> [tgt]
