(: If (-> Bool Atom Atom))
(= (If True $then) $then)
(= (If False $then) (let $x 0 (let $x 1 $x)))

(: If (-> Bool Atom Atom Atom))
(= (If $cond $then $else) (if $cond $then $else))


!(assertEqual (hyperpose (1 2)) (superpose (1 2)))

!(assertEqual (hyperpose (1 (If (== 1 2) 1)))
  (superpose  (1 (If (== 1 2) 1))))

!(assertEqual (hyperpose ((If (== 1 2) 1) 1))
  (superpose  ((If (== 1 2) 1) 1)))

!(assertEqual (hyperpose (1 2 3))
  (superpose  (1 2 3)))

!(assertEqual (hyperpose ((If (== 1 2) 1) 2 3))
  (superpose  ((If (== 1 2) 1) 2 3)))

!(assertEqual (hyperpose (1 (If (== 1 2) 1) 3))
  (superpose  (1 (If (== 1 2) 1) 3)))

!(assertEqual (hyperpose (1 2 (If (== 1 2) 1)))
  (superpose  (1 2 (If (== 1 2) 1))))

!(assertEqual (hyperpose (1 (If (== 1 2) 1) (If (== 1 2) 1)))
  (superpose  (1 (If (== 1 2) 1) (If (== 1 2) 1))))

!(assertEqual (hyperpose (1 2 3 4))
  (superpose  (1 2 3 4)))

!(assertEqual (hyperpose ((1 2) (3 4)))
  (superpose  ((1 2) (3 4))))