@@ -1,4 +1,5 @@
1−{-# LANGUAGE Rank2Types #-}
2+{-# LANGUAGE Rank2Types #-}
2{-# LANGUAGE TypeOperators #-}
3{-# LANGUAGE TypeOperators #-}
4-----------------------------------------------------------------------------
5-----------------------------------------------------------------------------
@@ -89,3 +90,20 @@ _Left = prism Left $ either Right (Left . Right)
90_Right :: Prism' (Either c a) a
91_Right :: Prism' (Either c a) a
91_Right = prism Right $ either (Left . Left) Right
92_Right = prism Right $ either (Left . Left) Right
94+--------------------------------------------------------------------------------
96+data Coyoneda f b = forall a. Coyoneda (a -> b) (f a)
98+instance Functor (Coyoneda f) where
99+ fmap f (Coyoneda g fa)
100+ = Coyoneda (f . g) fa
102+inj :: Functor f => Coyoneda f a -> f a
103+inj (Coyoneda f a) = fmap f a
105+proj :: Functor f => f a -> Coyoneda f a
106+proj fa = Coyoneda id fa
108+ravel :: Functor f => ((a -> Coyoneda f b) -> s -> Coyoneda f t) -> (a -> f b) -> (s -> f t)
109+ravel coy f s = inj $ coy (\a -> proj (f a)) s