module Control.Lens.Internal.Profunctor 
  ( WrappedPafb (..)
  ) where

import Prelude ()
import Control.Lens.Internal.Prelude

newtype WrappedPafb f p a b = WrapPafb { WrappedPafb f p a b -> p a (f b)
unwrapPafb :: p a (f b) }

instance (Functor f, Profunctor p) => Profunctor (WrappedPafb f p) where
  dimap :: (a -> b) -> (c -> d) -> WrappedPafb f p b c -> WrappedPafb f p a d
dimap a -> b
f c -> d
g (WrapPafb p b (f c)
p) = p a (f d) -> WrappedPafb f p a d
forall (f :: * -> *) (p :: * -> * -> *) a b.
p a (f b) -> WrappedPafb f p a b
WrapPafb (p a (f d) -> WrappedPafb f p a d)
-> p a (f d) -> WrappedPafb f p a d
forall a b. (a -> b) -> a -> b
$ (a -> b) -> (f c -> f d) -> p b (f c) -> p a (f d)
forall (p :: * -> * -> *) a b c d.
Profunctor p =>
(a -> b) -> (c -> d) -> p b c -> p a d
dimap a -> b
f ((c -> d) -> f c -> f d
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap c -> d
g) p b (f c)
p

instance (Applicative f, Choice p) => Choice (WrappedPafb f p) where
  left' :: WrappedPafb f p a b -> WrappedPafb f p (Either a c) (Either b c)
left' (WrapPafb p a (f b)
p) = p (Either a c) (f (Either b c))
-> WrappedPafb f p (Either a c) (Either b c)
forall (f :: * -> *) (p :: * -> * -> *) a b.
p a (f b) -> WrappedPafb f p a b
WrapPafb (p (Either a c) (f (Either b c))
 -> WrappedPafb f p (Either a c) (Either b c))
-> p (Either a c) (f (Either b c))
-> WrappedPafb f p (Either a c) (Either b c)
forall a b. (a -> b) -> a -> b
$ (Either (f b) c -> f (Either b c))
-> p (Either a c) (Either (f b) c)
-> p (Either a c) (f (Either b c))
forall (p :: * -> * -> *) b c a.
Profunctor p =>
(b -> c) -> p a b -> p a c
rmap Either (f b) c -> f (Either b c)
forall (f :: * -> *) a b.
Applicative f =>
Either (f a) b -> f (Either a b)
sequenceL (p (Either a c) (Either (f b) c)
 -> p (Either a c) (f (Either b c)))
-> p (Either a c) (Either (f b) c)
-> p (Either a c) (f (Either b c))
forall a b. (a -> b) -> a -> b
$ p a (f b) -> p (Either a c) (Either (f b) c)
forall (p :: * -> * -> *) a b c.
Choice p =>
p a b -> p (Either a c) (Either b c)
left' p a (f b)
p
    where
      sequenceL :: Either (f a) b -> f (Either a b)
sequenceL (Left f a
a) = (a -> Either a b) -> f a -> f (Either a b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> Either a b
forall a b. a -> Either a b
Left f a
a
      sequenceL (Right b
a) = Either a b -> f (Either a b)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Either a b -> f (Either a b)) -> Either a b -> f (Either a b)
forall a b. (a -> b) -> a -> b
$ b -> Either a b
forall a b. b -> Either a b
Right b
a