-- |
-- Module      : Data.HFunctor.Final
-- Copyright   : (c) Justin Le 2019
-- License     : BSD3
--
-- Maintainer  : justin@jle.im
-- Stability   : experimental
-- Portability : non-portable
--
-- Provides 'Final', which can be considered the "free 'Interpret' over
-- a constraint": generate a handy 'Interpret' instance for any constraint
-- @c@.
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

-- | A simple way to inject/reject into any eventual typeclass.
--
-- In a way, this is the "ultimate" multi-purpose 'Interpret' instance.
-- You can use this to inject an @f@ into a free structure of any
-- typeclass.  If you want @f@ to have a 'Monad' instance, for example,
-- just use
--
-- @
-- 'inject' :: f a -> 'Final' 'Monad' f a
-- @
--
-- When you want to eventually interpret out the data, use:
--
-- @
-- 'interpret' :: (f '~>' g) -> 'Final' c f a -> g a
-- @
--
-- Essentially, @'Final' c@ is the "free c".  @'Final' 'Monad'@ is the free
-- 'Monad', etc.
--
-- 'Final' can theoretically replace 'Ap', 'Ap1', 'ListF', 'NonEmptyF',
-- 'MaybeF', 'Free', 'Data.Functor.Identity.Identity', 'Coyoneda', and
-- other instances of 'FreeOf', if you don't care about being able to
-- pattern match on explicit structure.
--
-- However, it cannot replace 'Interpret' instances that are not free
-- structures, like 'Control.Applicative.Step.Step',
-- 'Control.Applicative.Step.Steps',
-- 'Control.Applicative.Backwards.Backwards', etc.
--
-- Note that this doesn't have instances for /all/ the typeclasses you
-- could lift things into; you probably have to define your own if you want
-- to use @'Final' c@ as an /instance/ of @c@ (using 'liftFinal0',
-- 'liftFinal1', 'liftFinal2' for help).
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 }

-- | Lift an action into a 'Final'.
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

-- | Map the action in a 'Final'.
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)

-- | Merge two 'Final' actions.
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)
-- | @since 0.3.0.0
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
(<|>)
-- | @since 0.3.0.0
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
-- | @since 0.3.0.0
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
(<|>)
-- | @since 0.3.0.0
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

-- | @since 0.3.0.0
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)

-- | @since 0.3.0.0
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)
-- | @since 0.3.0.0
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)

-- | @since 0.3.0.0
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)
-- | @since 0.3.0.0
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)
-- | @since 0.3.0.0
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

-- | @since 0.3.0.0
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)
-- | @since 0.3.0.0
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)

-- | @since 0.3.0.0
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)
-- | @since 0.3.0.0
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)
-- | @since 0.3.0.0
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)

-- | @since 0.3.0.0
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)
-- | @since 0.3.0.0
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
-- | @since 0.3.0.0
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)
-- | @since 0.3.0.0
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)
-- | @since 0.3.0.0
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)

-- | @since 0.3.0.0
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)

-- | Re-interpret the context under a 'Final'.
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

-- | "Finalize" an 'Interpret' instance.
--
-- @
-- toFinal :: 'Coyoneda' f '~>' 'Final' 'Functor' f
-- toFinal :: 'Ap' f '~>' 'Final' 'Applicative' f
-- toFinal :: 'Alt' f '~>' 'Final' 'Alternative' f
-- toFinal :: 'Free' f '~>' 'Final' 'Monad' f
-- toFinal :: 'Lift' f '~>' 'Final' 'Pointed' f
-- toFinal :: 'ListF' f '~>' 'Final' 'Plus' f
-- @
--
-- Note that the instance of @c@ for @'Final' c@ must be defined.
--
-- This operation can potentially /forget/ structure in @t@.  For example,
-- we have:
--
-- @
-- 'toFinal' :: 'Control.Applicative.Step.Steps' f ~> 'Final' 'Alt' f
-- @
--
-- In this process, we lose the "positional" structure of
-- 'Control.Applicative.Step.Steps'.
--
-- In the case where 'toFinal' doesn't lose any information, this will form
-- an isomorphism with 'fromFinal', and @t@ is known as the "Free @c@".
-- For such a situation, @t@ will have a 'FreeOf' instance.
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

-- | "Concretize" a 'Final'.
--
-- @
-- fromFinal :: 'Final' 'Functor' f '~>' 'Coyoneda' f
-- fromFinal :: 'Final' 'Applicative' f '~>' 'Ap' f
-- fromFinal :: 'Final' 'Alternative' f '~>' 'Alt' f
-- fromFinal :: 'Final' 'Monad' f '~>' 'Free' f
-- fromFinal :: 'Final' 'Pointed' f '~>' 'Lift' f
-- fromFinal :: 'Final' 'Plus' f '~>' 'ListF' f
-- @
--
-- This can be useful because 'Final' doesn't have a concrete structure
-- that you can pattern match on and inspect, but @t@ might.
--
-- In the case that this forms an isomorphism with 'toFinal', the @t@ will
-- have an instance of 'FreeOf'.
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

-- | A typeclass associating a free structure with the typeclass it is free
-- on.
--
-- This essentially lists instances of 'Interpret' where a "trip" through
-- 'Final' will leave it unchanged.
--
-- @
-- 'fromFree' . 'toFree' == id
-- 'toFree' . 'fromFree' == id
-- @
--
-- This can be useful because 'Final' doesn't have a concrete structure
-- that you can pattern match on and inspect, but @t@ might.  This lets you
-- work on a concrete structure if you desire.
class FreeOf c t | t -> c where
    -- | What "type" of functor is expected: should be either
    -- 'Unconstrained', 'Functor', 'Contravariant', or 'Invariant'.
    --
    -- @since 0.3.0.0
    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

-- | The isomorphism between a free structure and its encoding as 'Final'.
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
-- | @since 0.3.0.0
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
-- | This could also be @'FreeOf' 'Divise'@ if @'FreeFunctorBy' 'NonEmptyF'
-- ~ 'Contravariant'@.  However, there isn't really a way to express this
-- at the moment.
instance FreeOf Alt           NonEmptyF  where type FreeFunctorBy NonEmptyF = Functor
-- | This could also be @'FreeOf' 'Divisible'@ if @'FreeFunctorBy' 'ListF'
-- ~ 'Contravariant'@.  However, there isn't really a way to express this
-- at the moment.
instance FreeOf Plus          ListF      where type FreeFunctorBy ListF = Functor
-- | @since 0.3.0.0
instance FreeOf Divise        Div1
-- | @since 0.3.0.0
instance FreeOf Divisible     Div
-- | @since 0.3.0.0
instance FreeOf Decide        Dec1
-- | @since 0.3.0.0
instance FreeOf Conclude      Dec
instance FreeOf Unconstrained IdentityT