{-# LANGUAGE TemplateHaskell #-} module Gyehoek.Lift1 ( Lift1(..) , lift1 ) where import Gyehoek.Prelude hiding ((:<)) import Language.Haskell.TH (Quote, Exp, listE) import Language.Haskell.TH.Syntax (Lift (..)) import Control.Comonad.Cofree (Cofree(..)) -- 뻘짓뻘짓뻘짓뻘짓뻘짓 class Lift1 f where liftLift :: Quote m => (a -> m Exp) -> f a -> m Exp lift1 :: (Lift1 f, Lift a, Quote m) => f a -> m Exp lift1 = liftLift lift --- instances instance Lift1 f => Lift1 (Cofree f) where liftLift l (a :< e) = [|(:<) $(l a) $(liftLift (liftLift l) e)|] instance Lift1 List where liftLift l xs = listE $ l <$> xs instance Lift1 NonEmpty where liftLift l (x :| xs) = [|(:|) $(l x) $(liftLift l xs)|]