module Data.Functor.Combinator (
  
  
  
  
  
    type (~>)
  , type (<~>)
  
  
  
  , HFunctor(..)
  , Inject(..)
  , Interpret(..)
  , forI
  , iget, icollect, icollect1
  , iapply, ifanout, ifanout1
  , getI, collectI
  , injectMap, injectContramap
  , AltConst(..)
  
  , HTraversable(..), hsequence, hfoldMap, htoList
  , HTraversable1(..), hsequence1, hfoldMap1, htoNonEmpty
  
  
  
  , 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
  
  , dsum
  , dsum1
  , concludeN
  , decideN
  ) 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.HTraversable
import           Data.HFunctor.Internal
import           Data.HFunctor.Interpret
import           GHC.Generics
import qualified Data.SOP                             as SOP
dsum
    :: (Foldable t, Divisible f)
    => t (f a)
    -> f a
dsum :: forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Divisible f) =>
t (f a) -> f a
dsum = (f a -> f a -> f a) -> f a -> t (f a) -> f a
forall a b. (a -> b -> b) -> b -> t a -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr ((a -> (a, a)) -> f a -> f a -> f a
forall a b c. (a -> (b, c)) -> f b -> f c -> f a
forall (f :: * -> *) a b c.
Divisible f =>
(a -> (b, c)) -> f b -> f c -> f a
divide (\a
x -> (a
x,a
x))) f a
forall a. f a
forall (f :: * -> *) a. Divisible f => f a
conquer
concludeN
    :: Conclude f
    => SOP.NP f as
    -> f (SOP.NS SOP.I as)
concludeN :: forall (f :: * -> *) (as :: [*]).
Conclude f =>
NP f as -> f (NS I as)
concludeN = \case
    NP f as
SOP.Nil     -> (NS I as -> Void) -> f (NS I as)
forall a. (a -> Void) -> f a
forall (f :: * -> *) a. Conclude f => (a -> Void) -> f a
conclude (\case {})
    f x
x SOP.:* NP f xs
xs -> (NS I as -> Either x (NS I xs))
-> f x -> f (NS I xs) -> f (NS I as)
forall a b c. (a -> Either b c) -> f b -> f c -> f a
forall (f :: * -> *) a b c.
Decide f =>
(a -> Either b c) -> f b -> f c -> f a
decide
      (\case SOP.Z 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 NS I xs
ys -> NS I xs -> Either x (NS I xs)
forall a b. b -> Either a b
Right NS I xs
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 :: forall (f :: * -> *) a (as :: [*]).
Decide f =>
NP f (a : as) -> f (NS I (a : as))
decideN = \case
    f x
x SOP.:* NP f xs
xs -> case NP f xs
xs of
      NP f xs
SOP.Nil    -> (NS I (a : as) -> a) -> f a -> f (NS I (a : as))
forall a' a. (a' -> a) -> f a -> f a'
forall (f :: * -> *) a' a.
Contravariant f =>
(a' -> a) -> f a -> f a'
contramap (I a -> a
forall a. I a -> a
SOP.unI (I a -> a) -> (NS I (a : as) -> I a) -> NS I (a : as) -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NS I (a : as) -> I a
NS I '[a] -> I a
forall {k} (f :: k -> *) (x :: k). NS f '[x] -> f x
SOP.unZ) f a
f x
x
      f x
_ SOP.:* NP f xs
_ -> (NS I (a : as) -> Either x (NS I (x : xs)))
-> f x -> f (NS I (x : xs)) -> f (NS I (a : as))
forall a b c. (a -> Either b c) -> f b -> f c -> f a
forall (f :: * -> *) a b c.
Decide f =>
(a -> Either b c) -> f b -> f c -> f a
decide
        (\case SOP.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 NS I xs
zs -> NS I (x : xs) -> Either x (NS I (x : xs))
forall a b. b -> Either a b
Right NS I xs
NS I (x : 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)