proton-0.0.1: src/Data/Profunctor/Reflector.hs
{-# LANGUAGE ScopedTypeVariables #-}
module Data.Profunctor.Reflector where
import Data.Tagged
import Data.Profunctor
import Data.Profunctor.MStrong
import Data.Distributive
class MStrong p => Reflector p where
reflected :: Applicative f => p a b -> p (f a) (f b)
instance Reflector (->) where
reflected = fmap
instance Traversable f => Reflector (Costar f) where
reflected (Costar f) = Costar (fmap f . sequenceA)
instance Reflector Tagged where
reflected (Tagged b) = Tagged (pure b)
instance Distributive f => Reflector (Star f) where
reflected (Star f) = Star (collect f)
-- instance (MStrong p, Corepresentable p, Traversable f, Corep p ~ f) => Reflector p where
-- reflected p = cotabulate . go $ cosieve p
-- where
-- go :: forall g a b. Applicative g => (f a -> b) -> f (g a) -> (g b)
-- go f fga = f <$> sequenceA fga