module Data.Functor.Combinator (
type (~>)
, type (<~>)
, HFunctor(..)
, Inject(..)
, Interpret(..)
, forI
, iget, icollect, icollect1
, iapply, ifanout, ifanout1
, getI, collectI
, AltConst(..)
, HBifunctor(..)
, Associative(..)
, SemigroupIn(..)
, biget, biapply
, (!*!)
, (!+!)
, (!$!)
, Tensor(..)
, MonoidIn(..)
, nilLB, consLB
, inL, inR
, outL, outR
, Coyoneda(..)
, ListF(..)
, NonEmptyF(..)
, MaybeF(..)
, MapF(..)
, NEMapF(..)
, Ap
, Ap1(..)
, Alt
, Free
, Free1
, Lift
, Step(..)
, Steps(..)
, ProxyF(..)
, ConstF(..)
, EnvT(..)
, ReaderT(..)
, Flagged(..)
, IdentityT(..)
, Void2
, Final(..)
, FreeOf(..)
, ComposeT(..)
, Day(..)
, (:*:)(..), prodOutL, prodOutR
, (:+:)(..), V1
, These1(..)
, Night(..), Not(..), refuted
, Comp(Comp, unComp)
, LeftF(..)
, RightF(..)
, HLift(..)
, HFree(..)
, generalize
, absorb
, divideN
, diviseN
, concludeN
, decideN
, divideNRec
, diviseNRec
) where
import Control.Alternative.Free
import Control.Applicative.Free
import Control.Applicative.Lift
import Control.Applicative.ListF
import Control.Applicative.Step
import Control.Comonad.Trans.Env
import Control.Monad.Freer.Church
import Control.Monad.Trans.Compose
import Control.Monad.Trans.Identity
import Control.Monad.Trans.Reader
import Control.Natural
import Control.Natural.IsoF
import Data.Functor.Apply.Free
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.Coyoneda
import Data.Functor.Day
import Data.Functor.Invariant.Night
import Data.Functor.These
import Data.HBifunctor
import Data.HBifunctor.Associative
import Data.HBifunctor.Tensor
import Data.HFunctor
import Data.HFunctor.Final
import Data.HFunctor.Internal
import Data.HFunctor.Interpret
import GHC.Generics
import qualified Data.SOP as SOP
import qualified Data.Vinyl as V
import qualified Data.Vinyl.Functor as V
divideN
:: Divisible f
=> SOP.NP f as
-> f (SOP.NP SOP.I as)
divideN :: NP f as -> f (NP I as)
divideN = \case
SOP.Nil -> f (NP I as)
forall (f :: * -> *) a. Divisible f => f a
conquer
x :: f x
x SOP.:* xs :: NP f xs
xs -> (NP I as -> (x, NP I xs)) -> f x -> f (NP I xs) -> f (NP I as)
forall (f :: * -> *) a b c.
Divisible f =>
(a -> (b, c)) -> f b -> f c -> f a
divide
(\case SOP.I y SOP.:* ys :: NP I xs
ys -> (x
y, NP I xs
NP I xs
ys))
f x
x
(NP f xs -> f (NP I xs)
forall (f :: * -> *) (as :: [*]).
Divisible f =>
NP f as -> f (NP I as)
divideN NP f xs
xs)
divideNRec
:: Divisible f
=> V.Rec f as
-> f (V.XRec V.Identity as)
divideNRec :: Rec f as -> f (XRec Identity as)
divideNRec = \case
V.RNil -> f (XRec Identity as)
forall (f :: * -> *) a. Divisible f => f a
conquer
x :: f r
x V.:& xs :: Rec f rs
xs -> (XRec Identity (r : rs) -> (r, XRec Identity rs))
-> f r -> f (XRec Identity rs) -> f (XRec Identity (r : rs))
forall (f :: * -> *) a b c.
Divisible f =>
(a -> (b, c)) -> f b -> f c -> f a
divide
(\case z :: HKD Identity r
z V.::& zs :: XRec Identity rs
zs -> (r
HKD Identity r
z, XRec Identity rs
zs))
f r
x
(Rec f rs -> f (XRec Identity rs)
forall (f :: * -> *) (as :: [*]).
Divisible f =>
Rec f as -> f (XRec Identity as)
divideNRec Rec f rs
xs)
diviseNRec
:: Divise f
=> V.Rec f (a ': as)
-> f (V.XRec V.Identity (a ': as))
diviseNRec :: Rec f (a : as) -> f (XRec Identity (a : as))
diviseNRec = \case
x :: f r
x V.:& xs :: Rec f rs
xs -> case Rec f rs
xs of
V.RNil -> (XRec Identity (a : as) -> r) -> f r -> f (XRec Identity (a : as))
forall (f :: * -> *) a b. Contravariant f => (a -> b) -> f b -> f a
contramap (\case z :: HKD Identity a
z V.::& _ -> r
HKD Identity a
z) f r
x
_ V.:& _ -> (XRec Identity (a : r : rs) -> (r, XRec Identity (r : rs)))
-> f r
-> f (XRec Identity (r : rs))
-> f (XRec Identity (a : r : rs))
forall (f :: * -> *) a b c.
Divise f =>
(a -> (b, c)) -> f b -> f c -> f a
divise
(\case z :: HKD Identity a
z V.::& zs :: XRec Identity (r : rs)
zs -> (r
HKD Identity a
z,XRec Identity (r : rs)
zs))
f r
x
(Rec f (r : rs) -> f (XRec Identity (r : rs))
forall (f :: * -> *) a (as :: [*]).
Divise f =>
Rec f (a : as) -> f (XRec Identity (a : as))
diviseNRec Rec f rs
Rec f (r : rs)
xs)
diviseN
:: Divise f
=> SOP.NP f (a ': as)
-> f (SOP.NP SOP.I (a ': as))
diviseN :: NP f (a : as) -> f (NP I (a : as))
diviseN = \case
x :: f x
x SOP.:* xs :: NP f xs
xs -> case NP f xs
xs of
SOP.Nil -> (NP I (x : as) -> x) -> f x -> f (NP I (x : as))
forall (f :: * -> *) a b. Contravariant f => (a -> b) -> f b -> f a
contramap (I x -> x
forall a. I a -> a
SOP.unI (I x -> x) -> (NP I (x : as) -> I x) -> NP I (x : as) -> x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NP I (x : as) -> I x
forall k (f :: k -> *) (x :: k) (xs :: [k]). NP f (x : xs) -> f x
SOP.hd) f x
x
_ SOP.:* _ -> (NP I (a : as) -> (x, NP I (x : xs)))
-> f x -> f (NP I (x : xs)) -> f (NP I (a : as))
forall (f :: * -> *) a b c.
Divise f =>
(a -> (b, c)) -> f b -> f c -> f a
divise
(\case SOP.I z SOP.:* zs :: NP I xs
zs -> (x
z, NP I xs
NP I (x : xs)
zs))
f x
x
(NP f (x : xs) -> f (NP I (x : xs))
forall (f :: * -> *) a (as :: [*]).
Divise f =>
NP f (a : as) -> f (NP I (a : as))
diviseN NP f xs
NP f (x : xs)
xs)
concludeN
:: Conclude f
=> SOP.NP f as
-> f (SOP.NS SOP.I as)
concludeN :: NP f as -> f (NS I as)
concludeN = \case
SOP.Nil -> (NS I as -> Void) -> f (NS I as)
forall (f :: * -> *) a. Conclude f => (a -> Void) -> f a
conclude (\case {})
x :: f x
x SOP.:* xs :: NP f xs
xs -> (NS I as -> Either x (NS I xs))
-> f x -> f (NS I xs) -> f (NS I as)
forall (f :: * -> *) a b c.
Decide f =>
(a -> Either b c) -> f b -> f c -> f a
decide
(\case SOP.Z y :: I x
y -> x -> Either x (NS I xs)
forall a b. a -> Either a b
Left (I x -> x
forall a. I a -> a
SOP.unI I x
I x
y); SOP.S ys :: NS I xs
ys -> NS I xs -> Either x (NS I xs)
forall a b. b -> Either a b
Right NS I xs
ys)
f x
x
(NP f xs -> f (NS I xs)
forall (f :: * -> *) (as :: [*]).
Conclude f =>
NP f as -> f (NS I as)
concludeN NP f xs
xs)
decideN
:: Decide f
=> SOP.NP f (a ': as)
-> f (SOP.NS SOP.I (a ': as))
decideN :: NP f (a : as) -> f (NS I (a : as))
decideN = \case
x :: f x
x SOP.:* xs :: NP f xs
xs -> case NP f xs
xs of
SOP.Nil -> (NS I '[x] -> x) -> f x -> f (NS I '[x])
forall (f :: * -> *) a b. Contravariant f => (a -> b) -> f b -> f a
contramap (I x -> x
forall a. I a -> a
SOP.unI (I x -> x) -> (NS I '[x] -> I x) -> NS I '[x] -> x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NS I '[x] -> I x
forall k (f :: k -> *) (x :: k). NS f '[x] -> f x
SOP.unZ) f x
x
_ SOP.:* _ -> (NS I (a : as) -> Either x (NS I (x : xs)))
-> f x -> f (NS I (x : xs)) -> f (NS I (a : as))
forall (f :: * -> *) a b c.
Decide f =>
(a -> Either b c) -> f b -> f c -> f a
decide
(\case SOP.Z z :: I x
z -> x -> Either x (NS I (x : xs))
forall a b. a -> Either a b
Left (I x -> x
forall a. I a -> a
SOP.unI I x
I x
z); SOP.S zs :: NS I xs
zs -> NS I xs -> Either x (NS I xs)
forall a b. b -> Either a b
Right NS I xs
zs)
f x
x
(NP f (x : xs) -> f (NS I (x : xs))
forall (f :: * -> *) a (as :: [*]).
Decide f =>
NP f (a : as) -> f (NS I (a : as))
decideN NP f xs
NP f (x : xs)
xs)