--------------------------------------------------------------------------------
-- Copyright © 2011 National Institute of Aerospace / Galois, Inc.
--------------------------------------------------------------------------------

{-# LANGUAGE Safe #-}
{-# LANGUAGE GADTs, KindSignatures #-}

module Copilot.Core.Type.Equality
  ( Equal (..)
  , EqualType (..)
  , coerce
  , refl
  , trans
  , symm
  , cong
  ) where

data Equal :: * -> * -> * where
  Refl :: Equal a a

class EqualType t where
  (=~=) :: t a -> t b -> Maybe (Equal a b)

coerce :: Equal a b -> a -> b
coerce Refl x = x

refl :: Equal a a
refl = Refl

symm :: Equal a b -> Equal b a
symm Refl = Refl

trans :: Equal a b -> Equal b c -> Equal a c
trans Refl Refl = Refl

cong :: Equal a b -> Equal (f a) (f b)
cong Refl = Refl