{-# OPTIONS_GHC -Wno-orphans #-}

{- |
Module      : Control.Lens.Grammar.Internal.Orphanage
Description : orphanage
Copyright   : (C) 2026 - Eitan Chatav
License     : BSD-style (see the file LICENSE)
Maintainer  : Eitan Chatav <eitan.chatav@gmail.com>
Stability   : provisional
Portability : non-portable

An orphanage for instances without a home.
-}

module Control.Lens.Grammar.Internal.Orphanage () where

import Control.Applicative hiding (WrappedArrow)
import Control.Applicative qualified as Ap (WrappedArrow)
import Control.Arrow
import Control.Lens
import Control.Lens.Internal.Prism
import Control.Lens.Internal.Profunctor
import Control.Monad
import Data.Bifunctor.Clown
import Data.Bifunctor.Joker
import Data.Bifunctor.Product
import Data.Distributive
import Data.Functor.Compose
import Data.Functor.Contravariant.Divisible
import Data.Profunctor hiding (WrappedArrow)
import Data.Profunctor qualified as Pro (WrappedArrow)
import Data.Profunctor.Cayley
import Data.Profunctor.Composition
import Data.Profunctor.Monad
import Data.Profunctor.Yoneda
import Text.ParserCombinators.ReadP (ReadP)
import Witherable

-- Orphanage --
instance (Profunctor p, Functor f)
  => Functor (WrappedPafb f p a) where fmap :: forall a b. (a -> b) -> WrappedPafb f p a a -> WrappedPafb f p a b
fmap = (a -> b) -> WrappedPafb f p a a -> WrappedPafb f p a b
forall b c a.
(b -> c) -> WrappedPafb f p a b -> WrappedPafb f p a c
forall (p :: * -> * -> *) b c a.
Profunctor p =>
(b -> c) -> p a b -> p a c
rmap
deriving via Compose (p a) f instance
  (Profunctor p, Functor (p a), Filterable f)
    => Filterable (WrappedPafb f p a)
instance (Profunctor p, Filterable f)
  => Cochoice (WrappedPafb f p) where
    unleft :: forall a d b.
WrappedPafb f p (Either a d) (Either b d) -> WrappedPafb f p a b
unleft (WrapPafb p (Either a d) (f (Either b d))
p) = p a (f b) -> WrappedPafb f p a b
forall (f :: * -> *) (p :: * -> * -> *) a b.
p a (f b) -> WrappedPafb f p a b
WrapPafb (p a (f b) -> WrappedPafb f p a b)
-> p a (f b) -> WrappedPafb f p a b
forall a b. (a -> b) -> a -> b
$
      (a -> Either a d)
-> (f (Either b d) -> f b)
-> p (Either a d) (f (Either b d))
-> p a (f b)
forall a b c d. (a -> b) -> (c -> d) -> p b c -> p a d
forall (p :: * -> * -> *) a b c d.
Profunctor p =>
(a -> b) -> (c -> d) -> p b c -> p a d
dimap a -> Either a d
forall a b. a -> Either a b
Left ((Either b d -> Maybe b) -> f (Either b d) -> f b
forall a b. (a -> Maybe b) -> f a -> f b
forall (f :: * -> *) a b.
Filterable f =>
(a -> Maybe b) -> f a -> f b
mapMaybe ((b -> Maybe b) -> (d -> Maybe b) -> Either b d -> Maybe b
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either b -> Maybe b
forall a. a -> Maybe a
Just (Maybe b -> d -> Maybe b
forall a b. a -> b -> a
const Maybe b
forall a. Maybe a
Nothing))) p (Either a d) (f (Either b d))
p
    unright :: forall d a b.
WrappedPafb f p (Either d a) (Either d b) -> WrappedPafb f p a b
unright (WrapPafb p (Either d a) (f (Either d b))
p) = p a (f b) -> WrappedPafb f p a b
forall (f :: * -> *) (p :: * -> * -> *) a b.
p a (f b) -> WrappedPafb f p a b
WrapPafb (p a (f b) -> WrappedPafb f p a b)
-> p a (f b) -> WrappedPafb f p a b
forall a b. (a -> b) -> a -> b
$
      (a -> Either d a)
-> (f (Either d b) -> f b)
-> p (Either d a) (f (Either d b))
-> p a (f b)
forall a b c d. (a -> b) -> (c -> d) -> p b c -> p a d
forall (p :: * -> * -> *) a b c d.
Profunctor p =>
(a -> b) -> (c -> d) -> p b c -> p a d
dimap a -> Either d a
forall a b. b -> Either a b
Right ((Either d b -> Maybe b) -> f (Either d b) -> f b
forall a b. (a -> Maybe b) -> f a -> f b
forall (f :: * -> *) a b.
Filterable f =>
(a -> Maybe b) -> f a -> f b
mapMaybe ((d -> Maybe b) -> (b -> Maybe b) -> Either d b -> Maybe b
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (Maybe b -> d -> Maybe b
forall a b. a -> b -> a
const Maybe b
forall a. Maybe a
Nothing) b -> Maybe b
forall a. a -> Maybe a
Just)) p (Either d a) (f (Either d b))
p
instance (Profunctor p, Filterable (p a))
  => Filterable (Yoneda p a) where
    catMaybes :: forall a. Yoneda p a (Maybe a) -> Yoneda p a a
catMaybes = p a a -> Yoneda p a a
p :-> Yoneda p
forall (p :: * -> * -> *). Profunctor p => p :-> Yoneda p
forall (t :: (* -> * -> *) -> * -> * -> *) (p :: * -> * -> *).
(ProfunctorMonad t, Profunctor p) =>
p :-> t p
proreturn (p a a -> Yoneda p a a)
-> (Yoneda p a (Maybe a) -> p a a)
-> Yoneda p a (Maybe a)
-> Yoneda p a a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. p a (Maybe a) -> p a a
forall a. p a (Maybe a) -> p a a
forall (f :: * -> *) a. Filterable f => f (Maybe a) -> f a
catMaybes (p a (Maybe a) -> p a a)
-> (Yoneda p a (Maybe a) -> p a (Maybe a))
-> Yoneda p a (Maybe a)
-> p a a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Yoneda p a (Maybe a) -> p a (Maybe a)
Yoneda p :-> p
forall (p :: * -> * -> *). Profunctor p => Yoneda p :-> p
forall (t :: (* -> * -> *) -> * -> * -> *) (p :: * -> * -> *).
(ProfunctorComonad t, Profunctor p) =>
t p :-> p
proextract
instance (Profunctor p, Filterable (p a))
  => Filterable (Coyoneda p a) where
    catMaybes :: forall a. Coyoneda p a (Maybe a) -> Coyoneda p a a
catMaybes = p a a -> Coyoneda p a a
p :-> Coyoneda p
forall (p :: * -> * -> *). Profunctor p => p :-> Coyoneda p
forall (t :: (* -> * -> *) -> * -> * -> *) (p :: * -> * -> *).
(ProfunctorMonad t, Profunctor p) =>
p :-> t p
proreturn (p a a -> Coyoneda p a a)
-> (Coyoneda p a (Maybe a) -> p a a)
-> Coyoneda p a (Maybe a)
-> Coyoneda p a a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. p a (Maybe a) -> p a a
forall a. p a (Maybe a) -> p a a
forall (f :: * -> *) a. Filterable f => f (Maybe a) -> f a
catMaybes (p a (Maybe a) -> p a a)
-> (Coyoneda p a (Maybe a) -> p a (Maybe a))
-> Coyoneda p a (Maybe a)
-> p a a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Coyoneda p a (Maybe a) -> p a (Maybe a)
Coyoneda p :-> p
forall (p :: * -> * -> *). Profunctor p => Coyoneda p :-> p
forall (t :: (* -> * -> *) -> * -> * -> *) (p :: * -> * -> *).
(ProfunctorComonad t, Profunctor p) =>
t p :-> p
proextract
instance Filterable f => Filterable (Star f a) where
  catMaybes :: forall a. Star f a (Maybe a) -> Star f a a
catMaybes (Star a -> f (Maybe a)
f) = (a -> f a) -> Star f a a
forall {k} (f :: k -> *) d (c :: k). (d -> f c) -> Star f d c
Star (f (Maybe a) -> f a
forall a. f (Maybe a) -> f a
forall (f :: * -> *) a. Filterable f => f (Maybe a) -> f a
catMaybes (f (Maybe a) -> f a) -> (a -> f (Maybe a)) -> a -> f a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> f (Maybe a)
f)
instance Monoid r => Applicative (Forget r a) where
  pure :: forall a. a -> Forget r a a
pure a
_ = (a -> r) -> Forget r a a
forall {k} r a (b :: k). (a -> r) -> Forget r a b
Forget a -> r
forall a. Monoid a => a
mempty
  Forget a -> r
f <*> :: forall a b. Forget r a (a -> b) -> Forget r a a -> Forget r a b
<*> Forget a -> r
g = (a -> r) -> Forget r a b
forall {k} r a (b :: k). (a -> r) -> Forget r a b
Forget (a -> r
f (a -> r) -> (a -> r) -> a -> r
forall a. Semigroup a => a -> a -> a
<> a -> r
g)
instance Filterable (Forget r a) where
  catMaybes :: forall a. Forget r a (Maybe a) -> Forget r a a
catMaybes (Forget a -> r
f) = (a -> r) -> Forget r a a
forall {k} r a (b :: k). (a -> r) -> Forget r a b
Forget a -> r
f
instance Decidable f => Applicative (Clown f a) where
  pure :: forall a. a -> Clown f a a
pure a
_ = f a -> Clown f a a
forall {k} {k1} (f :: k -> *) (a :: k) (b :: k1).
f a -> Clown f a b
Clown f a
forall a. f a
forall (f :: * -> *) a. Divisible f => f a
conquer
  Clown f a
x <*> :: forall a b. Clown f a (a -> b) -> Clown f a a -> Clown f a b
<*> Clown f a
y = f a -> Clown f a b
forall {k} {k1} (f :: k -> *) (a :: k) (b :: k1).
f a -> Clown f a b
Clown ((a -> (a, a)) -> f a -> f a -> f a
forall a b c. (a -> (b, c)) -> f b -> f c -> f a
forall (f :: * -> *) a b c.
Divisible f =>
(a -> (b, c)) -> f b -> f c -> f a
divide (a -> a
forall a. a -> a
id (a -> a) -> (a -> a) -> a -> (a, a)
forall b c c'. (b -> c) -> (b -> c') -> b -> (c, c')
forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&& a -> a
forall a. a -> a
id) f a
x f a
y)
deriving newtype instance Applicative f => Applicative (Joker f a)
deriving newtype instance Alternative f => Alternative (Joker f a)
deriving newtype instance Filterable f => Filterable (Joker f a)
deriving newtype instance Monad m => Monad (Joker m a)
deriving newtype instance MonadFail m => MonadFail (Joker m a)
deriving newtype instance MonadPlus m => MonadPlus (Joker m a)
instance Filterable f => Cochoice (Joker f) where
  unleft :: forall a d b. Joker f (Either a d) (Either b d) -> Joker f a b
unleft (Joker f (Either b d)
x) = f b -> Joker f a b
forall {k} {k1} (g :: k -> *) (a :: k1) (b :: k).
g b -> Joker g a b
Joker
    ((Either b d -> Maybe b) -> f (Either b d) -> f b
forall a b. (a -> Maybe b) -> f a -> f b
forall (f :: * -> *) a b.
Filterable f =>
(a -> Maybe b) -> f a -> f b
mapMaybe ((b -> Maybe b) -> (d -> Maybe b) -> Either b d -> Maybe b
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either b -> Maybe b
forall a. a -> Maybe a
Just (Maybe b -> d -> Maybe b
forall a b. a -> b -> a
const Maybe b
forall a. Maybe a
Nothing)) f (Either b d)
x)
  unright :: forall d a b. Joker f (Either d a) (Either d b) -> Joker f a b
unright (Joker f (Either d b)
x) = f b -> Joker f a b
forall {k} {k1} (g :: k -> *) (a :: k1) (b :: k).
g b -> Joker g a b
Joker
    ((Either d b -> Maybe b) -> f (Either d b) -> f b
forall a b. (a -> Maybe b) -> f a -> f b
forall (f :: * -> *) a b.
Filterable f =>
(a -> Maybe b) -> f a -> f b
mapMaybe ((d -> Maybe b) -> (b -> Maybe b) -> Either d b -> Maybe b
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (Maybe b -> d -> Maybe b
forall a b. a -> b -> a
const Maybe b
forall a. Maybe a
Nothing) b -> Maybe b
forall a. a -> Maybe a
Just) f (Either d b)
x)
instance Filterable ReadP where
  catMaybes :: forall a. ReadP (Maybe a) -> ReadP a
catMaybes ReadP (Maybe a)
m = ReadP (Maybe a)
m ReadP (Maybe a) -> (Maybe a -> ReadP a) -> ReadP a
forall a b. ReadP a -> (a -> ReadP b) -> ReadP b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ReadP a -> (a -> ReadP a) -> Maybe a -> ReadP a
forall b a. b -> (a -> b) -> Maybe a -> b
maybe ReadP a
forall a. ReadP a
forall (f :: * -> *) a. Alternative f => f a
empty a -> ReadP a
forall a. a -> ReadP a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
deriving via Compose (p a) f instance
  (Profunctor p, Applicative (p a), Applicative f)
    => Applicative (WrappedPafb f p a)
deriving via Compose (p a) f instance
  (Profunctor p, Alternative (p a), Applicative f)
    => Alternative (WrappedPafb f p a)
instance (Closed p, Distributive f)
  => Closed (WrappedPafb f p) where
    closed :: forall a b x.
WrappedPafb f p a b -> WrappedPafb f p (x -> a) (x -> b)
closed (WrapPafb p a (f b)
p) = p (x -> a) (f (x -> b)) -> WrappedPafb f p (x -> a) (x -> b)
forall (f :: * -> *) (p :: * -> * -> *) a b.
p a (f b) -> WrappedPafb f p a b
WrapPafb (((x -> f b) -> f (x -> b))
-> p (x -> a) (x -> f b) -> p (x -> a) (f (x -> b))
forall b c a. (b -> c) -> p a b -> p a c
forall (p :: * -> * -> *) b c a.
Profunctor p =>
(b -> c) -> p a b -> p a c
rmap (x -> f b) -> f (x -> b)
forall (g :: * -> *) (f :: * -> *) a.
(Distributive g, Functor f) =>
f (g a) -> g (f a)
forall (f :: * -> *) a. Functor f => f (f a) -> f (f a)
distribute (p a (f b) -> p (x -> a) (x -> f b)
forall a b x. p a b -> p (x -> a) (x -> b)
forall (p :: * -> * -> *) a b x.
Closed p =>
p a b -> p (x -> a) (x -> b)
closed p a (f b)
p))
deriving via (Ap.WrappedArrow p a) instance Arrow p
  => Functor (Pro.WrappedArrow p a)
deriving via (Ap.WrappedArrow p a) instance Arrow p
  => Applicative (Pro.WrappedArrow p a)
deriving via (Pro.WrappedArrow p) instance Arrow p
  => Profunctor (Ap.WrappedArrow p)
instance
  ( forall x. Applicative (p x), Profunctor p
  , Applicative (q a), Profunctor q
  ) => Applicative (Procompose p q a) where
    pure :: forall a. a -> Procompose p q a a
pure a
b = p a a -> q a a -> Procompose p q a a
forall {k} {k1} {k2} (p :: k -> k1 -> *) (x :: k) (c :: k1)
       (q :: k2 -> k -> *) (d :: k2).
p x c -> q d x -> Procompose p q d c
Procompose (a -> p a a
forall a. a -> p a a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
b) (a -> q a a
forall a. a -> q a a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
b)
    Procompose p x (a -> b)
wb q a x
aw <*> :: forall a b.
Procompose p q a (a -> b)
-> Procompose p q a a -> Procompose p q a b
<*> Procompose p x a
vb q a x
av = p (x, x) b -> q a (x, x) -> Procompose p q a b
forall {k} {k1} {k2} (p :: k -> k1 -> *) (x :: k) (c :: k1)
       (q :: k2 -> k -> *) (d :: k2).
p x c -> q d x -> Procompose p q d c
Procompose
      (((a -> b) -> a -> b)
-> p (x, x) (a -> b) -> p (x, x) a -> p (x, x) b
forall a b c.
(a -> b -> c) -> p (x, x) a -> p (x, x) b -> p (x, x) c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 (a -> b) -> a -> b
forall a b. (a -> b) -> a -> b
($) (((x, x) -> x) -> p x (a -> b) -> p (x, x) (a -> b)
forall a b c. (a -> b) -> p b c -> p a c
forall (p :: * -> * -> *) a b c.
Profunctor p =>
(a -> b) -> p b c -> p a c
lmap (x, x) -> x
forall a b. (a, b) -> a
fst p x (a -> b)
wb) (((x, x) -> x) -> p x a -> p (x, x) a
forall a b c. (a -> b) -> p b c -> p a c
forall (p :: * -> * -> *) a b c.
Profunctor p =>
(a -> b) -> p b c -> p a c
lmap (x, x) -> x
forall a b. (a, b) -> b
snd p x a
vb))
      ((x -> x -> (x, x)) -> q a x -> q a x -> q a (x, x)
forall a b c. (a -> b -> c) -> q a a -> q a b -> q a c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 (,) q a x
aw q a x
av)
instance (forall x. Applicative (p x), forall x. Applicative (q x))
  => Applicative (Product p q a) where
    pure :: forall a. a -> Product p q a a
pure a
b = p a a -> q a a -> Product p q a a
forall {k} {k1} (f :: k -> k1 -> *) (g :: k -> k1 -> *) (a :: k)
       (b :: k1).
f a b -> g a b -> Product f g a b
Pair (a -> p a a
forall a. a -> p a a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
b) (a -> q a a
forall a. a -> q a a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
b)
    Pair p a (a -> b)
x0 q a (a -> b)
y0 <*> :: forall a b.
Product p q a (a -> b) -> Product p q a a -> Product p q a b
<*> Pair p a a
x1 q a a
y1 = p a b -> q a b -> Product p q a b
forall {k} {k1} (f :: k -> k1 -> *) (g :: k -> k1 -> *) (a :: k)
       (b :: k1).
f a b -> g a b -> Product f g a b
Pair (p a (a -> b)
x0 p a (a -> b) -> p a a -> p a b
forall a b. p a (a -> b) -> p a a -> p a b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> p a a
x1) (q a (a -> b)
y0 q a (a -> b) -> q a a -> q a b
forall a b. q a (a -> b) -> q a a -> q a b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> q a a
y1)
instance (Functor f, Functor (p a)) => Functor (Cayley f p a) where
  fmap :: forall a b. (a -> b) -> Cayley f p a a -> Cayley f p a b
fmap a -> b
f (Cayley f (p a a)
x) = f (p a b) -> Cayley f p a b
forall {k} {k1} {k2} (f :: k -> *) (p :: k1 -> k2 -> k) (a :: k1)
       (b :: k2).
f (p a b) -> Cayley f p a b
Cayley ((p a a -> p a b) -> f (p a a) -> f (p a b)
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((a -> b) -> p a a -> p a b
forall a b. (a -> b) -> p a a -> p a b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f) f (p a a)
x)
instance (Applicative f, Applicative (p a)) => Applicative (Cayley f p a) where
  pure :: forall a. a -> Cayley f p a a
pure a
b = f (p a a) -> Cayley f p a a
forall {k} {k1} {k2} (f :: k -> *) (p :: k1 -> k2 -> k) (a :: k1)
       (b :: k2).
f (p a b) -> Cayley f p a b
Cayley (p a a -> f (p a a)
forall a. a -> f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (a -> p a a
forall a. a -> p a a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
b))
  Cayley f (p a (a -> b))
x <*> :: forall a b.
Cayley f p a (a -> b) -> Cayley f p a a -> Cayley f p a b
<*> Cayley f (p a a)
y = f (p a b) -> Cayley f p a b
forall {k} {k1} {k2} (f :: k -> *) (p :: k1 -> k2 -> k) (a :: k1)
       (b :: k2).
f (p a b) -> Cayley f p a b
Cayley (p a (a -> b) -> p a a -> p a b
forall a b. p a (a -> b) -> p a a -> p a b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
(<*>) (p a (a -> b) -> p a a -> p a b)
-> f (p a (a -> b)) -> f (p a a -> p a b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> f (p a (a -> b))
x f (p a a -> p a b) -> f (p a a) -> f (p a b)
forall a b. f (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> f (p a a)
y)
instance (Profunctor p, Applicative (p a))
  => Applicative (Yoneda p a) where
    pure :: forall a. a -> Yoneda p a a
pure = p a a -> Yoneda p a a
p :-> Yoneda p
forall (p :: * -> * -> *). Profunctor p => p :-> Yoneda p
forall (t :: (* -> * -> *) -> * -> * -> *) (p :: * -> * -> *).
(ProfunctorMonad t, Profunctor p) =>
p :-> t p
proreturn (p a a -> Yoneda p a a) -> (a -> p a a) -> a -> Yoneda p a a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> p a a
forall a. a -> p a a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
    Yoneda p a (a -> b)
ab <*> :: forall a b. Yoneda p a (a -> b) -> Yoneda p a a -> Yoneda p a b
<*> Yoneda p a a
cd = p a b -> Yoneda p a b
p :-> Yoneda p
forall (p :: * -> * -> *). Profunctor p => p :-> Yoneda p
forall (t :: (* -> * -> *) -> * -> * -> *) (p :: * -> * -> *).
(ProfunctorMonad t, Profunctor p) =>
p :-> t p
proreturn (Yoneda p a (a -> b) -> p a (a -> b)
Yoneda p :-> p
forall (p :: * -> * -> *). Profunctor p => Yoneda p :-> p
forall (t :: (* -> * -> *) -> * -> * -> *) (p :: * -> * -> *).
(ProfunctorComonad t, Profunctor p) =>
t p :-> p
proextract Yoneda p a (a -> b)
ab p a (a -> b) -> p a a -> p a b
forall a b. p a (a -> b) -> p a a -> p a b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Yoneda p a a -> p a a
Yoneda p :-> p
forall (p :: * -> * -> *). Profunctor p => Yoneda p :-> p
forall (t :: (* -> * -> *) -> * -> * -> *) (p :: * -> * -> *).
(ProfunctorComonad t, Profunctor p) =>
t p :-> p
proextract Yoneda p a a
cd)
instance (Profunctor p, Applicative (p a))
  => Applicative (Coyoneda p a) where
    pure :: forall a. a -> Coyoneda p a a
pure = p a a -> Coyoneda p a a
p :-> Coyoneda p
forall (p :: * -> * -> *). Profunctor p => p :-> Coyoneda p
forall (t :: (* -> * -> *) -> * -> * -> *) (p :: * -> * -> *).
(ProfunctorMonad t, Profunctor p) =>
p :-> t p
proreturn (p a a -> Coyoneda p a a) -> (a -> p a a) -> a -> Coyoneda p a a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> p a a
forall a. a -> p a a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
    Coyoneda p a (a -> b)
ab <*> :: forall a b.
Coyoneda p a (a -> b) -> Coyoneda p a a -> Coyoneda p a b
<*> Coyoneda p a a
cd = p a b -> Coyoneda p a b
p :-> Coyoneda p
forall (p :: * -> * -> *). Profunctor p => p :-> Coyoneda p
forall (t :: (* -> * -> *) -> * -> * -> *) (p :: * -> * -> *).
(ProfunctorMonad t, Profunctor p) =>
p :-> t p
proreturn (Coyoneda p a (a -> b) -> p a (a -> b)
Coyoneda p :-> p
forall (p :: * -> * -> *). Profunctor p => Coyoneda p :-> p
forall (t :: (* -> * -> *) -> * -> * -> *) (p :: * -> * -> *).
(ProfunctorComonad t, Profunctor p) =>
t p :-> p
proextract Coyoneda p a (a -> b)
ab p a (a -> b) -> p a a -> p a b
forall a b. p a (a -> b) -> p a a -> p a b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Coyoneda p a a -> p a a
Coyoneda p :-> p
forall (p :: * -> * -> *). Profunctor p => Coyoneda p :-> p
forall (t :: (* -> * -> *) -> * -> * -> *) (p :: * -> * -> *).
(ProfunctorComonad t, Profunctor p) =>
t p :-> p
proextract Coyoneda p a a
cd)
instance (Profunctor p, Alternative (p a))
  => Alternative (Yoneda p a) where
    empty :: forall a. Yoneda p a a
empty = p a a -> Yoneda p a a
p :-> Yoneda p
forall (p :: * -> * -> *). Profunctor p => p :-> Yoneda p
forall (t :: (* -> * -> *) -> * -> * -> *) (p :: * -> * -> *).
(ProfunctorMonad t, Profunctor p) =>
p :-> t p
proreturn p a a
forall a. p a a
forall (f :: * -> *) a. Alternative f => f a
empty
    Yoneda p a a
ab <|> :: forall a. Yoneda p a a -> Yoneda p a a -> Yoneda p a a
<|> Yoneda p a a
cd = p a a -> Yoneda p a a
p :-> Yoneda p
forall (p :: * -> * -> *). Profunctor p => p :-> Yoneda p
forall (t :: (* -> * -> *) -> * -> * -> *) (p :: * -> * -> *).
(ProfunctorMonad t, Profunctor p) =>
p :-> t p
proreturn (Yoneda p a a -> p a a
Yoneda p :-> p
forall (p :: * -> * -> *). Profunctor p => Yoneda p :-> p
forall (t :: (* -> * -> *) -> * -> * -> *) (p :: * -> * -> *).
(ProfunctorComonad t, Profunctor p) =>
t p :-> p
proextract Yoneda p a a
ab p a a -> p a a -> p a a
forall a. p a a -> p a a -> p a a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Yoneda p a a -> p a a
Yoneda p :-> p
forall (p :: * -> * -> *). Profunctor p => Yoneda p :-> p
forall (t :: (* -> * -> *) -> * -> * -> *) (p :: * -> * -> *).
(ProfunctorComonad t, Profunctor p) =>
t p :-> p
proextract Yoneda p a a
cd)
    many :: forall a. Yoneda p a a -> Yoneda p a [a]
many = p a [a] -> Yoneda p a [a]
p :-> Yoneda p
forall (p :: * -> * -> *). Profunctor p => p :-> Yoneda p
forall (t :: (* -> * -> *) -> * -> * -> *) (p :: * -> * -> *).
(ProfunctorMonad t, Profunctor p) =>
p :-> t p
proreturn (p a [a] -> Yoneda p a [a])
-> (Yoneda p a a -> p a [a]) -> Yoneda p a a -> Yoneda p a [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. p a a -> p a [a]
forall a. p a a -> p a [a]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many (p a a -> p a [a])
-> (Yoneda p a a -> p a a) -> Yoneda p a a -> p a [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Yoneda p a a -> p a a
Yoneda p :-> p
forall (p :: * -> * -> *). Profunctor p => Yoneda p :-> p
forall (t :: (* -> * -> *) -> * -> * -> *) (p :: * -> * -> *).
(ProfunctorComonad t, Profunctor p) =>
t p :-> p
proextract
instance (Profunctor p, Alternative (p a))
  => Alternative (Coyoneda p a) where
    empty :: forall a. Coyoneda p a a
empty = p a a -> Coyoneda p a a
p :-> Coyoneda p
forall (p :: * -> * -> *). Profunctor p => p :-> Coyoneda p
forall (t :: (* -> * -> *) -> * -> * -> *) (p :: * -> * -> *).
(ProfunctorMonad t, Profunctor p) =>
p :-> t p
proreturn p a a
forall a. p a a
forall (f :: * -> *) a. Alternative f => f a
empty
    Coyoneda p a a
ab <|> :: forall a. Coyoneda p a a -> Coyoneda p a a -> Coyoneda p a a
<|> Coyoneda p a a
cd = p a a -> Coyoneda p a a
p :-> Coyoneda p
forall (p :: * -> * -> *). Profunctor p => p :-> Coyoneda p
forall (t :: (* -> * -> *) -> * -> * -> *) (p :: * -> * -> *).
(ProfunctorMonad t, Profunctor p) =>
p :-> t p
proreturn (Coyoneda p a a -> p a a
Coyoneda p :-> p
forall (p :: * -> * -> *). Profunctor p => Coyoneda p :-> p
forall (t :: (* -> * -> *) -> * -> * -> *) (p :: * -> * -> *).
(ProfunctorComonad t, Profunctor p) =>
t p :-> p
proextract Coyoneda p a a
ab p a a -> p a a -> p a a
forall a. p a a -> p a a -> p a a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Coyoneda p a a -> p a a
Coyoneda p :-> p
forall (p :: * -> * -> *). Profunctor p => Coyoneda p :-> p
forall (t :: (* -> * -> *) -> * -> * -> *) (p :: * -> * -> *).
(ProfunctorComonad t, Profunctor p) =>
t p :-> p
proextract Coyoneda p a a
cd)
    many :: forall a. Coyoneda p a a -> Coyoneda p a [a]
many = p a [a] -> Coyoneda p a [a]
p :-> Coyoneda p
forall (p :: * -> * -> *). Profunctor p => p :-> Coyoneda p
forall (t :: (* -> * -> *) -> * -> * -> *) (p :: * -> * -> *).
(ProfunctorMonad t, Profunctor p) =>
p :-> t p
proreturn (p a [a] -> Coyoneda p a [a])
-> (Coyoneda p a a -> p a [a])
-> Coyoneda p a a
-> Coyoneda p a [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. p a a -> p a [a]
forall a. p a a -> p a [a]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many (p a a -> p a [a])
-> (Coyoneda p a a -> p a a) -> Coyoneda p a a -> p a [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Coyoneda p a a -> p a a
Coyoneda p :-> p
forall (p :: * -> * -> *). Profunctor p => Coyoneda p :-> p
forall (t :: (* -> * -> *) -> * -> * -> *) (p :: * -> * -> *).
(ProfunctorComonad t, Profunctor p) =>
t p :-> p
proextract
instance Applicative (Market a b s) where
  pure :: forall a. a -> Market a b s a
pure a
t = (b -> a) -> (s -> Either a a) -> Market a b s a
forall a b s t. (b -> t) -> (s -> Either t a) -> Market a b s t
Market (a -> b -> a
forall a. a -> b -> a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
t) (Either a a -> s -> Either a a
forall a. a -> s -> a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (a -> Either a a
forall a b. a -> Either a b
Left a
t))
  Market b -> a -> b
f0 s -> Either (a -> b) a
g0 <*> :: forall a b.
Market a b s (a -> b) -> Market a b s a -> Market a b s b
<*> Market b -> a
f1 s -> Either a a
g1 = (b -> b) -> (s -> Either b a) -> Market a b s b
forall a b s t. (b -> t) -> (s -> Either t a) -> Market a b s t
Market
    (\b
b -> b -> a -> b
f0 b
b (b -> a
f1 b
b))
    (\s
s ->
      case s -> Either (a -> b) a
g0 s
s of
        Left a -> b
bt -> case s -> Either a a
g1 s
s of
          Left a
b -> b -> Either b a
forall a b. a -> Either a b
Left (a -> b
bt a
b)
          Right a
a -> a -> Either b a
forall a b. b -> Either a b
Right a
a
        Right a
a -> a -> Either b a
forall a b. b -> Either a b
Right a
a
    )