module Data.HFunctor.Final (
Final(..)
, fromFinal, toFinal
, FreeOf(..), finalizing
, hoistFinalC
, liftFinal0
, liftFinal1
, liftFinal2
) where
import Control.Applicative
import Control.Applicative.Free
import Control.Applicative.Lift
import Control.Applicative.ListF
import Control.Monad
import Control.Monad.Freer.Church hiding (toFree)
import Control.Monad.Reader
import Control.Monad.Trans.Identity
import Control.Natural
import Control.Natural.IsoF
import Data.Constraint.Trivial
import Data.Functor.Apply.Free
import Data.Functor.Bind
import Data.Functor.Contravariant
import Data.Functor.Contravariant.Conclude
import Data.Functor.Contravariant.Decide
import Data.Functor.Contravariant.Divise
import Data.Functor.Contravariant.Divisible
import Data.Functor.Contravariant.Divisible.Free
import Data.Functor.Coyoneda
import Data.Functor.Invariant
import Data.Functor.Plus
import Data.HFunctor
import Data.HFunctor.Interpret
import Data.Kind
import Data.Pointed
import qualified Control.Alternative.Free as Alt
import qualified Control.Applicative.Free.Fast as FAF
import qualified Data.Functor.Contravariant.Coyoneda as CCY
newtype Final c f a = Final
{ Final c f a
-> forall (g :: k -> *).
c g =>
(forall (x :: k). f x -> g x) -> g a
runFinal :: forall g. c g => (forall x. f x -> g x) -> g a }
liftFinal0
:: (forall g. c g => g a)
-> Final c f a
liftFinal0 :: (forall (g :: k -> *). c g => g a) -> Final c f a
liftFinal0 x :: forall (g :: k -> *). c g => g a
x = (forall (g :: k -> *). c g => (forall (x :: k). f x -> g x) -> g a)
-> Final c f a
forall k (c :: (k -> *) -> Constraint) (f :: k -> *) (a :: k).
(forall (g :: k -> *). c g => (forall (x :: k). f x -> g x) -> g a)
-> Final c f a
Final ((forall (g :: k -> *).
c g =>
(forall (x :: k). f x -> g x) -> g a)
-> Final c f a)
-> (forall (g :: k -> *).
c g =>
(forall (x :: k). f x -> g x) -> g a)
-> Final c f a
forall a b. (a -> b) -> a -> b
$ \_ -> g a
forall (g :: k -> *). c g => g a
x
liftFinal1
:: (forall g. c g => g a -> g b)
-> Final c f a
-> Final c f b
liftFinal1 :: (forall (g :: k -> *). c g => g a -> g b)
-> Final c f a -> Final c f b
liftFinal1 f :: forall (g :: k -> *). c g => g a -> g b
f x :: Final c f a
x = (forall (g :: k -> *). c g => (forall (x :: k). f x -> g x) -> g b)
-> Final c f b
forall k (c :: (k -> *) -> Constraint) (f :: k -> *) (a :: k).
(forall (g :: k -> *). c g => (forall (x :: k). f x -> g x) -> g a)
-> Final c f a
Final ((forall (g :: k -> *).
c g =>
(forall (x :: k). f x -> g x) -> g b)
-> Final c f b)
-> (forall (g :: k -> *).
c g =>
(forall (x :: k). f x -> g x) -> g b)
-> Final c f b
forall a b. (a -> b) -> a -> b
$ \r :: forall (x :: k). f x -> g x
r -> g a -> g b
forall (g :: k -> *). c g => g a -> g b
f (Final c f a -> (forall (x :: k). f x -> g x) -> g a
forall k (c :: (k -> *) -> Constraint) (f :: k -> *) (a :: k).
Final c f a
-> forall (g :: k -> *).
c g =>
(forall (x :: k). f x -> g x) -> g a
runFinal Final c f a
x forall (x :: k). f x -> g x
r)
liftFinal2
:: (forall g. c g => g a -> g b -> g d)
-> Final c f a
-> Final c f b
-> Final c f d
liftFinal2 :: (forall (g :: k -> *). c g => g a -> g b -> g d)
-> Final c f a -> Final c f b -> Final c f d
liftFinal2 f :: forall (g :: k -> *). c g => g a -> g b -> g d
f x :: Final c f a
x y :: Final c f b
y = (forall (g :: k -> *). c g => (forall (x :: k). f x -> g x) -> g d)
-> Final c f d
forall k (c :: (k -> *) -> Constraint) (f :: k -> *) (a :: k).
(forall (g :: k -> *). c g => (forall (x :: k). f x -> g x) -> g a)
-> Final c f a
Final ((forall (g :: k -> *).
c g =>
(forall (x :: k). f x -> g x) -> g d)
-> Final c f d)
-> (forall (g :: k -> *).
c g =>
(forall (x :: k). f x -> g x) -> g d)
-> Final c f d
forall a b. (a -> b) -> a -> b
$ \r :: forall (x :: k). f x -> g x
r -> g a -> g b -> g d
forall (g :: k -> *). c g => g a -> g b -> g d
f (Final c f a -> (forall (x :: k). f x -> g x) -> g a
forall k (c :: (k -> *) -> Constraint) (f :: k -> *) (a :: k).
Final c f a
-> forall (g :: k -> *).
c g =>
(forall (x :: k). f x -> g x) -> g a
runFinal Final c f a
x forall (x :: k). f x -> g x
r) (Final c f b -> (forall (x :: k). f x -> g x) -> g b
forall k (c :: (k -> *) -> Constraint) (f :: k -> *) (a :: k).
Final c f a
-> forall (g :: k -> *).
c g =>
(forall (x :: k). f x -> g x) -> g a
runFinal Final c f b
y forall (x :: k). f x -> g x
r)
instance Functor (Final Functor f) where
fmap :: (a -> b) -> Final Functor f a -> Final Functor f b
fmap f :: a -> b
f = (forall (g :: * -> *). Functor g => g a -> g b)
-> Final Functor f a -> Final Functor f b
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b)
-> Final c f a -> Final c f b
liftFinal1 ((a -> b) -> g a -> g b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f)
instance Functor (Final Apply f) where
fmap :: (a -> b) -> Final Apply f a -> Final Apply f b
fmap f :: a -> b
f = (forall (g :: * -> *). Apply g => g a -> g b)
-> Final Apply f a -> Final Apply f b
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b)
-> Final c f a -> Final c f b
liftFinal1 ((a -> b) -> g a -> g b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f)
instance Apply (Final Apply f) where
<.> :: Final Apply f (a -> b) -> Final Apply f a -> Final Apply f b
(<.>) = (forall (g :: * -> *). Apply g => g (a -> b) -> g a -> g b)
-> Final Apply f (a -> b) -> Final Apply f a -> Final Apply f b
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k) (d :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b -> g d)
-> Final c f a -> Final c f b -> Final c f d
liftFinal2 forall (g :: * -> *). Apply g => g (a -> b) -> g a -> g b
forall (f :: * -> *) a b. Apply f => f (a -> b) -> f a -> f b
(<.>)
liftF2 :: (a -> b -> c)
-> Final Apply f a -> Final Apply f b -> Final Apply f c
liftF2 f :: a -> b -> c
f = (forall (g :: * -> *). Apply g => g a -> g b -> g c)
-> Final Apply f a -> Final Apply f b -> Final Apply f c
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k) (d :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b -> g d)
-> Final c f a -> Final c f b -> Final c f d
liftFinal2 ((a -> b -> c) -> g a -> g b -> g c
forall (f :: * -> *) a b c.
Apply f =>
(a -> b -> c) -> f a -> f b -> f c
liftF2 a -> b -> c
f)
instance Functor (Final Bind f) where
fmap :: (a -> b) -> Final Bind f a -> Final Bind f b
fmap f :: a -> b
f = (forall (g :: * -> *). Bind g => g a -> g b)
-> Final Bind f a -> Final Bind f b
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b)
-> Final c f a -> Final c f b
liftFinal1 ((a -> b) -> g a -> g b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f)
instance Apply (Final Bind f) where
<.> :: Final Bind f (a -> b) -> Final Bind f a -> Final Bind f b
(<.>) = (forall (g :: * -> *). Bind g => g (a -> b) -> g a -> g b)
-> Final Bind f (a -> b) -> Final Bind f a -> Final Bind f b
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k) (d :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b -> g d)
-> Final c f a -> Final c f b -> Final c f d
liftFinal2 forall (f :: * -> *) a b. Apply f => f (a -> b) -> f a -> f b
forall (g :: * -> *). Bind g => g (a -> b) -> g a -> g b
(<.>)
liftF2 :: (a -> b -> c) -> Final Bind f a -> Final Bind f b -> Final Bind f c
liftF2 f :: a -> b -> c
f = (forall (g :: * -> *). Bind g => g a -> g b -> g c)
-> Final Bind f a -> Final Bind f b -> Final Bind f c
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k) (d :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b -> g d)
-> Final c f a -> Final c f b -> Final c f d
liftFinal2 ((a -> b -> c) -> g a -> g b -> g c
forall (f :: * -> *) a b c.
Apply f =>
(a -> b -> c) -> f a -> f b -> f c
liftF2 a -> b -> c
f)
instance Bind (Final Bind f) where
x :: Final Bind f a
x >>- :: Final Bind f a -> (a -> Final Bind f b) -> Final Bind f b
>>- f :: a -> Final Bind f b
f = (forall (g :: * -> *). Bind g => (forall x. f x -> g x) -> g b)
-> Final Bind f b
forall k (c :: (k -> *) -> Constraint) (f :: k -> *) (a :: k).
(forall (g :: k -> *). c g => (forall (x :: k). f x -> g x) -> g a)
-> Final c f a
Final ((forall (g :: * -> *). Bind g => (forall x. f x -> g x) -> g b)
-> Final Bind f b)
-> (forall (g :: * -> *). Bind g => (forall x. f x -> g x) -> g b)
-> Final Bind f b
forall a b. (a -> b) -> a -> b
$ \r :: forall x. f x -> g x
r -> Final Bind f a -> (forall x. f x -> g x) -> g a
forall k (c :: (k -> *) -> Constraint) (f :: k -> *) (a :: k).
Final c f a
-> forall (g :: k -> *).
c g =>
(forall (x :: k). f x -> g x) -> g a
runFinal Final Bind f a
x forall x. f x -> g x
r g a -> (a -> g b) -> g b
forall (m :: * -> *) a b. Bind m => m a -> (a -> m b) -> m b
>>- \y :: a
y -> Final Bind f b -> (forall x. f x -> g x) -> g b
forall k (c :: (k -> *) -> Constraint) (f :: k -> *) (a :: k).
Final c f a
-> forall (g :: k -> *).
c g =>
(forall (x :: k). f x -> g x) -> g a
runFinal (a -> Final Bind f b
f a
y) forall x. f x -> g x
r
instance Functor (Final Applicative f) where
fmap :: (a -> b) -> Final Applicative f a -> Final Applicative f b
fmap f :: a -> b
f = (forall (g :: * -> *). Applicative g => g a -> g b)
-> Final Applicative f a -> Final Applicative f b
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b)
-> Final c f a -> Final c f b
liftFinal1 ((a -> b) -> g a -> g b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f)
instance Apply (Final Applicative f) where
<.> :: Final Applicative f (a -> b)
-> Final Applicative f a -> Final Applicative f b
(<.>) = (forall (g :: * -> *). Applicative g => g (a -> b) -> g a -> g b)
-> Final Applicative f (a -> b)
-> Final Applicative f a
-> Final Applicative f b
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k) (d :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b -> g d)
-> Final c f a -> Final c f b -> Final c f d
liftFinal2 forall (g :: * -> *). Applicative g => g (a -> b) -> g a -> g b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
(<*>)
liftF2 :: (a -> b -> c)
-> Final Applicative f a
-> Final Applicative f b
-> Final Applicative f c
liftF2 f :: a -> b -> c
f = (forall (g :: * -> *). Applicative g => g a -> g b -> g c)
-> Final Applicative f a
-> Final Applicative f b
-> Final Applicative f c
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k) (d :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b -> g d)
-> Final c f a -> Final c f b -> Final c f d
liftFinal2 ((a -> b -> c) -> g a -> g b -> g c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 a -> b -> c
f)
instance Applicative (Final Applicative f) where
pure :: a -> Final Applicative f a
pure x :: a
x = (forall (g :: * -> *). Applicative g => g a)
-> Final Applicative f a
forall k (c :: (k -> *) -> Constraint) (a :: k) (f :: k -> *).
(forall (g :: k -> *). c g => g a) -> Final c f a
liftFinal0 (a -> g a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
x)
<*> :: Final Applicative f (a -> b)
-> Final Applicative f a -> Final Applicative f b
(<*>) = (forall (g :: * -> *). Applicative g => g (a -> b) -> g a -> g b)
-> Final Applicative f (a -> b)
-> Final Applicative f a
-> Final Applicative f b
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k) (d :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b -> g d)
-> Final c f a -> Final c f b -> Final c f d
liftFinal2 forall (g :: * -> *). Applicative g => g (a -> b) -> g a -> g b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
(<*>)
liftA2 :: (a -> b -> c)
-> Final Applicative f a
-> Final Applicative f b
-> Final Applicative f c
liftA2 f :: a -> b -> c
f = (forall (g :: * -> *). Applicative g => g a -> g b -> g c)
-> Final Applicative f a
-> Final Applicative f b
-> Final Applicative f c
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k) (d :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b -> g d)
-> Final c f a -> Final c f b -> Final c f d
liftFinal2 ((a -> b -> c) -> g a -> g b -> g c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 a -> b -> c
f)
instance Functor (Final Alternative f) where
fmap :: (a -> b) -> Final Alternative f a -> Final Alternative f b
fmap f :: a -> b
f = (forall (g :: * -> *). Alternative g => g a -> g b)
-> Final Alternative f a -> Final Alternative f b
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b)
-> Final c f a -> Final c f b
liftFinal1 ((a -> b) -> g a -> g b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f)
instance Apply (Final Alternative f) where
<.> :: Final Alternative f (a -> b)
-> Final Alternative f a -> Final Alternative f b
(<.>) = (forall (g :: * -> *). Alternative g => g (a -> b) -> g a -> g b)
-> Final Alternative f (a -> b)
-> Final Alternative f a
-> Final Alternative f b
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k) (d :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b -> g d)
-> Final c f a -> Final c f b -> Final c f d
liftFinal2 forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
forall (g :: * -> *). Alternative g => g (a -> b) -> g a -> g b
(<*>)
liftF2 :: (a -> b -> c)
-> Final Alternative f a
-> Final Alternative f b
-> Final Alternative f c
liftF2 f :: a -> b -> c
f = (forall (g :: * -> *). Alternative g => g a -> g b -> g c)
-> Final Alternative f a
-> Final Alternative f b
-> Final Alternative f c
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k) (d :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b -> g d)
-> Final c f a -> Final c f b -> Final c f d
liftFinal2 ((a -> b -> c) -> g a -> g b -> g c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 a -> b -> c
f)
instance Applicative (Final Alternative f) where
pure :: a -> Final Alternative f a
pure x :: a
x = (forall (g :: * -> *). Alternative g => g a)
-> Final Alternative f a
forall k (c :: (k -> *) -> Constraint) (a :: k) (f :: k -> *).
(forall (g :: k -> *). c g => g a) -> Final c f a
liftFinal0 (a -> g a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
x)
<*> :: Final Alternative f (a -> b)
-> Final Alternative f a -> Final Alternative f b
(<*>) = (forall (g :: * -> *). Alternative g => g (a -> b) -> g a -> g b)
-> Final Alternative f (a -> b)
-> Final Alternative f a
-> Final Alternative f b
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k) (d :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b -> g d)
-> Final c f a -> Final c f b -> Final c f d
liftFinal2 forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
forall (g :: * -> *). Alternative g => g (a -> b) -> g a -> g b
(<*>)
liftA2 :: (a -> b -> c)
-> Final Alternative f a
-> Final Alternative f b
-> Final Alternative f c
liftA2 f :: a -> b -> c
f = (forall (g :: * -> *). Alternative g => g a -> g b -> g c)
-> Final Alternative f a
-> Final Alternative f b
-> Final Alternative f c
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k) (d :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b -> g d)
-> Final c f a -> Final c f b -> Final c f d
liftFinal2 ((a -> b -> c) -> g a -> g b -> g c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 a -> b -> c
f)
instance Alt (Final Alternative f) where
<!> :: Final Alternative f a
-> Final Alternative f a -> Final Alternative f a
(<!>) = (forall (g :: * -> *). Alternative g => g a -> g a -> g a)
-> Final Alternative f a
-> Final Alternative f a
-> Final Alternative f a
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k) (d :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b -> g d)
-> Final c f a -> Final c f b -> Final c f d
liftFinal2 forall (g :: * -> *). Alternative g => g a -> g a -> g a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
(<|>)
instance Plus (Final Alternative f) where
zero :: Final Alternative f a
zero = (forall (g :: * -> *). Alternative g => g a)
-> Final Alternative f a
forall k (c :: (k -> *) -> Constraint) (a :: k) (f :: k -> *).
(forall (g :: k -> *). c g => g a) -> Final c f a
liftFinal0 forall (g :: * -> *). Alternative g => g a
forall (f :: * -> *) a. Alternative f => f a
empty
instance Alternative (Final Alternative f) where
empty :: Final Alternative f a
empty = (forall (g :: * -> *). Alternative g => g a)
-> Final Alternative f a
forall k (c :: (k -> *) -> Constraint) (a :: k) (f :: k -> *).
(forall (g :: k -> *). c g => g a) -> Final c f a
liftFinal0 forall (g :: * -> *). Alternative g => g a
forall (f :: * -> *) a. Alternative f => f a
empty
<|> :: Final Alternative f a
-> Final Alternative f a -> Final Alternative f a
(<|>) = (forall (g :: * -> *). Alternative g => g a -> g a -> g a)
-> Final Alternative f a
-> Final Alternative f a
-> Final Alternative f a
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k) (d :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b -> g d)
-> Final c f a -> Final c f b -> Final c f d
liftFinal2 forall (g :: * -> *). Alternative g => g a -> g a -> g a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
(<|>)
instance Functor (Final Monad f) where
fmap :: (a -> b) -> Final Monad f a -> Final Monad f b
fmap f :: a -> b
f = (forall (g :: * -> *). Monad g => g a -> g b)
-> Final Monad f a -> Final Monad f b
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b)
-> Final c f a -> Final c f b
liftFinal1 ((a -> b) -> g a -> g b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f)
instance Apply (Final Monad f) where
<.> :: Final Monad f (a -> b) -> Final Monad f a -> Final Monad f b
(<.>) = (forall (g :: * -> *). Monad g => g (a -> b) -> g a -> g b)
-> Final Monad f (a -> b) -> Final Monad f a -> Final Monad f b
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k) (d :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b -> g d)
-> Final c f a -> Final c f b -> Final c f d
liftFinal2 forall (g :: * -> *). Monad g => g (a -> b) -> g a -> g b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
(<*>)
liftF2 :: (a -> b -> c)
-> Final Monad f a -> Final Monad f b -> Final Monad f c
liftF2 f :: a -> b -> c
f = (forall (g :: * -> *). Monad g => g a -> g b -> g c)
-> Final Monad f a -> Final Monad f b -> Final Monad f c
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k) (d :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b -> g d)
-> Final c f a -> Final c f b -> Final c f d
liftFinal2 ((a -> b -> c) -> g a -> g b -> g c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 a -> b -> c
f)
instance Applicative (Final Monad f) where
pure :: a -> Final Monad f a
pure x :: a
x = (forall (g :: * -> *). Monad g => g a) -> Final Monad f a
forall k (c :: (k -> *) -> Constraint) (a :: k) (f :: k -> *).
(forall (g :: k -> *). c g => g a) -> Final c f a
liftFinal0 (a -> g a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
x)
<*> :: Final Monad f (a -> b) -> Final Monad f a -> Final Monad f b
(<*>) = (forall (g :: * -> *). Monad g => g (a -> b) -> g a -> g b)
-> Final Monad f (a -> b) -> Final Monad f a -> Final Monad f b
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k) (d :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b -> g d)
-> Final c f a -> Final c f b -> Final c f d
liftFinal2 forall (g :: * -> *). Monad g => g (a -> b) -> g a -> g b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
(<*>)
liftA2 :: (a -> b -> c)
-> Final Monad f a -> Final Monad f b -> Final Monad f c
liftA2 f :: a -> b -> c
f = (forall (g :: * -> *). Monad g => g a -> g b -> g c)
-> Final Monad f a -> Final Monad f b -> Final Monad f c
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k) (d :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b -> g d)
-> Final c f a -> Final c f b -> Final c f d
liftFinal2 ((a -> b -> c) -> g a -> g b -> g c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 a -> b -> c
f)
instance Monad (Final Monad f) where
return :: a -> Final Monad f a
return x :: a
x = (forall (g :: * -> *). Monad g => g a) -> Final Monad f a
forall k (c :: (k -> *) -> Constraint) (a :: k) (f :: k -> *).
(forall (g :: k -> *). c g => g a) -> Final c f a
liftFinal0 (a -> g a
forall (m :: * -> *) a. Monad m => a -> m a
return a
x)
x :: Final Monad f a
x >>= :: Final Monad f a -> (a -> Final Monad f b) -> Final Monad f b
>>= f :: a -> Final Monad f b
f = (forall (g :: * -> *). Monad g => (forall x. f x -> g x) -> g b)
-> Final Monad f b
forall k (c :: (k -> *) -> Constraint) (f :: k -> *) (a :: k).
(forall (g :: k -> *). c g => (forall (x :: k). f x -> g x) -> g a)
-> Final c f a
Final ((forall (g :: * -> *). Monad g => (forall x. f x -> g x) -> g b)
-> Final Monad f b)
-> (forall (g :: * -> *). Monad g => (forall x. f x -> g x) -> g b)
-> Final Monad f b
forall a b. (a -> b) -> a -> b
$ \r :: forall x. f x -> g x
r -> do
a
y <- Final Monad f a -> (forall x. f x -> g x) -> g a
forall k (c :: (k -> *) -> Constraint) (f :: k -> *) (a :: k).
Final c f a
-> forall (g :: k -> *).
c g =>
(forall (x :: k). f x -> g x) -> g a
runFinal Final Monad f a
x forall x. f x -> g x
r
Final Monad f b -> (forall x. f x -> g x) -> g b
forall k (c :: (k -> *) -> Constraint) (f :: k -> *) (a :: k).
Final c f a
-> forall (g :: k -> *).
c g =>
(forall (x :: k). f x -> g x) -> g a
runFinal (a -> Final Monad f b
f a
y) forall x. f x -> g x
r
instance Functor (Final MonadPlus f) where
fmap :: (a -> b) -> Final MonadPlus f a -> Final MonadPlus f b
fmap f :: a -> b
f = (forall (g :: * -> *). MonadPlus g => g a -> g b)
-> Final MonadPlus f a -> Final MonadPlus f b
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b)
-> Final c f a -> Final c f b
liftFinal1 ((a -> b) -> g a -> g b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f)
instance Applicative (Final MonadPlus f) where
pure :: a -> Final MonadPlus f a
pure x :: a
x = (forall (g :: * -> *). MonadPlus g => g a) -> Final MonadPlus f a
forall k (c :: (k -> *) -> Constraint) (a :: k) (f :: k -> *).
(forall (g :: k -> *). c g => g a) -> Final c f a
liftFinal0 (a -> g a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
x)
<*> :: Final MonadPlus f (a -> b)
-> Final MonadPlus f a -> Final MonadPlus f b
(<*>) = (forall (g :: * -> *). MonadPlus g => g (a -> b) -> g a -> g b)
-> Final MonadPlus f (a -> b)
-> Final MonadPlus f a
-> Final MonadPlus f b
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k) (d :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b -> g d)
-> Final c f a -> Final c f b -> Final c f d
liftFinal2 forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
forall (g :: * -> *). MonadPlus g => g (a -> b) -> g a -> g b
(<*>)
liftA2 :: (a -> b -> c)
-> Final MonadPlus f a
-> Final MonadPlus f b
-> Final MonadPlus f c
liftA2 f :: a -> b -> c
f = (forall (g :: * -> *). MonadPlus g => g a -> g b -> g c)
-> Final MonadPlus f a
-> Final MonadPlus f b
-> Final MonadPlus f c
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k) (d :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b -> g d)
-> Final c f a -> Final c f b -> Final c f d
liftFinal2 ((a -> b -> c) -> g a -> g b -> g c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 a -> b -> c
f)
instance Monad (Final MonadPlus f) where
return :: a -> Final MonadPlus f a
return x :: a
x = (forall (g :: * -> *). MonadPlus g => g a) -> Final MonadPlus f a
forall k (c :: (k -> *) -> Constraint) (a :: k) (f :: k -> *).
(forall (g :: k -> *). c g => g a) -> Final c f a
liftFinal0 (a -> g a
forall (m :: * -> *) a. Monad m => a -> m a
return a
x)
x :: Final MonadPlus f a
x >>= :: Final MonadPlus f a
-> (a -> Final MonadPlus f b) -> Final MonadPlus f b
>>= f :: a -> Final MonadPlus f b
f = (forall (g :: * -> *).
MonadPlus g =>
(forall x. f x -> g x) -> g b)
-> Final MonadPlus f b
forall k (c :: (k -> *) -> Constraint) (f :: k -> *) (a :: k).
(forall (g :: k -> *). c g => (forall (x :: k). f x -> g x) -> g a)
-> Final c f a
Final ((forall (g :: * -> *).
MonadPlus g =>
(forall x. f x -> g x) -> g b)
-> Final MonadPlus f b)
-> (forall (g :: * -> *).
MonadPlus g =>
(forall x. f x -> g x) -> g b)
-> Final MonadPlus f b
forall a b. (a -> b) -> a -> b
$ \r :: forall x. f x -> g x
r -> do
a
y <- Final MonadPlus f a -> (forall x. f x -> g x) -> g a
forall k (c :: (k -> *) -> Constraint) (f :: k -> *) (a :: k).
Final c f a
-> forall (g :: k -> *).
c g =>
(forall (x :: k). f x -> g x) -> g a
runFinal Final MonadPlus f a
x forall x. f x -> g x
r
Final MonadPlus f b -> (forall x. f x -> g x) -> g b
forall k (c :: (k -> *) -> Constraint) (f :: k -> *) (a :: k).
Final c f a
-> forall (g :: k -> *).
c g =>
(forall (x :: k). f x -> g x) -> g a
runFinal (a -> Final MonadPlus f b
f a
y) forall x. f x -> g x
r
instance Alt (Final MonadPlus f) where
<!> :: Final MonadPlus f a -> Final MonadPlus f a -> Final MonadPlus f a
(<!>) = (forall (g :: * -> *). MonadPlus g => g a -> g a -> g a)
-> Final MonadPlus f a
-> Final MonadPlus f a
-> Final MonadPlus f a
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k) (d :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b -> g d)
-> Final c f a -> Final c f b -> Final c f d
liftFinal2 forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
forall (g :: * -> *). MonadPlus g => g a -> g a -> g a
(<|>)
instance Plus (Final MonadPlus f) where
zero :: Final MonadPlus f a
zero = (forall (g :: * -> *). MonadPlus g => g a) -> Final MonadPlus f a
forall k (c :: (k -> *) -> Constraint) (a :: k) (f :: k -> *).
(forall (g :: k -> *). c g => g a) -> Final c f a
liftFinal0 forall (f :: * -> *) a. Alternative f => f a
forall (g :: * -> *). MonadPlus g => g a
empty
instance Alternative (Final MonadPlus f) where
empty :: Final MonadPlus f a
empty = (forall (g :: * -> *). MonadPlus g => g a) -> Final MonadPlus f a
forall k (c :: (k -> *) -> Constraint) (a :: k) (f :: k -> *).
(forall (g :: k -> *). c g => g a) -> Final c f a
liftFinal0 forall (f :: * -> *) a. Alternative f => f a
forall (g :: * -> *). MonadPlus g => g a
empty
<|> :: Final MonadPlus f a -> Final MonadPlus f a -> Final MonadPlus f a
(<|>) = (forall (g :: * -> *). MonadPlus g => g a -> g a -> g a)
-> Final MonadPlus f a
-> Final MonadPlus f a
-> Final MonadPlus f a
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k) (d :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b -> g d)
-> Final c f a -> Final c f b -> Final c f d
liftFinal2 forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
forall (g :: * -> *). MonadPlus g => g a -> g a -> g a
(<|>)
instance MonadPlus (Final MonadPlus f) where
mzero :: Final MonadPlus f a
mzero = (forall (g :: * -> *). MonadPlus g => g a) -> Final MonadPlus f a
forall k (c :: (k -> *) -> Constraint) (a :: k) (f :: k -> *).
(forall (g :: k -> *). c g => g a) -> Final c f a
liftFinal0 forall (g :: * -> *). MonadPlus g => g a
forall (m :: * -> *) a. MonadPlus m => m a
mzero
mplus :: Final MonadPlus f a -> Final MonadPlus f a -> Final MonadPlus f a
mplus = (forall (g :: * -> *). MonadPlus g => g a -> g a -> g a)
-> Final MonadPlus f a
-> Final MonadPlus f a
-> Final MonadPlus f a
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k) (d :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b -> g d)
-> Final c f a -> Final c f b -> Final c f d
liftFinal2 forall (g :: * -> *). MonadPlus g => g a -> g a -> g a
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
mplus
instance Pointed (Final Pointed f) where
point :: a -> Final Pointed f a
point x :: a
x = (forall (g :: * -> *). Pointed g => g a) -> Final Pointed f a
forall k (c :: (k -> *) -> Constraint) (a :: k) (f :: k -> *).
(forall (g :: k -> *). c g => g a) -> Final c f a
liftFinal0 (a -> g a
forall (p :: * -> *) a. Pointed p => a -> p a
point a
x)
instance Functor (Final (MonadReader r) f) where
fmap :: (a -> b) -> Final (MonadReader r) f a -> Final (MonadReader r) f b
fmap f :: a -> b
f = (forall (g :: * -> *). MonadReader r g => g a -> g b)
-> Final (MonadReader r) f a -> Final (MonadReader r) f b
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b)
-> Final c f a -> Final c f b
liftFinal1 ((a -> b) -> g a -> g b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f)
instance Applicative (Final (MonadReader r) f) where
pure :: a -> Final (MonadReader r) f a
pure x :: a
x = (forall (g :: * -> *). MonadReader r g => g a)
-> Final (MonadReader r) f a
forall k (c :: (k -> *) -> Constraint) (a :: k) (f :: k -> *).
(forall (g :: k -> *). c g => g a) -> Final c f a
liftFinal0 (a -> g a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
x)
<*> :: Final (MonadReader r) f (a -> b)
-> Final (MonadReader r) f a -> Final (MonadReader r) f b
(<*>) = (forall (g :: * -> *). MonadReader r g => g (a -> b) -> g a -> g b)
-> Final (MonadReader r) f (a -> b)
-> Final (MonadReader r) f a
-> Final (MonadReader r) f b
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k) (d :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b -> g d)
-> Final c f a -> Final c f b -> Final c f d
liftFinal2 forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
forall (g :: * -> *). MonadReader r g => g (a -> b) -> g a -> g b
(<*>)
liftA2 :: (a -> b -> c)
-> Final (MonadReader r) f a
-> Final (MonadReader r) f b
-> Final (MonadReader r) f c
liftA2 f :: a -> b -> c
f = (forall (g :: * -> *). MonadReader r g => g a -> g b -> g c)
-> Final (MonadReader r) f a
-> Final (MonadReader r) f b
-> Final (MonadReader r) f c
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k) (d :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b -> g d)
-> Final c f a -> Final c f b -> Final c f d
liftFinal2 ((a -> b -> c) -> g a -> g b -> g c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 a -> b -> c
f)
instance Apply (Final (MonadReader r) f) where
<.> :: Final (MonadReader r) f (a -> b)
-> Final (MonadReader r) f a -> Final (MonadReader r) f b
(<.>) = (forall (g :: * -> *). MonadReader r g => g (a -> b) -> g a -> g b)
-> Final (MonadReader r) f (a -> b)
-> Final (MonadReader r) f a
-> Final (MonadReader r) f b
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k) (d :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b -> g d)
-> Final c f a -> Final c f b -> Final c f d
liftFinal2 forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
forall (g :: * -> *). MonadReader r g => g (a -> b) -> g a -> g b
(<*>)
liftF2 :: (a -> b -> c)
-> Final (MonadReader r) f a
-> Final (MonadReader r) f b
-> Final (MonadReader r) f c
liftF2 f :: a -> b -> c
f = (forall (g :: * -> *). MonadReader r g => g a -> g b -> g c)
-> Final (MonadReader r) f a
-> Final (MonadReader r) f b
-> Final (MonadReader r) f c
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k) (d :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b -> g d)
-> Final c f a -> Final c f b -> Final c f d
liftFinal2 ((a -> b -> c) -> g a -> g b -> g c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 a -> b -> c
f)
instance Monad (Final (MonadReader r) f) where
return :: a -> Final (MonadReader r) f a
return x :: a
x = (forall (g :: * -> *). MonadReader r g => g a)
-> Final (MonadReader r) f a
forall k (c :: (k -> *) -> Constraint) (a :: k) (f :: k -> *).
(forall (g :: k -> *). c g => g a) -> Final c f a
liftFinal0 (a -> g a
forall (m :: * -> *) a. Monad m => a -> m a
return a
x)
x :: Final (MonadReader r) f a
x >>= :: Final (MonadReader r) f a
-> (a -> Final (MonadReader r) f b) -> Final (MonadReader r) f b
>>= f :: a -> Final (MonadReader r) f b
f = (forall (g :: * -> *).
MonadReader r g =>
(forall x. f x -> g x) -> g b)
-> Final (MonadReader r) f b
forall k (c :: (k -> *) -> Constraint) (f :: k -> *) (a :: k).
(forall (g :: k -> *). c g => (forall (x :: k). f x -> g x) -> g a)
-> Final c f a
Final ((forall (g :: * -> *).
MonadReader r g =>
(forall x. f x -> g x) -> g b)
-> Final (MonadReader r) f b)
-> (forall (g :: * -> *).
MonadReader r g =>
(forall x. f x -> g x) -> g b)
-> Final (MonadReader r) f b
forall a b. (a -> b) -> a -> b
$ \r :: forall x. f x -> g x
r -> do
a
y <- Final (MonadReader r) f a -> (forall x. f x -> g x) -> g a
forall k (c :: (k -> *) -> Constraint) (f :: k -> *) (a :: k).
Final c f a
-> forall (g :: k -> *).
c g =>
(forall (x :: k). f x -> g x) -> g a
runFinal Final (MonadReader r) f a
x forall x. f x -> g x
r
Final (MonadReader r) f b -> (forall x. f x -> g x) -> g b
forall k (c :: (k -> *) -> Constraint) (f :: k -> *) (a :: k).
Final c f a
-> forall (g :: k -> *).
c g =>
(forall (x :: k). f x -> g x) -> g a
runFinal (a -> Final (MonadReader r) f b
f a
y) forall x. f x -> g x
r
instance MonadReader r (Final (MonadReader r) f) where
ask :: Final (MonadReader r) f r
ask = (forall (g :: * -> *). MonadReader r g => g r)
-> Final (MonadReader r) f r
forall k (c :: (k -> *) -> Constraint) (a :: k) (f :: k -> *).
(forall (g :: k -> *). c g => g a) -> Final c f a
liftFinal0 forall r (m :: * -> *). MonadReader r m => m r
forall (g :: * -> *). MonadReader r g => g r
ask
local :: (r -> r) -> Final (MonadReader r) f a -> Final (MonadReader r) f a
local f :: r -> r
f = (forall (g :: * -> *). MonadReader r g => g a -> g a)
-> Final (MonadReader r) f a -> Final (MonadReader r) f a
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b)
-> Final c f a -> Final c f b
liftFinal1 ((r -> r) -> g a -> g a
forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local r -> r
f)
instance Functor (Final Alt f) where
fmap :: (a -> b) -> Final Alt f a -> Final Alt f b
fmap f :: a -> b
f = (forall (g :: * -> *). Alt g => g a -> g b)
-> Final Alt f a -> Final Alt f b
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b)
-> Final c f a -> Final c f b
liftFinal1 ((a -> b) -> g a -> g b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f)
instance Alt (Final Alt f) where
<!> :: Final Alt f a -> Final Alt f a -> Final Alt f a
(<!>) = (forall (g :: * -> *). Alt g => g a -> g a -> g a)
-> Final Alt f a -> Final Alt f a -> Final Alt f a
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k) (d :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b -> g d)
-> Final c f a -> Final c f b -> Final c f d
liftFinal2 forall (g :: * -> *). Alt g => g a -> g a -> g a
forall (f :: * -> *) a. Alt f => f a -> f a -> f a
(<!>)
instance Functor (Final Plus f) where
fmap :: (a -> b) -> Final Plus f a -> Final Plus f b
fmap f :: a -> b
f = (forall (g :: * -> *). Plus g => g a -> g b)
-> Final Plus f a -> Final Plus f b
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b)
-> Final c f a -> Final c f b
liftFinal1 ((a -> b) -> g a -> g b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f)
instance Alt (Final Plus f) where
<!> :: Final Plus f a -> Final Plus f a -> Final Plus f a
(<!>) = (forall (g :: * -> *). Plus g => g a -> g a -> g a)
-> Final Plus f a -> Final Plus f a -> Final Plus f a
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k) (d :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b -> g d)
-> Final c f a -> Final c f b -> Final c f d
liftFinal2 forall (g :: * -> *). Plus g => g a -> g a -> g a
forall (f :: * -> *) a. Alt f => f a -> f a -> f a
(<!>)
instance Plus (Final Plus f) where
zero :: Final Plus f a
zero = (forall (g :: * -> *). Plus g => g a) -> Final Plus f a
forall k (c :: (k -> *) -> Constraint) (a :: k) (f :: k -> *).
(forall (g :: k -> *). c g => g a) -> Final c f a
liftFinal0 forall (g :: * -> *). Plus g => g a
forall (f :: * -> *) a. Plus f => f a
zero
instance Contravariant (Final Contravariant f) where
contramap :: (a -> b) -> Final Contravariant f b -> Final Contravariant f a
contramap f :: a -> b
f = (forall (g :: * -> *). Contravariant g => g b -> g a)
-> Final Contravariant f b -> Final Contravariant f a
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b)
-> Final c f a -> Final c f b
liftFinal1 ((a -> b) -> g b -> g a
forall (f :: * -> *) a b. Contravariant f => (a -> b) -> f b -> f a
contramap a -> b
f)
instance Contravariant (Final Divise f) where
contramap :: (a -> b) -> Final Divise f b -> Final Divise f a
contramap f :: a -> b
f = (forall (g :: * -> *). Divise g => g b -> g a)
-> Final Divise f b -> Final Divise f a
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b)
-> Final c f a -> Final c f b
liftFinal1 ((a -> b) -> g b -> g a
forall (f :: * -> *) a b. Contravariant f => (a -> b) -> f b -> f a
contramap a -> b
f)
instance Divise (Final Divise f) where
divise :: (a -> (b, c))
-> Final Divise f b -> Final Divise f c -> Final Divise f a
divise f :: a -> (b, c)
f = (forall (g :: * -> *). Divise g => g b -> g c -> g a)
-> Final Divise f b -> Final Divise f c -> Final Divise f a
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k) (d :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b -> g d)
-> Final c f a -> Final c f b -> Final c f d
liftFinal2 ((a -> (b, c)) -> g b -> g c -> g a
forall (f :: * -> *) a b c.
Divise f =>
(a -> (b, c)) -> f b -> f c -> f a
divise a -> (b, c)
f)
instance Contravariant (Final Divisible f) where
contramap :: (a -> b) -> Final Divisible f b -> Final Divisible f a
contramap f :: a -> b
f = (forall (g :: * -> *). Divisible g => g b -> g a)
-> Final Divisible f b -> Final Divisible f a
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b)
-> Final c f a -> Final c f b
liftFinal1 ((a -> b) -> g b -> g a
forall (f :: * -> *) a b. Contravariant f => (a -> b) -> f b -> f a
contramap a -> b
f)
instance Divise (Final Divisible f) where
divise :: (a -> (b, c))
-> Final Divisible f b
-> Final Divisible f c
-> Final Divisible f a
divise f :: a -> (b, c)
f = (forall (g :: * -> *). Divisible g => g b -> g c -> g a)
-> Final Divisible f b
-> Final Divisible f c
-> Final Divisible f a
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k) (d :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b -> g d)
-> Final c f a -> Final c f b -> Final c f d
liftFinal2 ((a -> (b, c)) -> g b -> g c -> g a
forall (f :: * -> *) a b c.
Divisible f =>
(a -> (b, c)) -> f b -> f c -> f a
divide a -> (b, c)
f)
instance Divisible (Final Divisible f) where
divide :: (a -> (b, c))
-> Final Divisible f b
-> Final Divisible f c
-> Final Divisible f a
divide f :: a -> (b, c)
f = (forall (g :: * -> *). Divisible g => g b -> g c -> g a)
-> Final Divisible f b
-> Final Divisible f c
-> Final Divisible f a
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k) (d :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b -> g d)
-> Final c f a -> Final c f b -> Final c f d
liftFinal2 ((a -> (b, c)) -> g b -> g c -> g a
forall (f :: * -> *) a b c.
Divisible f =>
(a -> (b, c)) -> f b -> f c -> f a
divide a -> (b, c)
f)
conquer :: Final Divisible f a
conquer = (forall (g :: * -> *). Divisible g => g a) -> Final Divisible f a
forall k (c :: (k -> *) -> Constraint) (a :: k) (f :: k -> *).
(forall (g :: k -> *). c g => g a) -> Final c f a
liftFinal0 forall (g :: * -> *). Divisible g => g a
forall (f :: * -> *) a. Divisible f => f a
conquer
instance Contravariant (Final Decide f) where
contramap :: (a -> b) -> Final Decide f b -> Final Decide f a
contramap f :: a -> b
f = (forall (g :: * -> *). Decide g => g b -> g a)
-> Final Decide f b -> Final Decide f a
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b)
-> Final c f a -> Final c f b
liftFinal1 ((a -> b) -> g b -> g a
forall (f :: * -> *) a b. Contravariant f => (a -> b) -> f b -> f a
contramap a -> b
f)
instance Decide (Final Decide f) where
decide :: (a -> Either b c)
-> Final Decide f b -> Final Decide f c -> Final Decide f a
decide f :: a -> Either b c
f = (forall (g :: * -> *). Decide g => g b -> g c -> g a)
-> Final Decide f b -> Final Decide f c -> Final Decide f a
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k) (d :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b -> g d)
-> Final c f a -> Final c f b -> Final c f d
liftFinal2 ((a -> Either b c) -> g b -> g c -> g a
forall (f :: * -> *) a b c.
Decide f =>
(a -> Either b c) -> f b -> f c -> f a
decide a -> Either b c
f)
instance Contravariant (Final Conclude f) where
contramap :: (a -> b) -> Final Conclude f b -> Final Conclude f a
contramap f :: a -> b
f = (forall (g :: * -> *). Conclude g => g b -> g a)
-> Final Conclude f b -> Final Conclude f a
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b)
-> Final c f a -> Final c f b
liftFinal1 ((a -> b) -> g b -> g a
forall (f :: * -> *) a b. Contravariant f => (a -> b) -> f b -> f a
contramap a -> b
f)
instance Decide (Final Conclude f) where
decide :: (a -> Either b c)
-> Final Conclude f b -> Final Conclude f c -> Final Conclude f a
decide f :: a -> Either b c
f = (forall (g :: * -> *). Conclude g => g b -> g c -> g a)
-> Final Conclude f b -> Final Conclude f c -> Final Conclude f a
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k) (d :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b -> g d)
-> Final c f a -> Final c f b -> Final c f d
liftFinal2 ((a -> Either b c) -> g b -> g c -> g a
forall (f :: * -> *) a b c.
Decide f =>
(a -> Either b c) -> f b -> f c -> f a
decide a -> Either b c
f)
instance Conclude (Final Conclude f) where
conclude :: (a -> Void) -> Final Conclude f a
conclude f :: a -> Void
f = (forall (g :: * -> *). Conclude g => g a) -> Final Conclude f a
forall k (c :: (k -> *) -> Constraint) (a :: k) (f :: k -> *).
(forall (g :: k -> *). c g => g a) -> Final c f a
liftFinal0 ((a -> Void) -> g a
forall (f :: * -> *) a. Conclude f => (a -> Void) -> f a
conclude a -> Void
f)
instance Contravariant (Final Decidable f) where
contramap :: (a -> b) -> Final Decidable f b -> Final Decidable f a
contramap f :: a -> b
f = (forall (g :: * -> *). Decidable g => g b -> g a)
-> Final Decidable f b -> Final Decidable f a
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b)
-> Final c f a -> Final c f b
liftFinal1 ((a -> b) -> g b -> g a
forall (f :: * -> *) a b. Contravariant f => (a -> b) -> f b -> f a
contramap a -> b
f)
instance Divisible (Final Decidable f) where
divide :: (a -> (b, c))
-> Final Decidable f b
-> Final Decidable f c
-> Final Decidable f a
divide f :: a -> (b, c)
f = (forall (g :: * -> *). Decidable g => g b -> g c -> g a)
-> Final Decidable f b
-> Final Decidable f c
-> Final Decidable f a
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k) (d :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b -> g d)
-> Final c f a -> Final c f b -> Final c f d
liftFinal2 ((a -> (b, c)) -> g b -> g c -> g a
forall (f :: * -> *) a b c.
Divisible f =>
(a -> (b, c)) -> f b -> f c -> f a
divide a -> (b, c)
f)
conquer :: Final Decidable f a
conquer = (forall (g :: * -> *). Decidable g => g a) -> Final Decidable f a
forall k (c :: (k -> *) -> Constraint) (a :: k) (f :: k -> *).
(forall (g :: k -> *). c g => g a) -> Final c f a
liftFinal0 forall (f :: * -> *) a. Divisible f => f a
forall (g :: * -> *). Decidable g => g a
conquer
instance Decide (Final Decidable f) where
decide :: (a -> Either b c)
-> Final Decidable f b
-> Final Decidable f c
-> Final Decidable f a
decide f :: a -> Either b c
f = (forall (g :: * -> *). Decidable g => g b -> g c -> g a)
-> Final Decidable f b
-> Final Decidable f c
-> Final Decidable f a
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k) (d :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b -> g d)
-> Final c f a -> Final c f b -> Final c f d
liftFinal2 ((a -> Either b c) -> g b -> g c -> g a
forall (f :: * -> *) a b c.
Decidable f =>
(a -> Either b c) -> f b -> f c -> f a
choose a -> Either b c
f)
instance Conclude (Final Decidable f) where
conclude :: (a -> Void) -> Final Decidable f a
conclude f :: a -> Void
f = (forall (g :: * -> *). Decidable g => g a) -> Final Decidable f a
forall k (c :: (k -> *) -> Constraint) (a :: k) (f :: k -> *).
(forall (g :: k -> *). c g => g a) -> Final c f a
liftFinal0 ((a -> Void) -> g a
forall (f :: * -> *) a. Decidable f => (a -> Void) -> f a
lose a -> Void
f)
instance Decidable (Final Decidable f) where
choose :: (a -> Either b c)
-> Final Decidable f b
-> Final Decidable f c
-> Final Decidable f a
choose f :: a -> Either b c
f = (forall (g :: * -> *). Decidable g => g b -> g c -> g a)
-> Final Decidable f b
-> Final Decidable f c
-> Final Decidable f a
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k) (d :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b -> g d)
-> Final c f a -> Final c f b -> Final c f d
liftFinal2 ((a -> Either b c) -> g b -> g c -> g a
forall (f :: * -> *) a b c.
Decidable f =>
(a -> Either b c) -> f b -> f c -> f a
choose a -> Either b c
f)
lose :: (a -> Void) -> Final Decidable f a
lose f :: a -> Void
f = (forall (g :: * -> *). Decidable g => g a) -> Final Decidable f a
forall k (c :: (k -> *) -> Constraint) (a :: k) (f :: k -> *).
(forall (g :: k -> *). c g => g a) -> Final c f a
liftFinal0 ((a -> Void) -> g a
forall (f :: * -> *) a. Decidable f => (a -> Void) -> f a
lose a -> Void
f)
instance Invariant (Final Invariant f) where
invmap :: (a -> b) -> (b -> a) -> Final Invariant f a -> Final Invariant f b
invmap f :: a -> b
f g :: b -> a
g = (forall (g :: * -> *). Invariant g => g a -> g b)
-> Final Invariant f a -> Final Invariant f b
forall k (c :: (k -> *) -> Constraint) (a :: k) (b :: k)
(f :: k -> *).
(forall (g :: k -> *). c g => g a -> g b)
-> Final c f a -> Final c f b
liftFinal1 ((a -> b) -> (b -> a) -> g a -> g b
forall (f :: * -> *) a b.
Invariant f =>
(a -> b) -> (b -> a) -> f a -> f b
invmap a -> b
f b -> a
g)
hoistFinalC
:: (forall g x. (c g => g x) -> (d g => g x))
-> Final c f a
-> Final d f a
hoistFinalC :: (forall (g :: k -> *) (x :: k). (c g => g x) -> d g => g x)
-> Final c f a -> Final d f a
hoistFinalC f :: forall (g :: k -> *) (x :: k). (c g => g x) -> d g => g x
f (Final x :: forall (g :: k -> *). c g => (forall (x :: k). f x -> g x) -> g a
x) = (forall (g :: k -> *). d g => (forall (x :: k). f x -> g x) -> g a)
-> Final d f a
forall k (c :: (k -> *) -> Constraint) (f :: k -> *) (a :: k).
(forall (g :: k -> *). c g => (forall (x :: k). f x -> g x) -> g a)
-> Final c f a
Final ((forall (g :: k -> *).
d g =>
(forall (x :: k). f x -> g x) -> g a)
-> Final d f a)
-> (forall (g :: k -> *).
d g =>
(forall (x :: k). f x -> g x) -> g a)
-> Final d f a
forall a b. (a -> b) -> a -> b
$ \r :: forall (x :: k). f x -> g x
r -> (c g => g a) -> d g => g a
forall (g :: k -> *) (x :: k). (c g => g x) -> d g => g x
f ((forall (x :: k). f x -> g x) -> g a
forall (g :: k -> *). c g => (forall (x :: k). f x -> g x) -> g a
x (\y :: f x
y -> (c g => g x) -> d g => g x
forall (g :: k -> *) (x :: k). (c g => g x) -> d g => g x
f (f x -> g x
forall (x :: k). f x -> g x
r f x
y)))
instance HFunctor (Final c) where
hmap :: (f ~> g) -> Final c f ~> Final c g
hmap f :: f ~> g
f x :: Final c f x
x = (forall (g :: k -> *). c g => (forall (x :: k). g x -> g x) -> g x)
-> Final c g x
forall k (c :: (k -> *) -> Constraint) (f :: k -> *) (a :: k).
(forall (g :: k -> *). c g => (forall (x :: k). f x -> g x) -> g a)
-> Final c f a
Final ((forall (g :: k -> *).
c g =>
(forall (x :: k). g x -> g x) -> g x)
-> Final c g x)
-> (forall (g :: k -> *).
c g =>
(forall (x :: k). g x -> g x) -> g x)
-> Final c g x
forall a b. (a -> b) -> a -> b
$ \r :: forall (x :: k). g x -> g x
r -> Final c f x -> (forall (x :: k). f x -> g x) -> g x
forall k (c :: (k -> *) -> Constraint) (f :: k -> *) (a :: k).
Final c f a
-> forall (g :: k -> *).
c g =>
(forall (x :: k). f x -> g x) -> g a
runFinal Final c f x
x (g x -> g x
forall (x :: k). g x -> g x
r (g x -> g x) -> (f x -> g x) -> f x -> g x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. f x -> g x
f ~> g
f)
instance Inject (Final c) where
inject :: f x -> Final c f x
inject x :: f x
x = (forall (g :: k -> *). c g => (forall (x :: k). f x -> g x) -> g x)
-> Final c f x
forall k (c :: (k -> *) -> Constraint) (f :: k -> *) (a :: k).
(forall (g :: k -> *). c g => (forall (x :: k). f x -> g x) -> g a)
-> Final c f a
Final ((f x -> g x) -> f x -> g x
forall a b. (a -> b) -> a -> b
$ f x
x)
instance c f => Interpret (Final c) f where
retract :: Final c f x -> f x
retract x :: Final c f x
x = Final c f x -> (forall (x :: k). f x -> f x) -> f x
forall k (c :: (k -> *) -> Constraint) (f :: k -> *) (a :: k).
Final c f a
-> forall (g :: k -> *).
c g =>
(forall (x :: k). f x -> g x) -> g a
runFinal Final c f x
x forall (x :: k). f x -> f x
forall a. a -> a
id
interpret :: (g ~> f) -> Final c g ~> f
interpret f :: g ~> f
f x :: Final c g x
x = Final c g x -> (g ~> f) -> f x
forall k (c :: (k -> *) -> Constraint) (f :: k -> *) (a :: k).
Final c f a
-> forall (g :: k -> *).
c g =>
(forall (x :: k). f x -> g x) -> g a
runFinal Final c g x
x g ~> f
f
toFinal :: Interpret t (Final c f) => t f ~> Final c f
toFinal :: t f ~> Final c f
toFinal = (f ~> Final c f) -> t f ~> Final c f
forall k (t :: (k -> *) -> k -> *) (f :: k -> *) (g :: k -> *).
Interpret t f =>
(g ~> f) -> t g ~> f
interpret f ~> Final c f
forall k (t :: (k -> *) -> k -> *) (f :: k -> *).
Inject t =>
f ~> t f
inject
fromFinal :: (Inject t, c (t f)) => Final c f ~> t f
fromFinal :: Final c f ~> t f
fromFinal = (f ~> t f) -> Final c f ~> t f
forall k (t :: (k -> *) -> k -> *) (f :: k -> *) (g :: k -> *).
Interpret t f =>
(g ~> f) -> t g ~> f
interpret f ~> t f
forall k (t :: (k -> *) -> k -> *) (f :: k -> *).
Inject t =>
f ~> t f
inject
class FreeOf c t | t -> c where
type FreeFunctorBy t :: (Type -> Type) -> Constraint
type FreeFunctorBy t = Unconstrained
fromFree :: t f ~> Final c f
toFree :: FreeFunctorBy t f => Final c f ~> t f
default fromFree :: Interpret t (Final c f) => t f ~> Final c f
fromFree = t f x -> Final c f x
forall k (t :: (k -> *) -> k -> *) (c :: (k -> *) -> Constraint)
(f :: k -> *).
Interpret t (Final c f) =>
t f ~> Final c f
toFinal
default toFree :: (Inject t, c (t f)) => Final c f ~> t f
toFree = Final c f x -> t f x
forall k (t :: (k -> *) -> k -> *) (c :: (k -> *) -> Constraint)
(f :: k -> *).
(Inject t, c (t f)) =>
Final c f ~> t f
fromFinal
finalizing :: (FreeOf c t, FreeFunctorBy t f) => t f <~> Final c f
finalizing :: t f <~> Final c f
finalizing = (t f ~> Final c f) -> (Final c f ~> t f) -> t f <~> Final c f
forall k (f :: k -> *) (g :: k -> *).
(f ~> g) -> (g ~> f) -> f <~> g
isoF t f ~> Final c f
forall (c :: (* -> *) -> Constraint) (t :: (* -> *) -> * -> *)
(f :: * -> *).
FreeOf c t =>
t f ~> Final c f
fromFree Final c f ~> t f
forall (c :: (* -> *) -> Constraint) (t :: (* -> *) -> * -> *)
(f :: * -> *).
(FreeOf c t, FreeFunctorBy t f) =>
Final c f ~> t f
toFree
instance FreeOf Functor Coyoneda
instance FreeOf Contravariant CCY.Coyoneda
instance FreeOf Applicative Ap
instance FreeOf Apply Ap1
instance FreeOf Applicative FAF.Ap
instance FreeOf Alternative Alt.Alt
instance FreeOf Monad Free
instance FreeOf Bind Free1
instance FreeOf Pointed Lift
instance FreeOf Pointed MaybeApply
instance FreeOf Alt NonEmptyF where type FreeFunctorBy NonEmptyF = Functor
instance FreeOf Plus ListF where type FreeFunctorBy ListF = Functor
instance FreeOf Divise Div1
instance FreeOf Divisible Div
instance FreeOf Decide Dec1
instance FreeOf Conclude Dec
instance FreeOf Unconstrained IdentityT