{-# LANGUAGE DerivingVia #-}
module Data.Functor.Contravariant.Divisible.Free (
Div(.., Conquer, Divide)
, hoistDiv, liftDiv, runDiv
, divListF, listFDiv
, Div1(.., Div1_)
, hoistDiv1, liftDiv1, toDiv, runDiv1
, div1NonEmptyF, nonEmptyFDiv1
, Dec(..)
, hoistDec, liftDec, runDec
, Dec1(..)
, hoistDec1, liftDec1, toDec, runDec1
) where
import Control.Applicative.ListF
import Control.Natural
import Data.Bifunctor
import Data.Bifunctor.Assoc
import Data.Foldable
import Data.Functor.Apply
import Data.Functor.Contravariant
import Data.Functor.Contravariant.Conclude
import Data.Functor.Contravariant.Coyoneda
import Data.Functor.Contravariant.Decide
import Data.Functor.Contravariant.Divise
import Data.Functor.Contravariant.Divisible
import Data.Functor.Invariant
import Data.Functor.Invariant.Inplicative
import Data.Functor.Invariant.Internative
import Data.HFunctor
import Data.HFunctor.HTraversable
import Data.HFunctor.Interpret
import Data.Kind
import Data.List.NonEmpty (NonEmpty(..))
import Data.Semigroup.Traversable
import Data.Void
import qualified Control.Monad.Trans.Compose as CT
import qualified Data.Functor.Contravariant.Day as CD
newtype Div f a = Div { forall (f :: * -> *) a. Div f a -> [Coyoneda f a]
unDiv :: [Coyoneda f a] }
deriving (forall b a. b -> Div f b -> Div f a
forall a' a. (a' -> a) -> Div f a -> Div f a'
forall (f :: * -> *).
(forall a' a. (a' -> a) -> f a -> f a')
-> (forall b a. b -> f b -> f a) -> Contravariant f
forall (f :: * -> *) b a. b -> Div f b -> Div f a
forall (f :: * -> *) a' a. (a' -> a) -> Div f a -> Div f a'
>$ :: forall b a. b -> Div f b -> Div f a
$c>$ :: forall (f :: * -> *) b a. b -> Div f b -> Div f a
contramap :: forall a' a. (a' -> a) -> Div f a -> Div f a'
$ccontramap :: forall (f :: * -> *) a' a. (a' -> a) -> Div f a -> Div f a'
Contravariant, forall a b. Div f a -> Div f b -> Div f (a, b)
forall a b c. (a -> (b, c)) -> Div f b -> Div f c -> Div f a
forall (f :: * -> *). Contravariant (Div f)
forall (f :: * -> *).
Contravariant f
-> (forall a b c. (a -> (b, c)) -> f b -> f c -> f a)
-> (forall a b. f a -> f b -> f (a, b))
-> Divise f
forall (f :: * -> *) a b. Div f a -> Div f b -> Div f (a, b)
forall (f :: * -> *) a b c.
(a -> (b, c)) -> Div f b -> Div f c -> Div f a
divised :: forall a b. Div f a -> Div f b -> Div f (a, b)
$cdivised :: forall (f :: * -> *) a b. Div f a -> Div f b -> Div f (a, b)
divise :: forall a b c. (a -> (b, c)) -> Div f b -> Div f c -> Div f a
$cdivise :: forall (f :: * -> *) a b c.
(a -> (b, c)) -> Div f b -> Div f c -> Div f a
Divise, forall a. Div f a
forall a b c. (a -> (b, c)) -> Div f b -> Div f c -> Div f a
forall (f :: * -> *). Contravariant (Div f)
forall (f :: * -> *).
Contravariant f
-> (forall a b c. (a -> (b, c)) -> f b -> f c -> f a)
-> (forall a. f a)
-> Divisible f
forall (f :: * -> *) a. Div f a
forall (f :: * -> *) a b c.
(a -> (b, c)) -> Div f b -> Div f c -> Div f a
conquer :: forall a. Div f a
$cconquer :: forall (f :: * -> *) a. Div f a
divide :: forall a b c. (a -> (b, c)) -> Div f b -> Div f c -> Div f a
$cdivide :: forall (f :: * -> *) a b c.
(a -> (b, c)) -> Div f b -> Div f c -> Div f a
Divisible) via (ListF (Coyoneda f))
deriving (forall {k} {k1} (t :: (k -> *) -> k1 -> *).
(forall (f :: k -> *) (g :: k -> *). (f ~> g) -> t f ~> t g)
-> HFunctor t
forall (f :: * -> *) (g :: * -> *). (f ~> g) -> Div f ~> Div g
hmap :: forall (f :: * -> *) (g :: * -> *). (f ~> g) -> Div f ~> Div g
$chmap :: forall (f :: * -> *) (g :: * -> *). (f ~> g) -> Div f ~> Div g
HFunctor, HFunctor Div
forall {k} (t :: (k -> *) -> k -> *).
HFunctor t -> (forall (f :: k -> *). f ~> t f) -> Inject t
forall (f :: * -> *) x. f x -> Div f x
inject :: forall (f :: * -> *) x. f x -> Div f x
$cinject :: forall (f :: * -> *) x. f x -> Div f x
Inject) via (CT.ComposeT ListF Coyoneda)
instance HTraversable Div where
htraverse :: forall (h :: * -> *) (f :: * -> *) (g :: * -> *) a.
Applicative h =>
(forall x. f x -> h (g x)) -> Div f a -> h (Div g a)
htraverse forall x. f x -> h (g x)
f (Div [Coyoneda f a]
xs) = forall (f :: * -> *) a. [Coyoneda f a] -> Div f a
Div forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse (forall {k} {k1} (t :: (k -> *) -> k1 -> *) (h :: * -> *)
(f :: k -> *) (g :: k -> *) (a :: k1).
(HTraversable t, Applicative h) =>
(forall (x :: k). f x -> h (g x)) -> t f a -> h (t g a)
htraverse forall x. f x -> h (g x)
f) [Coyoneda f a]
xs
instance Invariant (Div f) where
invmap :: forall a b. (a -> b) -> (b -> a) -> Div f a -> Div f b
invmap a -> b
_ = forall (f :: * -> *) a' a.
Contravariant f =>
(a' -> a) -> f a -> f a'
contramap
deriving via WrappedDivisible (Div f) instance Inply (Div f)
deriving via WrappedDivisible (Div f) instance Inplicative (Div f)
pattern Conquer :: Div f a
pattern $bConquer :: forall (f :: * -> *) a. Div f a
$mConquer :: forall {r} {f :: * -> *} {a}.
Div f a -> ((# #) -> r) -> ((# #) -> r) -> r
Conquer = Div []
pattern Divide :: (a -> (b, c)) -> f b -> Div f c -> Div f a
pattern $bDivide :: forall a (f :: * -> *) b c.
(a -> (b, c)) -> f b -> Div f c -> Div f a
$mDivide :: forall {r} {a} {f :: * -> *}.
Div f a
-> (forall {b} {c}. (a -> (b, c)) -> f b -> Div f c -> r)
-> ((# #) -> r)
-> r
Divide f x xs <- (divDay_ -> Just (CD.Day x xs f))
where
Divide a -> (b, c)
f f b
x (Div [Coyoneda f c]
xs) = forall (f :: * -> *) a. [Coyoneda f a] -> Div f a
Div forall a b. (a -> b) -> a -> b
$ forall a b (f :: * -> *). (a -> b) -> f b -> Coyoneda f a
Coyoneda (forall a b. (a, b) -> a
fst forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> (b, c)
f) f b
x forall a. a -> [a] -> [a]
: (forall a b. (a -> b) -> [a] -> [b]
map forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a' a.
Contravariant f =>
(a' -> a) -> f a -> f a'
contramap) (forall a b. (a, b) -> b
snd forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> (b, c)
f) [Coyoneda f c]
xs
{-# COMPLETE Conquer, Divide #-}
divDay_ :: Div f a -> Maybe (CD.Day f (Div f) a)
divDay_ :: forall (f :: * -> *) a. Div f a -> Maybe (Day f (Div f) a)
divDay_ (Div []) = forall a. Maybe a
Nothing
divDay_ (Div (Coyoneda a -> b
f f b
x : [Coyoneda f a]
xs)) = forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) (g :: * -> *) a b c.
f b -> g c -> (a -> (b, c)) -> Day f g a
CD.Day f b
x (forall (f :: * -> *) a. [Coyoneda f a] -> Div f a
Div [Coyoneda f a]
xs) (\a
y -> (a -> b
f a
y, a
y))
divListF :: forall f. Contravariant f => Div f ~> ListF f
divListF :: forall (f :: * -> *). Contravariant f => Div f ~> ListF f
divListF = forall {k} (f :: k -> *) (a :: k). [f a] -> ListF f a
ListF forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map forall (f :: * -> *) a. Contravariant f => Coyoneda f a -> f a
lowerCoyoneda forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. Div f a -> [Coyoneda f a]
unDiv
listFDiv :: ListF f ~> Div f
listFDiv :: forall (f :: * -> *). ListF f ~> Div f
listFDiv = forall (f :: * -> *) a. [Coyoneda f a] -> Div f a
Div forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map forall (f :: * -> *) a. f a -> Coyoneda f a
liftCoyoneda forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {k} (f :: k -> *) (a :: k). ListF f a -> [f a]
runListF
hoistDiv :: forall f g. (f ~> g) -> Div f ~> Div g
hoistDiv :: forall (f :: * -> *) (g :: * -> *). (f ~> g) -> Div f ~> Div g
hoistDiv = forall {k} {k1} (t :: (k -> *) -> k1 -> *) (f :: k -> *)
(g :: k -> *).
HFunctor t =>
(f ~> g) -> t f ~> t g
hmap
liftDiv :: f ~> Div f
liftDiv :: forall (f :: * -> *) x. f x -> Div f x
liftDiv = forall {k} (t :: (k -> *) -> k -> *) (f :: k -> *).
Inject t =>
f ~> t f
inject
runDiv :: forall f g. Divisible g => (f ~> g) -> Div f ~> g
runDiv :: forall (f :: * -> *) (g :: * -> *).
Divisible g =>
(f ~> g) -> Div f ~> g
runDiv f ~> g
f = forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr Coyoneda f x -> g x -> g x
go forall (f :: * -> *) a. Divisible f => f a
conquer forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. Div f a -> [Coyoneda f a]
unDiv
where
go :: Coyoneda f x -> g x -> g x
go (Coyoneda x -> b
g f b
x) = forall (f :: * -> *) a b c.
Divisible f =>
(a -> (b, c)) -> f b -> f c -> f a
divide (\x
y -> (x
y,x
y)) (forall (f :: * -> *) a' a.
Contravariant f =>
(a' -> a) -> f a -> f a'
contramap x -> b
g (f ~> g
f f b
x))
instance Divisible f => Interpret Div f where
interpret :: forall (g :: * -> *). (g ~> f) -> Div g ~> f
interpret = forall (f :: * -> *) (g :: * -> *).
Divisible g =>
(f ~> g) -> Div f ~> g
runDiv
newtype Div1 f a = Div1 { forall (f :: * -> *) a. Div1 f a -> NonEmpty (Coyoneda f a)
unDiv1 :: NonEmpty (Coyoneda f a) }
deriving (forall b a. b -> Div1 f b -> Div1 f a
forall a' a. (a' -> a) -> Div1 f a -> Div1 f a'
forall (f :: * -> *).
(forall a' a. (a' -> a) -> f a -> f a')
-> (forall b a. b -> f b -> f a) -> Contravariant f
forall (f :: * -> *) b a. b -> Div1 f b -> Div1 f a
forall (f :: * -> *) a' a. (a' -> a) -> Div1 f a -> Div1 f a'
>$ :: forall b a. b -> Div1 f b -> Div1 f a
$c>$ :: forall (f :: * -> *) b a. b -> Div1 f b -> Div1 f a
contramap :: forall a' a. (a' -> a) -> Div1 f a -> Div1 f a'
$ccontramap :: forall (f :: * -> *) a' a. (a' -> a) -> Div1 f a -> Div1 f a'
Contravariant, forall a b. Div1 f a -> Div1 f b -> Div1 f (a, b)
forall a b c. (a -> (b, c)) -> Div1 f b -> Div1 f c -> Div1 f a
forall (f :: * -> *). Contravariant (Div1 f)
forall (f :: * -> *).
Contravariant f
-> (forall a b c. (a -> (b, c)) -> f b -> f c -> f a)
-> (forall a b. f a -> f b -> f (a, b))
-> Divise f
forall (f :: * -> *) a b. Div1 f a -> Div1 f b -> Div1 f (a, b)
forall (f :: * -> *) a b c.
(a -> (b, c)) -> Div1 f b -> Div1 f c -> Div1 f a
divised :: forall a b. Div1 f a -> Div1 f b -> Div1 f (a, b)
$cdivised :: forall (f :: * -> *) a b. Div1 f a -> Div1 f b -> Div1 f (a, b)
divise :: forall a b c. (a -> (b, c)) -> Div1 f b -> Div1 f c -> Div1 f a
$cdivise :: forall (f :: * -> *) a b c.
(a -> (b, c)) -> Div1 f b -> Div1 f c -> Div1 f a
Divise) via (NonEmptyF (Coyoneda f))
deriving (forall {k} {k1} (t :: (k -> *) -> k1 -> *).
(forall (f :: k -> *) (g :: k -> *). (f ~> g) -> t f ~> t g)
-> HFunctor t
forall (f :: * -> *) (g :: * -> *). (f ~> g) -> Div1 f ~> Div1 g
hmap :: forall (f :: * -> *) (g :: * -> *). (f ~> g) -> Div1 f ~> Div1 g
$chmap :: forall (f :: * -> *) (g :: * -> *). (f ~> g) -> Div1 f ~> Div1 g
HFunctor, HFunctor Div1
forall {k} (t :: (k -> *) -> k -> *).
HFunctor t -> (forall (f :: k -> *). f ~> t f) -> Inject t
forall (f :: * -> *) x. f x -> Div1 f x
inject :: forall (f :: * -> *) x. f x -> Div1 f x
$cinject :: forall (f :: * -> *) x. f x -> Div1 f x
Inject) via (CT.ComposeT NonEmptyF Coyoneda)
instance HTraversable Div1 where
htraverse :: forall (h :: * -> *) (f :: * -> *) (g :: * -> *) a.
Applicative h =>
(forall x. f x -> h (g x)) -> Div1 f a -> h (Div1 g a)
htraverse forall x. f x -> h (g x)
f (Div1 NonEmpty (Coyoneda f a)
xs) = forall (f :: * -> *) a. NonEmpty (Coyoneda f a) -> Div1 f a
Div1 forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse (forall {k} {k1} (t :: (k -> *) -> k1 -> *) (h :: * -> *)
(f :: k -> *) (g :: k -> *) (a :: k1).
(HTraversable t, Applicative h) =>
(forall (x :: k). f x -> h (g x)) -> t f a -> h (t g a)
htraverse forall x. f x -> h (g x)
f) NonEmpty (Coyoneda f a)
xs
instance HTraversable1 Div1 where
htraverse1 :: forall (h :: * -> *) (f :: * -> *) (g :: * -> *) a.
Apply h =>
(forall x. f x -> h (g x)) -> Div1 f a -> h (Div1 g a)
htraverse1 forall x. f x -> h (g x)
f (Div1 NonEmpty (Coyoneda f a)
xs) = forall (f :: * -> *) a. NonEmpty (Coyoneda f a) -> Div1 f a
Div1 forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (t :: * -> *) (f :: * -> *) a b.
(Traversable1 t, Apply f) =>
(a -> f b) -> t a -> f (t b)
traverse1 (forall {k} {k1} (t :: (k -> *) -> k1 -> *) (h :: * -> *)
(f :: k -> *) (g :: k -> *) (a :: k1).
(HTraversable1 t, Apply h) =>
(forall (x :: k). f x -> h (g x)) -> t f a -> h (t g a)
htraverse1 forall x. f x -> h (g x)
f) NonEmpty (Coyoneda f a)
xs
instance Invariant (Div1 f) where
invmap :: forall a b. (a -> b) -> (b -> a) -> Div1 f a -> Div1 f b
invmap a -> b
_ = forall (f :: * -> *) a' a.
Contravariant f =>
(a' -> a) -> f a -> f a'
contramap
deriving via WrappedDivisible (Div1 f) instance Inply (Div1 f)
instance Divise f => Interpret Div1 f where
interpret :: forall (g :: * -> *). (g ~> f) -> Div1 g ~> f
interpret = forall (g :: * -> *) (f :: * -> *).
Divise g =>
(f ~> g) -> Div1 f ~> g
runDiv1
pattern Div1_ :: (a -> (b, c)) -> f b -> Div f c -> Div1 f a
pattern $bDiv1_ :: forall a (f :: * -> *) b c.
(a -> (b, c)) -> f b -> Div f c -> Div1 f a
$mDiv1_ :: forall {r} {a} {f :: * -> *}.
Div1 f a
-> (forall {b} {c}. (a -> (b, c)) -> f b -> Div f c -> r)
-> ((# #) -> r)
-> r
Div1_ f x xs <- (div1_->CD.Day x xs f)
where
Div1_ a -> (b, c)
f f b
x (Div [Coyoneda f c]
xs) = forall (f :: * -> *) a. NonEmpty (Coyoneda f a) -> Div1 f a
Div1 forall a b. (a -> b) -> a -> b
$ forall a b (f :: * -> *). (a -> b) -> f b -> Coyoneda f a
Coyoneda (forall a b. (a, b) -> a
fst forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> (b, c)
f) f b
x forall a. a -> [a] -> NonEmpty a
:| (forall a b. (a -> b) -> [a] -> [b]
map forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a' a.
Contravariant f =>
(a' -> a) -> f a -> f a'
contramap) (forall a b. (a, b) -> b
snd forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> (b, c)
f) [Coyoneda f c]
xs
{-# COMPLETE Div1_ #-}
div1_ :: Div1 f ~> CD.Day f (Div f)
div1_ :: forall (f :: * -> *). Div1 f ~> Day f (Div f)
div1_ (Div1 (Coyoneda x -> b
g f b
x :| [Coyoneda f x]
xs)) = forall (f :: * -> *) (g :: * -> *) a b c.
f b -> g c -> (a -> (b, c)) -> Day f g a
CD.Day f b
x (forall (f :: * -> *) a. [Coyoneda f a] -> Div f a
Div [Coyoneda f x]
xs) (\x
y -> (x -> b
g x
y, x
y))
toDiv :: Div1 f ~> Div f
toDiv :: forall (f :: * -> *). Div1 f ~> Div f
toDiv = forall (f :: * -> *) a. [Coyoneda f a] -> Div f a
Div forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) a. Foldable t => t a -> [a]
toList forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. Div1 f a -> NonEmpty (Coyoneda f a)
unDiv1
hoistDiv1 :: (f ~> g) -> Div1 f ~> Div1 g
hoistDiv1 :: forall (f :: * -> *) (g :: * -> *). (f ~> g) -> Div1 f ~> Div1 g
hoistDiv1 = forall {k} {k1} (t :: (k -> *) -> k1 -> *) (f :: k -> *)
(g :: k -> *).
HFunctor t =>
(f ~> g) -> t f ~> t g
hmap
liftDiv1 :: f ~> Div1 f
liftDiv1 :: forall (f :: * -> *) x. f x -> Div1 f x
liftDiv1 = forall {k} (t :: (k -> *) -> k -> *) (f :: k -> *).
Inject t =>
f ~> t f
inject
runDiv1 :: Divise g => (f ~> g) -> Div1 f ~> g
runDiv1 :: forall (g :: * -> *) (f :: * -> *).
Divise g =>
(f ~> g) -> Div1 f ~> g
runDiv1 f ~> g
f = forall (t :: * -> *) a. Foldable t => (a -> a -> a) -> t a -> a
foldr1 (forall (f :: * -> *) a b c.
Divise f =>
(a -> (b, c)) -> f b -> f c -> f a
divise (\x
y->(x
y,x
y))) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Coyoneda f x -> g x
go forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. Div1 f a -> NonEmpty (Coyoneda f a)
unDiv1
where
go :: Coyoneda f x -> g x
go (Coyoneda x -> b
g f b
x) = forall (f :: * -> *) a' a.
Contravariant f =>
(a' -> a) -> f a -> f a'
contramap x -> b
g (f ~> g
f f b
x)
div1NonEmptyF :: Contravariant f => Div1 f ~> NonEmptyF f
div1NonEmptyF :: forall (f :: * -> *). Contravariant f => Div1 f ~> NonEmptyF f
div1NonEmptyF = forall {k} (f :: k -> *) (a :: k). NonEmpty (f a) -> NonEmptyF f a
NonEmptyF forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall (f :: * -> *) a. Contravariant f => Coyoneda f a -> f a
lowerCoyoneda forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. Div1 f a -> NonEmpty (Coyoneda f a)
unDiv1
nonEmptyFDiv1 :: NonEmptyF f ~> Div1 f
nonEmptyFDiv1 :: forall (f :: * -> *). NonEmptyF f ~> Div1 f
nonEmptyFDiv1 = forall (f :: * -> *) a. NonEmpty (Coyoneda f a) -> Div1 f a
Div1 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall (f :: * -> *) a. f a -> Coyoneda f a
liftCoyoneda forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {k} (f :: k -> *) (a :: k). NonEmptyF f a -> NonEmpty (f a)
runNonEmptyF
data Dec :: (Type -> Type) -> Type -> Type where
Lose :: (a -> Void) -> Dec f a
Choose :: (a -> Either b c) -> f b -> Dec f c -> Dec f a
instance Contravariant (Dec f) where
contramap :: forall a' a. (a' -> a) -> Dec f a -> Dec f a'
contramap a' -> a
f = \case
Lose a -> Void
g -> forall a (f :: * -> *). (a -> Void) -> Dec f a
Lose (a -> Void
g forall b c a. (b -> c) -> (a -> b) -> a -> c
. a' -> a
f)
Choose a -> Either b c
g f b
x Dec f c
xs -> forall a b c (f :: * -> *).
(a -> Either b c) -> f b -> Dec f c -> Dec f a
Choose (a -> Either b c
g forall b c a. (b -> c) -> (a -> b) -> a -> c
. a' -> a
f) f b
x Dec f c
xs
instance Invariant (Dec f) where
invmap :: forall a b. (a -> b) -> (b -> a) -> Dec f a -> Dec f b
invmap a -> b
_ = forall (f :: * -> *) a' a.
Contravariant f =>
(a' -> a) -> f a -> f a'
contramap
deriving via WrappedDivisible (Dec f) instance Inalt (Dec f)
deriving via WrappedDivisible (Dec f) instance Inplus (Dec f)
instance Decide (Dec f) where
decide :: forall a b c. (a -> Either b c) -> Dec f b -> Dec f c -> Dec f a
decide a -> Either b c
f = \case
Lose b -> Void
g -> forall (f :: * -> *) a' a.
Contravariant f =>
(a' -> a) -> f a -> f a'
contramap (forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (forall a. Void -> a
absurd forall b c a. (b -> c) -> (a -> b) -> a -> c
. b -> Void
g) forall a. a -> a
id forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Either b c
f)
Choose b -> Either b c
g f b
x Dec f c
xs -> forall a b c (f :: * -> *).
(a -> Either b c) -> f b -> Dec f c -> Dec f a
Choose (forall (p :: * -> * -> *) a b c.
Assoc p =>
p (p a b) c -> p a (p b c)
assoc forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first b -> Either b c
g forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Either b c
f) f b
x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b c.
Decide f =>
(a -> Either b c) -> f b -> f c -> f a
decide forall a. a -> a
id Dec f c
xs
instance Conclude (Dec f) where
conclude :: forall a. (a -> Void) -> Dec f a
conclude = forall a (f :: * -> *). (a -> Void) -> Dec f a
Lose
instance HFunctor Dec where
hmap :: forall (f :: * -> *) (g :: * -> *). (f ~> g) -> Dec f ~> Dec g
hmap = forall (f :: * -> *) (g :: * -> *). (f ~> g) -> Dec f ~> Dec g
hoistDec
instance Inject Dec where
inject :: forall (f :: * -> *). f ~> Dec f
inject = forall (f :: * -> *). f ~> Dec f
liftDec
instance Conclude f => Interpret Dec f where
interpret :: forall (g :: * -> *). (g ~> f) -> Dec g ~> f
interpret = forall (f :: * -> *) (g :: * -> *).
Conclude g =>
(f ~> g) -> Dec f ~> g
runDec
instance HTraversable Dec where
htraverse :: forall f g h a. Applicative h => (forall x. f x -> h (g x)) -> Dec f a -> h (Dec g a)
htraverse :: forall (f :: * -> *) (g :: * -> *) (h :: * -> *) a.
Applicative h =>
(forall x. f x -> h (g x)) -> Dec f a -> h (Dec g a)
htraverse forall x. f x -> h (g x)
f = forall b. Dec f b -> h (Dec g b)
go
where
go :: Dec f b -> h (Dec g b)
go :: forall b. Dec f b -> h (Dec g b)
go = \case
Lose b -> Void
v -> forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall a (f :: * -> *). (a -> Void) -> Dec f a
Lose b -> Void
v)
Choose b -> Either b c
g f b
x Dec f c
xs -> forall a b c (f :: * -> *).
(a -> Either b c) -> f b -> Dec f c -> Dec f a
Choose b -> Either b c
g forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall x. f x -> h (g x)
f f b
x forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall b. Dec f b -> h (Dec g b)
go Dec f c
xs
hoistDec :: forall f g. (f ~> g) -> Dec f ~> Dec g
hoistDec :: forall (f :: * -> *) (g :: * -> *). (f ~> g) -> Dec f ~> Dec g
hoistDec f ~> g
f = Dec f ~> Dec g
go
where
go :: Dec f ~> Dec g
go :: Dec f ~> Dec g
go = \case
Lose x -> Void
g -> forall a (f :: * -> *). (a -> Void) -> Dec f a
Lose x -> Void
g
Choose x -> Either b c
g f b
x Dec f c
xs -> forall a b c (f :: * -> *).
(a -> Either b c) -> f b -> Dec f c -> Dec f a
Choose x -> Either b c
g (f ~> g
f f b
x) (Dec f ~> Dec g
go Dec f c
xs)
liftDec :: f ~> Dec f
liftDec :: forall (f :: * -> *). f ~> Dec f
liftDec f x
x = forall a b c (f :: * -> *).
(a -> Either b c) -> f b -> Dec f c -> Dec f a
Choose forall a b. a -> Either a b
Left f x
x (forall a (f :: * -> *). (a -> Void) -> Dec f a
Lose forall a. a -> a
id)
runDec :: forall f g. Conclude g => (f ~> g) -> Dec f ~> g
runDec :: forall (f :: * -> *) (g :: * -> *).
Conclude g =>
(f ~> g) -> Dec f ~> g
runDec f ~> g
f = Dec f ~> g
go
where
go :: Dec f ~> g
go :: Dec f ~> g
go = \case
Lose x -> Void
g -> forall (f :: * -> *) a. Conclude f => (a -> Void) -> f a
conclude x -> Void
g
Choose x -> Either b c
g f b
x Dec f c
xs -> forall (f :: * -> *) a b c.
Decide f =>
(a -> Either b c) -> f b -> f c -> f a
decide x -> Either b c
g (f ~> g
f f b
x) (Dec f ~> g
go Dec f c
xs)
data Dec1 :: (Type -> Type) -> Type -> Type where
Dec1 :: (a -> Either b c) -> f b -> Dec f c -> Dec1 f a
toDec :: Dec1 f a -> Dec f a
toDec :: forall (f :: * -> *) a. Dec1 f a -> Dec f a
toDec (Dec1 a -> Either b c
f f b
x Dec f c
xs) = forall a b c (f :: * -> *).
(a -> Either b c) -> f b -> Dec f c -> Dec f a
Choose a -> Either b c
f f b
x Dec f c
xs
instance Contravariant (Dec1 f) where
contramap :: forall a' a. (a' -> a) -> Dec1 f a -> Dec1 f a'
contramap a' -> a
f (Dec1 a -> Either b c
g f b
x Dec f c
xs) = forall a b c (f :: * -> *).
(a -> Either b c) -> f b -> Dec f c -> Dec1 f a
Dec1 (a -> Either b c
g forall b c a. (b -> c) -> (a -> b) -> a -> c
. a' -> a
f) f b
x Dec f c
xs
instance Invariant (Dec1 f) where
invmap :: forall a b. (a -> b) -> (b -> a) -> Dec1 f a -> Dec1 f b
invmap a -> b
_ = forall (f :: * -> *) a' a.
Contravariant f =>
(a' -> a) -> f a -> f a'
contramap
deriving via WrappedDivisible (Dec1 f) instance Inalt (Dec1 f)
instance Decide (Dec1 f) where
decide :: forall a b c. (a -> Either b c) -> Dec1 f b -> Dec1 f c -> Dec1 f a
decide a -> Either b c
f (Dec1 b -> Either b c
g f b
x Dec f c
xs) = forall a b c (f :: * -> *).
(a -> Either b c) -> f b -> Dec f c -> Dec1 f a
Dec1 (forall (p :: * -> * -> *) a b c.
Assoc p =>
p (p a b) c -> p a (p b c)
assoc forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first b -> Either b c
g forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Either b c
f) f b
x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b c.
Decide f =>
(a -> Either b c) -> f b -> f c -> f a
decide forall a. a -> a
id Dec f c
xs
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. Dec1 f a -> Dec f a
toDec
instance HFunctor Dec1 where
hmap :: forall (f :: * -> *) (g :: * -> *). (f ~> g) -> Dec1 f ~> Dec1 g
hmap = forall (f :: * -> *) (g :: * -> *). (f ~> g) -> Dec1 f ~> Dec1 g
hoistDec1
instance Inject Dec1 where
inject :: forall (f :: * -> *). f ~> Dec1 f
inject = forall (f :: * -> *). f ~> Dec1 f
liftDec1
instance Decide f => Interpret Dec1 f where
interpret :: forall (g :: * -> *). (g ~> f) -> Dec1 g ~> f
interpret = forall (g :: * -> *) (f :: * -> *).
Decide g =>
(f ~> g) -> Dec1 f ~> g
runDec1
instance HTraversable Dec1 where
htraverse :: forall (h :: * -> *) (f :: * -> *) (g :: * -> *) a.
Applicative h =>
(forall x. f x -> h (g x)) -> Dec1 f a -> h (Dec1 g a)
htraverse forall x. f x -> h (g x)
f (Dec1 a -> Either b c
g f b
x Dec f c
xs) = forall a b c (f :: * -> *).
(a -> Either b c) -> f b -> Dec f c -> Dec1 f a
Dec1 a -> Either b c
g forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall x. f x -> h (g x)
f f b
x forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall {k} {k1} (t :: (k -> *) -> k1 -> *) (h :: * -> *)
(f :: k -> *) (g :: k -> *) (a :: k1).
(HTraversable t, Applicative h) =>
(forall (x :: k). f x -> h (g x)) -> t f a -> h (t g a)
htraverse forall x. f x -> h (g x)
f Dec f c
xs
instance HTraversable1 Dec1 where
htraverse1 :: forall (h :: * -> *) (f :: * -> *) (g :: * -> *) a.
Apply h =>
(forall x. f x -> h (g x)) -> Dec1 f a -> h (Dec1 g a)
htraverse1 forall x. f x -> h (g x)
f (Dec1 a -> Either b c
g f b
x Dec f c
xs) = forall (f :: * -> *) (g :: * -> *) (h :: * -> *) a b c.
Apply h =>
(forall x. f x -> h (g x))
-> (a -> Either b c) -> f b -> Dec f c -> h (Dec1 g a)
traverseDec1_ forall x. f x -> h (g x)
f a -> Either b c
g f b
x Dec f c
xs
hoistDec1 :: forall f g. (f ~> g) -> Dec1 f ~> Dec1 g
hoistDec1 :: forall (f :: * -> *) (g :: * -> *). (f ~> g) -> Dec1 f ~> Dec1 g
hoistDec1 f ~> g
f (Dec1 x -> Either b c
g f b
x Dec f c
xs) = forall a b c (f :: * -> *).
(a -> Either b c) -> f b -> Dec f c -> Dec1 f a
Dec1 x -> Either b c
g (f ~> g
f f b
x) (forall (f :: * -> *) (g :: * -> *). (f ~> g) -> Dec f ~> Dec g
hoistDec f ~> g
f Dec f c
xs)
liftDec1 :: f ~> Dec1 f
liftDec1 :: forall (f :: * -> *). f ~> Dec1 f
liftDec1 f x
x = forall a b c (f :: * -> *).
(a -> Either b c) -> f b -> Dec f c -> Dec1 f a
Dec1 forall a b. a -> Either a b
Left f x
x (forall a (f :: * -> *). (a -> Void) -> Dec f a
Lose forall a. a -> a
id)
runDec1 :: Decide g => (f ~> g) -> Dec1 f ~> g
runDec1 :: forall (g :: * -> *) (f :: * -> *).
Decide g =>
(f ~> g) -> Dec1 f ~> g
runDec1 f ~> g
f (Dec1 x -> Either b c
g f b
x Dec f c
xs) = forall (f :: * -> *) (g :: * -> *) a b c.
Decide g =>
(f ~> g) -> (a -> Either b c) -> f b -> Dec f c -> g a
runDec1_ f ~> g
f x -> Either b c
g f b
x Dec f c
xs
runDec1_
:: forall f g a b c. Decide g
=> (f ~> g)
-> (a -> Either b c)
-> f b
-> Dec f c
-> g a
runDec1_ :: forall (f :: * -> *) (g :: * -> *) a b c.
Decide g =>
(f ~> g) -> (a -> Either b c) -> f b -> Dec f c -> g a
runDec1_ f ~> g
f = forall x y z. (x -> Either y z) -> f y -> Dec f z -> g x
go
where
go :: (x -> Either y z) -> f y -> Dec f z -> g x
go :: forall x y z. (x -> Either y z) -> f y -> Dec f z -> g x
go x -> Either y z
g f y
x = \case
Lose z -> Void
h -> forall (f :: * -> *) a' a.
Contravariant f =>
(a' -> a) -> f a -> f a'
contramap (forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall a. a -> a
id (forall a. Void -> a
absurd forall b c a. (b -> c) -> (a -> b) -> a -> c
. z -> Void
h) forall b c a. (b -> c) -> (a -> b) -> a -> c
. x -> Either y z
g) (f ~> g
f f y
x)
Choose z -> Either b c
h f b
y Dec f c
ys -> forall (f :: * -> *) a b c.
Decide f =>
(a -> Either b c) -> f b -> f c -> f a
decide x -> Either y z
g (f ~> g
f f y
x) (forall x y z. (x -> Either y z) -> f y -> Dec f z -> g x
go z -> Either b c
h f b
y Dec f c
ys)
traverseDec1_
:: forall f g h a b c. Apply h
=> (forall x. f x -> h (g x))
-> (a -> Either b c)
-> f b
-> Dec f c
-> h (Dec1 g a)
traverseDec1_ :: forall (f :: * -> *) (g :: * -> *) (h :: * -> *) a b c.
Apply h =>
(forall x. f x -> h (g x))
-> (a -> Either b c) -> f b -> Dec f c -> h (Dec1 g a)
traverseDec1_ forall x. f x -> h (g x)
f = forall x y z. (x -> Either y z) -> f y -> Dec f z -> h (Dec1 g x)
go
where
go :: (x -> Either y z) -> f y -> Dec f z -> h (Dec1 g x)
go :: forall x y z. (x -> Either y z) -> f y -> Dec f z -> h (Dec1 g x)
go x -> Either y z
g f y
x = \case
Lose z -> Void
h -> (\g y
x' -> forall a b c (f :: * -> *).
(a -> Either b c) -> f b -> Dec f c -> Dec1 f a
Dec1 x -> Either y z
g g y
x' (forall a (f :: * -> *). (a -> Void) -> Dec f a
Lose z -> Void
h)) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall x. f x -> h (g x)
f f y
x
Choose z -> Either b c
h f b
y Dec f c
ys -> forall a b c (f :: * -> *).
(a -> Either b c) -> f b -> Dec f c -> Dec1 f a
Dec1 x -> Either y z
g forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall x. f x -> h (g x)
f f y
x forall (f :: * -> *) a b. Apply f => f (a -> b) -> f a -> f b
<.> (forall (f :: * -> *) a. Dec1 f a -> Dec f a
toDec forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall x y z. (x -> Either y z) -> f y -> Dec f z -> h (Dec1 g x)
go z -> Either b c
h f b
y Dec f c
ys)