--
-- Matchers
--

assert "bool's value pattern"
  (match (True, False) as (bool, bool) with
   | #(True, False) -> True
   | _ -> False)

assert "char's value pattern"
  (match 'a' as char with
   | #'a' -> True
   | _ -> False)

assert "integer's value pattern"
  (match 10 as integer with
   | #10 -> True
   | _ -> False)

assert "float's value pattern"
  (match 0.1 as float with
   | #0.1 -> True
   | _ -> False)

--
-- Utility
--
assertEqual "id" (id 1) 1

assertEqual "fst" (fst (1, 2)) 1

assertEqual "snd" (snd (1, 2)) 2

assertEqual "compose" ((compose fst snd) ((1, 2), 3)) 2

assertEqual "eqAs" (eqAs integer 1 1) True

--
-- Booleans
--
assertEqual "and"
  [True && True, True && False, False && True, False && False]
  [True, False, False, False]

assertEqual "or"
  [True || True, True || False, False || True, False || False]
  [True, True, True, False]

assertEqual "not"
  [not True, not False]
  [False, True]

--
-- Unordered-Pair
--

assertEqual "unorderedPair matcher"
  (match (1, 2) as unorderedPair integer with (#2, $x) -> x)
  1
