{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE Trustworthy #-}
module Data.Profunctor.Sieve
( Sieve(..)
, Cosieve(..)
) where
import Control.Applicative
import Control.Arrow
import Control.Comonad
import Data.Functor.Identity
import Data.Profunctor
import Data.Proxy
import Data.Tagged
class (Profunctor p, Functor f) => Sieve p f | p -> f where
sieve :: p a b -> a -> f b
instance Sieve (->) Identity where
sieve :: forall a b. (a -> b) -> a -> Identity b
sieve a -> b
f = b -> Identity b
forall a. a -> Identity a
Identity (b -> Identity b) -> (a -> b) -> a -> Identity b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> b
f
{-# INLINE sieve #-}
instance (Monad m, Functor m) => Sieve (Kleisli m) m where
sieve :: forall a b. Kleisli m a b -> a -> m b
sieve = Kleisli m a b -> a -> m b
forall (m :: * -> *) a b. Kleisli m a b -> a -> m b
runKleisli
{-# INLINE sieve #-}
instance Functor f => Sieve (Star f) f where
sieve :: forall a b. Star f a b -> a -> f b
sieve = Star f a b -> a -> f b
forall {k} (f :: k -> *) d (c :: k). Star f d c -> d -> f c
runStar
{-# INLINE sieve #-}
instance Sieve (Forget r) (Const r) where
sieve :: forall a b. Forget r a b -> a -> Const r b
sieve = (r -> Const r b
forall {k} a (b :: k). a -> Const a b
Const (r -> Const r b) -> (a -> r) -> a -> Const r b
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((a -> r) -> a -> Const r b)
-> (Forget r a b -> a -> r) -> Forget r a b -> a -> Const r b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Forget r a b -> a -> r
forall {k} r a (b :: k). Forget r a b -> a -> r
runForget
{-# INLINE sieve #-}
class (Profunctor p, Functor f) => Cosieve p f | p -> f where
cosieve :: p a b -> f a -> b
instance Cosieve (->) Identity where
cosieve :: forall a b. (a -> b) -> Identity a -> b
cosieve a -> b
f (Identity a
d) = a -> b
f a
d
{-# INLINE cosieve #-}
instance Functor w => Cosieve (Cokleisli w) w where
cosieve :: forall a b. Cokleisli w a b -> w a -> b
cosieve = Cokleisli w a b -> w a -> b
forall {k} (w :: k -> *) (a :: k) b. Cokleisli w a b -> w a -> b
runCokleisli
{-# INLINE cosieve #-}
instance Cosieve Tagged Proxy where
cosieve :: forall a b. Tagged a b -> Proxy a -> b
cosieve (Tagged b
a) Proxy a
_ = b
a
{-# INLINE cosieve #-}
instance Functor f => Cosieve (Costar f) f where
cosieve :: forall a b. Costar f a b -> f a -> b
cosieve = Costar f a b -> f a -> b
forall {k} (f :: k -> *) (d :: k) c. Costar f d c -> f d -> c
runCostar
{-# INLINE cosieve #-}