{-# 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. ( TryFrom.TryFrom source target, TH.Lift target, Show source, Typeable.Typeable source, Typeable.Typeable target ) => source -> TH.Q (TH.TExp 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. ( TryFrom.TryFrom source target, TH.Lift target, Show source, Typeable.Typeable source, Typeable.Typeable target ) => source -> TH.Q (TH.TExp target) liftedInto = liftedFrom