31 lines
728 B
Haskell
31 lines
728 B
Haskell
{-# 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)|]
|