module Lorentz.Coercions
( Coercible_
, coerce_
, coerceUnwrap
, coerceWrap
, toNamed
, fromNamed
, Wrapped (..)
) where
import Control.Lens (Wrapped(..))
import Data.Vinyl.Derived (Label)
import Named (NamedF)
import Lorentz.Base
import Michelson.Typed
type Coercible_ a b = ToT a ~ ToT b
coerce_ :: Coercible_ a b => a & s :-> b & s
coerce_ = I Nop
coerceWrap
:: Coercible_ newtyp (Unwrapped newtyp)
=> Unwrapped newtyp : s :-> newtyp : s
coerceWrap = coerce_
coerceUnwrap
:: Coercible_ newtyp (Unwrapped newtyp)
=> newtyp : s :-> Unwrapped newtyp : s
coerceUnwrap = coerce_
toNamed :: Label name -> a : s :-> NamedF Identity a name : s
toNamed _ = coerceWrap
fromNamed :: Label name -> NamedF Identity a name : s :-> a : s
fromNamed _ = coerceUnwrap