{-# LANGUAGE RankNTypes #-} module Control.Foldl.Optics where import Data.Profunctor type Prism s t a b = forall p f. (Choice p, Applicative f) => p a (f b) -> p s (f t) type Prism' s a = Prism s s a a prism :: (b -> t) -> (s -> Either t a) -> Prism s t a b prism :: (b -> t) -> (s -> Either t a) -> Prism s t a b prism b -> t bt s -> Either t a seta = (s -> Either t a) -> (Either t (f b) -> f t) -> p (Either t a) (Either t (f b)) -> p s (f t) forall (p :: * -> * -> *) a b c d. Profunctor p => (a -> b) -> (c -> d) -> p b c -> p a d dimap s -> Either t a seta ((t -> f t) -> (f b -> f t) -> Either t (f b) -> f t forall a c b. (a -> c) -> (b -> c) -> Either a b -> c either t -> f t forall (f :: * -> *) a. Applicative f => a -> f a pure ((b -> t) -> f b -> f t forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap b -> t bt)) (p (Either t a) (Either t (f b)) -> p s (f t)) -> (p a (f b) -> p (Either t a) (Either t (f b))) -> p a (f b) -> p s (f t) forall b c a. (b -> c) -> (a -> b) -> a -> c . p a (f b) -> p (Either t a) (Either t (f b)) forall (p :: * -> * -> *) a b c. Choice p => p a b -> p (Either c a) (Either c b) right' {-# INLINE prism #-} _Left :: Prism (Either a c) (Either b c) a b _Left :: p a (f b) -> p (Either a c) (f (Either b c)) _Left = (b -> Either b c) -> (Either a c -> Either (Either b c) a) -> Prism (Either a c) (Either b c) a b forall b t s a. (b -> t) -> (s -> Either t a) -> Prism s t a b prism b -> Either b c forall a b. a -> Either a b Left ((Either a c -> Either (Either b c) a) -> Prism (Either a c) (Either b c) a b) -> (Either a c -> Either (Either b c) a) -> Prism (Either a c) (Either b c) a b forall a b. (a -> b) -> a -> b $ (a -> Either (Either b c) a) -> (c -> Either (Either b c) a) -> Either a c -> Either (Either b c) a forall a c b. (a -> c) -> (b -> c) -> Either a b -> c either a -> Either (Either b c) a forall a b. b -> Either a b Right (Either b c -> Either (Either b c) a forall a b. a -> Either a b Left (Either b c -> Either (Either b c) a) -> (c -> Either b c) -> c -> Either (Either b c) a forall b c a. (b -> c) -> (a -> b) -> a -> c . c -> Either b c forall a b. b -> Either a b Right) {-# INLINE _Left #-} _Right :: Prism (Either c a) (Either c b) a b _Right :: p a (f b) -> p (Either c a) (f (Either c b)) _Right = (b -> Either c b) -> (Either c a -> Either (Either c b) a) -> Prism (Either c a) (Either c b) a b forall b t s a. (b -> t) -> (s -> Either t a) -> Prism s t a b prism b -> Either c b forall a b. b -> Either a b Right ((Either c a -> Either (Either c b) a) -> Prism (Either c a) (Either c b) a b) -> (Either c a -> Either (Either c b) a) -> Prism (Either c a) (Either c b) a b forall a b. (a -> b) -> a -> b $ (c -> Either (Either c b) a) -> (a -> Either (Either c b) a) -> Either c a -> Either (Either c b) a forall a c b. (a -> c) -> (b -> c) -> Either a b -> c either (Either c b -> Either (Either c b) a forall a b. a -> Either a b Left (Either c b -> Either (Either c b) a) -> (c -> Either c b) -> c -> Either (Either c b) a forall b c a. (b -> c) -> (a -> b) -> a -> c . c -> Either c b forall a b. a -> Either a b Left) a -> Either (Either c b) a forall a b. b -> Either a b Right {-# INLINE _Right #-}