{-# language DataKinds #-} {-# language ExplicitForAll #-} {-# language KindSignatures #-} {-# language MagicHash #-} {-# language TypeOperators #-} {-# language UnboxedTuples #-} module Arithmetic.Equal ( symmetric , plusR , plusL , plusR# , plusL# , lift ) where import Arithmetic.Unsafe (type (:=:)(Eq), type (:=:#)(Eq#)) import GHC.TypeNats (type (+)) symmetric :: (m :=: n) -> (n :=: m) {-# inline symmetric #-} symmetric Eq = Eq plusL :: forall c m n. (m :=: n) -> (c + m :=: c + n) {-# inline plusL #-} plusL Eq = Eq plusR :: forall c m n. (m :=: n) -> (m + c :=: n + c) {-# inline plusR #-} plusR Eq = Eq plusL# :: forall c m n. (m :=:# n) -> (c + m :=:# c + n) {-# inline plusL# #-} plusL# _ = Eq# (# #) plusR# :: forall c m n. (m :=:# n) -> (m + c :=:# n + c) {-# inline plusR# #-} plusR# _ = Eq# (# #) lift :: (m :=:# n) -> (m :=: n) {-# inline lift #-} lift _ = Eq