{-# LANGUAGE ExplicitForAll #-} module Witch.Lift where import qualified Data.Typeable as Typeable import qualified Language.Haskell.TH.Syntax as TH import qualified Witch.TryFrom as TryFrom import qualified Witch.Utility as Utility -- | This is like 'Utility.unsafeFrom' except that it works at compile time -- rather than runtime. -- -- > -- Avoid this: -- > unsafeFrom @s "some literal" -- > -- > -- Prefer this: -- > $$(liftedFrom @s "some literal") liftedFrom :: forall source target m. ( TryFrom.TryFrom source target, TH.Lift target, Show source, Typeable.Typeable source, Typeable.Typeable target, TH.Quote m ) => source -> TH.Code m target liftedFrom = TH.liftTyped . Utility.unsafeFrom -- | This is like 'Utility.unsafeInto' except that it works at compile time -- rather than runtime. -- -- > -- Avoid this: -- > unsafeInto @t "some literal" -- > -- > -- Prefer this: -- > $$(liftedInto @t "some literal") liftedInto :: forall target source m. ( TryFrom.TryFrom source target, TH.Lift target, Show source, Typeable.Typeable source, Typeable.Typeable target, TH.Quote m ) => source -> TH.Code m target liftedInto = liftedFrom