{-# LANGUAGE QuantifiedConstraints #-}

-- This Source Code Form is subject to the terms of the Mozilla Public
-- License, v. 2.0. If a copy of the MPL was not distributed with this
-- file, You can obtain one at https://mozilla.org/MPL/2.0/.

{- |
Copyright   :  (c) 2023 Yamada Ryo
License     :  MPL-2.0 (see the file LICENSE)
Maintainer  :  ymdfield@outlook.jp
Stability   :  experimental
Portability :  portable

A type class to abstract away the encoding details of the Heftia monad transformers.
-}
module Control.Monad.Trans.Heftia where

import Control.Effect.Class (Signature, type (~>))
import Control.Effect.Class.Machinery.HFunctor (HFunctor)
import Control.Heftia.Trans (TransHeftia, elaborateHT, hoistHeftia, liftLowerHT)
import Control.Monad.Cont (ContT)
import Control.Monad.Trans (MonadTrans, lift)
import Data.Coerce (Coercible, coerce)
import Data.Kind (Type)

-- | A type class to abstract away the encoding details of the Heftia monad transformers.
class
    (TransHeftia Monad h, forall sig. HFunctor sig => MonadTrans (h sig)) =>
    MonadTransHeftia h
    where
    elaborateMK ::
        (Monad m, HFunctor sig) =>
        (sig (ContT r m) ~> ContT r m) ->
        h sig m ~> ContT r m
    elaborateMK = forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (m :: * -> *) (t :: (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *).
(MonadTransHeftia h, Monad m, MonadTrans t, Monad (t m),
 HFunctor sig) =>
(sig (t m) ~> t m) -> h sig m ~> t m
elaborateMT
    {-# INLINE elaborateMK #-}

    reelaborateMK ::
        (Monad m, HFunctor sig) =>
        (sig (ContT r (h sig m)) ~> ContT r (h sig m)) ->
        h sig m ~> ContT r (h sig m)
    reelaborateMK = forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (m :: * -> *) (t :: (* -> *) -> * -> *) (n :: * -> *)
       (sig :: (* -> *) -> * -> *).
(MonadTransHeftia h, Monad m, MonadTrans t, Coercible n (h sig m),
 Monad (t n), Monad n, HFunctor sig) =>
(sig (t n) ~> t n) -> h sig m ~> t n
reelaborateMT
    {-# INLINE reelaborateMK #-}

    elaborateMT ::
        (Monad m, MonadTrans t, Monad (t m), HFunctor sig) =>
        (sig (t m) ~> t m) ->
        h sig m ~> t m
    elaborateMT = forall (c :: (* -> *) -> Constraint)
       (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *) (f :: * -> *)
       (g :: * -> *) (sig :: (* -> *) -> * -> *).
(TransHeftia c h, c f, c g, HFunctor sig) =>
(f ~> g) -> (sig g ~> g) -> h sig f ~> g
elaborateHT forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift
    {-# INLINE elaborateMT #-}

    reelaborateMT ::
        forall m t n sig.
        (Monad m, MonadTrans t, Coercible n (h sig m), Monad (t n), Monad n, HFunctor sig) =>
        (sig (t n) ~> t n) ->
        h sig m ~> t n
    reelaborateMT sig (t n) ~> t n
f = forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (m :: * -> *) (t :: (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *).
(MonadTransHeftia h, Monad m, MonadTrans t, Monad (t m),
 HFunctor sig) =>
(sig (t m) ~> t m) -> h sig m ~> t m
elaborateMT sig (t n) ~> t n
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (c :: (* -> *) -> Constraint)
       (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *) (f :: * -> *)
       (g :: * -> *) (sig :: (* -> *) -> * -> *).
(TransHeftia c h, c f, c g, HFunctor sig) =>
(f ~> g) -> h sig f ~> h sig g
hoistHeftia (coerce :: forall a b. Coercible a b => a -> b
coerce forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (c :: (* -> *) -> Constraint)
       (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (f :: * -> *).
(TransHeftia c h, c f, HFunctor sig) =>
f ~> h sig f
liftLowerHT @Monad @h @sig)
    {-# INLINE reelaborateMT #-}

reinterpretHTTViaFinal ::
    forall h m t n sig.
    ( MonadTransHeftia h
    , Monad m
    , MonadTrans t
    , Coercible n (h sig m)
    , Monad (t n)
    , Monad n
    , HFunctor sig
    ) =>
    (sig (t n) ~> t n) ->
    h sig m ~> t n
reinterpretHTTViaFinal :: forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (m :: * -> *) (t :: (* -> *) -> * -> *) (n :: * -> *)
       (sig :: (* -> *) -> * -> *).
(MonadTransHeftia h, Monad m, MonadTrans t, Coercible n (h sig m),
 Monad (t n), Monad n, HFunctor sig) =>
(sig (t n) ~> t n) -> h sig m ~> t n
reinterpretHTTViaFinal = forall (c :: (* -> *) -> Constraint)
       (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *) (f :: * -> *)
       (g :: * -> *) (sig :: (* -> *) -> * -> *).
(TransHeftia c h, c f, c g, HFunctor sig) =>
(f ~> g) -> (sig g ~> g) -> h sig f ~> g
elaborateHT forall a b. (a -> b) -> a -> b
$ forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. coerce :: forall a b. Coercible a b => a -> b
coerce forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (c :: (* -> *) -> Constraint)
       (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (f :: * -> *).
(TransHeftia c h, c f, HFunctor sig) =>
f ~> h sig f
liftLowerHT @Monad @h @sig
{-# INLINE reinterpretHTTViaFinal #-}

newtype ViaLiftLowerH (h :: Signature -> (Type -> Type) -> Type -> Type) sig m a = ViaLiftLowerH
    {forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) a.
ViaLiftLowerH h sig m a -> h sig m a
runViaLiftLowerH :: h sig m a}
    deriving newtype (forall a b. a -> ViaLiftLowerH h sig m b -> ViaLiftLowerH h sig m a
forall a b.
(a -> b) -> ViaLiftLowerH h sig m a -> ViaLiftLowerH h sig m b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) a b.
Functor (h sig m) =>
a -> ViaLiftLowerH h sig m b -> ViaLiftLowerH h sig m a
forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) a b.
Functor (h sig m) =>
(a -> b) -> ViaLiftLowerH h sig m a -> ViaLiftLowerH h sig m b
<$ :: forall a b. a -> ViaLiftLowerH h sig m b -> ViaLiftLowerH h sig m a
$c<$ :: forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) a b.
Functor (h sig m) =>
a -> ViaLiftLowerH h sig m b -> ViaLiftLowerH h sig m a
fmap :: forall a b.
(a -> b) -> ViaLiftLowerH h sig m a -> ViaLiftLowerH h sig m b
$cfmap :: forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) a b.
Functor (h sig m) =>
(a -> b) -> ViaLiftLowerH h sig m a -> ViaLiftLowerH h sig m b
Functor, forall a. a -> ViaLiftLowerH h sig m a
forall a b.
ViaLiftLowerH h sig m a
-> ViaLiftLowerH h sig m b -> ViaLiftLowerH h sig m a
forall a b.
ViaLiftLowerH h sig m a
-> ViaLiftLowerH h sig m b -> ViaLiftLowerH h sig m b
forall a b.
ViaLiftLowerH h sig m (a -> b)
-> ViaLiftLowerH h sig m a -> ViaLiftLowerH h sig m b
forall a b c.
(a -> b -> c)
-> ViaLiftLowerH h sig m a
-> ViaLiftLowerH h sig m b
-> ViaLiftLowerH h sig m c
forall (f :: * -> *).
Functor f
-> (forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
forall {h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *}
       {sig :: (* -> *) -> * -> *} {m :: * -> *}.
Applicative (h sig m) =>
Functor (ViaLiftLowerH h sig m)
forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) a.
Applicative (h sig m) =>
a -> ViaLiftLowerH h sig m a
forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) a b.
Applicative (h sig m) =>
ViaLiftLowerH h sig m a
-> ViaLiftLowerH h sig m b -> ViaLiftLowerH h sig m a
forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) a b.
Applicative (h sig m) =>
ViaLiftLowerH h sig m a
-> ViaLiftLowerH h sig m b -> ViaLiftLowerH h sig m b
forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) a b.
Applicative (h sig m) =>
ViaLiftLowerH h sig m (a -> b)
-> ViaLiftLowerH h sig m a -> ViaLiftLowerH h sig m b
forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) a b c.
Applicative (h sig m) =>
(a -> b -> c)
-> ViaLiftLowerH h sig m a
-> ViaLiftLowerH h sig m b
-> ViaLiftLowerH h sig m c
<* :: forall a b.
ViaLiftLowerH h sig m a
-> ViaLiftLowerH h sig m b -> ViaLiftLowerH h sig m a
$c<* :: forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) a b.
Applicative (h sig m) =>
ViaLiftLowerH h sig m a
-> ViaLiftLowerH h sig m b -> ViaLiftLowerH h sig m a
*> :: forall a b.
ViaLiftLowerH h sig m a
-> ViaLiftLowerH h sig m b -> ViaLiftLowerH h sig m b
$c*> :: forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) a b.
Applicative (h sig m) =>
ViaLiftLowerH h sig m a
-> ViaLiftLowerH h sig m b -> ViaLiftLowerH h sig m b
liftA2 :: forall a b c.
(a -> b -> c)
-> ViaLiftLowerH h sig m a
-> ViaLiftLowerH h sig m b
-> ViaLiftLowerH h sig m c
$cliftA2 :: forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) a b c.
Applicative (h sig m) =>
(a -> b -> c)
-> ViaLiftLowerH h sig m a
-> ViaLiftLowerH h sig m b
-> ViaLiftLowerH h sig m c
<*> :: forall a b.
ViaLiftLowerH h sig m (a -> b)
-> ViaLiftLowerH h sig m a -> ViaLiftLowerH h sig m b
$c<*> :: forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) a b.
Applicative (h sig m) =>
ViaLiftLowerH h sig m (a -> b)
-> ViaLiftLowerH h sig m a -> ViaLiftLowerH h sig m b
pure :: forall a. a -> ViaLiftLowerH h sig m a
$cpure :: forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) a.
Applicative (h sig m) =>
a -> ViaLiftLowerH h sig m a
Applicative, forall a. a -> ViaLiftLowerH h sig m a
forall a b.
ViaLiftLowerH h sig m a
-> ViaLiftLowerH h sig m b -> ViaLiftLowerH h sig m b
forall a b.
ViaLiftLowerH h sig m a
-> (a -> ViaLiftLowerH h sig m b) -> ViaLiftLowerH h sig m b
forall (m :: * -> *).
Applicative m
-> (forall a b. m a -> (a -> m b) -> m b)
-> (forall a b. m a -> m b -> m b)
-> (forall a. a -> m a)
-> Monad m
forall {h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *}
       {sig :: (* -> *) -> * -> *} {m :: * -> *}.
Monad (h sig m) =>
Applicative (ViaLiftLowerH h sig m)
forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) a.
Monad (h sig m) =>
a -> ViaLiftLowerH h sig m a
forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) a b.
Monad (h sig m) =>
ViaLiftLowerH h sig m a
-> ViaLiftLowerH h sig m b -> ViaLiftLowerH h sig m b
forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) a b.
Monad (h sig m) =>
ViaLiftLowerH h sig m a
-> (a -> ViaLiftLowerH h sig m b) -> ViaLiftLowerH h sig m b
return :: forall a. a -> ViaLiftLowerH h sig m a
$creturn :: forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) a.
Monad (h sig m) =>
a -> ViaLiftLowerH h sig m a
>> :: forall a b.
ViaLiftLowerH h sig m a
-> ViaLiftLowerH h sig m b -> ViaLiftLowerH h sig m b
$c>> :: forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) a b.
Monad (h sig m) =>
ViaLiftLowerH h sig m a
-> ViaLiftLowerH h sig m b -> ViaLiftLowerH h sig m b
>>= :: forall a b.
ViaLiftLowerH h sig m a
-> (a -> ViaLiftLowerH h sig m b) -> ViaLiftLowerH h sig m b
$c>>= :: forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) a b.
Monad (h sig m) =>
ViaLiftLowerH h sig m a
-> (a -> ViaLiftLowerH h sig m b) -> ViaLiftLowerH h sig m b
Monad)
    deriving stock (forall a. ViaLiftLowerH h sig m a -> Bool
forall m a. Monoid m => (a -> m) -> ViaLiftLowerH h sig m a -> m
forall a b. (a -> b -> b) -> b -> ViaLiftLowerH h sig m a -> b
forall (t :: * -> *).
(forall m. Monoid m => t m -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. t a -> [a])
-> (forall a. t a -> Bool)
-> (forall a. t a -> Int)
-> (forall a. Eq a => a -> t a -> Bool)
-> (forall a. Ord a => t a -> a)
-> (forall a. Ord a => t a -> a)
-> (forall a. Num a => t a -> a)
-> (forall a. Num a => t a -> a)
-> Foldable t
forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) a.
(Foldable (h sig m), Eq a) =>
a -> ViaLiftLowerH h sig m a -> Bool
forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) a.
(Foldable (h sig m), Num a) =>
ViaLiftLowerH h sig m a -> a
forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) a.
(Foldable (h sig m), Ord a) =>
ViaLiftLowerH h sig m a -> a
forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) m.
(Foldable (h sig m), Monoid m) =>
ViaLiftLowerH h sig m m -> m
forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) a.
Foldable (h sig m) =>
ViaLiftLowerH h sig m a -> Bool
forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) a.
Foldable (h sig m) =>
ViaLiftLowerH h sig m a -> Int
forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) a.
Foldable (h sig m) =>
ViaLiftLowerH h sig m a -> [a]
forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) a.
Foldable (h sig m) =>
(a -> a -> a) -> ViaLiftLowerH h sig m a -> a
forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) m a.
(Foldable (h sig m), Monoid m) =>
(a -> m) -> ViaLiftLowerH h sig m a -> m
forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) b a.
Foldable (h sig m) =>
(b -> a -> b) -> b -> ViaLiftLowerH h sig m a -> b
forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) a b.
Foldable (h sig m) =>
(a -> b -> b) -> b -> ViaLiftLowerH h sig m a -> b
product :: forall a. Num a => ViaLiftLowerH h sig m a -> a
$cproduct :: forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) a.
(Foldable (h sig m), Num a) =>
ViaLiftLowerH h sig m a -> a
sum :: forall a. Num a => ViaLiftLowerH h sig m a -> a
$csum :: forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) a.
(Foldable (h sig m), Num a) =>
ViaLiftLowerH h sig m a -> a
minimum :: forall a. Ord a => ViaLiftLowerH h sig m a -> a
$cminimum :: forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) a.
(Foldable (h sig m), Ord a) =>
ViaLiftLowerH h sig m a -> a
maximum :: forall a. Ord a => ViaLiftLowerH h sig m a -> a
$cmaximum :: forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) a.
(Foldable (h sig m), Ord a) =>
ViaLiftLowerH h sig m a -> a
elem :: forall a. Eq a => a -> ViaLiftLowerH h sig m a -> Bool
$celem :: forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) a.
(Foldable (h sig m), Eq a) =>
a -> ViaLiftLowerH h sig m a -> Bool
length :: forall a. ViaLiftLowerH h sig m a -> Int
$clength :: forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) a.
Foldable (h sig m) =>
ViaLiftLowerH h sig m a -> Int
null :: forall a. ViaLiftLowerH h sig m a -> Bool
$cnull :: forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) a.
Foldable (h sig m) =>
ViaLiftLowerH h sig m a -> Bool
toList :: forall a. ViaLiftLowerH h sig m a -> [a]
$ctoList :: forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) a.
Foldable (h sig m) =>
ViaLiftLowerH h sig m a -> [a]
foldl1 :: forall a. (a -> a -> a) -> ViaLiftLowerH h sig m a -> a
$cfoldl1 :: forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) a.
Foldable (h sig m) =>
(a -> a -> a) -> ViaLiftLowerH h sig m a -> a
foldr1 :: forall a. (a -> a -> a) -> ViaLiftLowerH h sig m a -> a
$cfoldr1 :: forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) a.
Foldable (h sig m) =>
(a -> a -> a) -> ViaLiftLowerH h sig m a -> a
foldl' :: forall b a. (b -> a -> b) -> b -> ViaLiftLowerH h sig m a -> b
$cfoldl' :: forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) b a.
Foldable (h sig m) =>
(b -> a -> b) -> b -> ViaLiftLowerH h sig m a -> b
foldl :: forall b a. (b -> a -> b) -> b -> ViaLiftLowerH h sig m a -> b
$cfoldl :: forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) b a.
Foldable (h sig m) =>
(b -> a -> b) -> b -> ViaLiftLowerH h sig m a -> b
foldr' :: forall a b. (a -> b -> b) -> b -> ViaLiftLowerH h sig m a -> b
$cfoldr' :: forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) a b.
Foldable (h sig m) =>
(a -> b -> b) -> b -> ViaLiftLowerH h sig m a -> b
foldr :: forall a b. (a -> b -> b) -> b -> ViaLiftLowerH h sig m a -> b
$cfoldr :: forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) a b.
Foldable (h sig m) =>
(a -> b -> b) -> b -> ViaLiftLowerH h sig m a -> b
foldMap' :: forall m a. Monoid m => (a -> m) -> ViaLiftLowerH h sig m a -> m
$cfoldMap' :: forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) m a.
(Foldable (h sig m), Monoid m) =>
(a -> m) -> ViaLiftLowerH h sig m a -> m
foldMap :: forall m a. Monoid m => (a -> m) -> ViaLiftLowerH h sig m a -> m
$cfoldMap :: forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) m a.
(Foldable (h sig m), Monoid m) =>
(a -> m) -> ViaLiftLowerH h sig m a -> m
fold :: forall m. Monoid m => ViaLiftLowerH h sig m m -> m
$cfold :: forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) m.
(Foldable (h sig m), Monoid m) =>
ViaLiftLowerH h sig m m -> m
Foldable, forall (t :: * -> *).
Functor t
-> Foldable t
-> (forall (f :: * -> *) a b.
    Applicative f =>
    (a -> f b) -> t a -> f (t b))
-> (forall (f :: * -> *) a. Applicative f => t (f a) -> f (t a))
-> (forall (m :: * -> *) a b.
    Monad m =>
    (a -> m b) -> t a -> m (t b))
-> (forall (m :: * -> *) a. Monad m => t (m a) -> m (t a))
-> Traversable t
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b)
-> ViaLiftLowerH h sig m a -> f (ViaLiftLowerH h sig m b)
forall {h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *}
       {sig :: (* -> *) -> * -> *} {m :: * -> *}.
Traversable (h sig m) =>
Functor (ViaLiftLowerH h sig m)
forall {h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *}
       {sig :: (* -> *) -> * -> *} {m :: * -> *}.
Traversable (h sig m) =>
Foldable (ViaLiftLowerH h sig m)
forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) (m :: * -> *) a.
(Traversable (h sig m), Monad m) =>
ViaLiftLowerH h sig m (m a) -> m (ViaLiftLowerH h sig m a)
forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) (f :: * -> *) a.
(Traversable (h sig m), Applicative f) =>
ViaLiftLowerH h sig m (f a) -> f (ViaLiftLowerH h sig m a)
forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) (m :: * -> *) a b.
(Traversable (h sig m), Monad m) =>
(a -> m b)
-> ViaLiftLowerH h sig m a -> m (ViaLiftLowerH h sig m b)
forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) (f :: * -> *) a b.
(Traversable (h sig m), Applicative f) =>
(a -> f b)
-> ViaLiftLowerH h sig m a -> f (ViaLiftLowerH h sig m b)
sequence :: forall (m :: * -> *) a.
Monad m =>
ViaLiftLowerH h sig m (m a) -> m (ViaLiftLowerH h sig m a)
$csequence :: forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) (m :: * -> *) a.
(Traversable (h sig m), Monad m) =>
ViaLiftLowerH h sig m (m a) -> m (ViaLiftLowerH h sig m a)
mapM :: forall (m :: * -> *) a b.
Monad m =>
(a -> m b)
-> ViaLiftLowerH h sig m a -> m (ViaLiftLowerH h sig m b)
$cmapM :: forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) (m :: * -> *) a b.
(Traversable (h sig m), Monad m) =>
(a -> m b)
-> ViaLiftLowerH h sig m a -> m (ViaLiftLowerH h sig m b)
sequenceA :: forall (f :: * -> *) a.
Applicative f =>
ViaLiftLowerH h sig m (f a) -> f (ViaLiftLowerH h sig m a)
$csequenceA :: forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) (f :: * -> *) a.
(Traversable (h sig m), Applicative f) =>
ViaLiftLowerH h sig m (f a) -> f (ViaLiftLowerH h sig m a)
traverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b)
-> ViaLiftLowerH h sig m a -> f (ViaLiftLowerH h sig m b)
$ctraverse :: forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) (f :: * -> *) a b.
(Traversable (h sig m), Applicative f) =>
(a -> f b)
-> ViaLiftLowerH h sig m a -> f (ViaLiftLowerH h sig m b)
Traversable)

instance (TransHeftia Monad h, HFunctor sig) => MonadTrans (ViaLiftLowerH h sig) where
    lift :: forall (m :: * -> *) a. Monad m => m a -> ViaLiftLowerH h sig m a
lift = forall (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (m :: * -> *) a.
h sig m a -> ViaLiftLowerH h sig m a
ViaLiftLowerH forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (c :: (* -> *) -> Constraint)
       (h :: ((* -> *) -> * -> *) -> (* -> *) -> * -> *)
       (sig :: (* -> *) -> * -> *) (f :: * -> *).
(TransHeftia c h, c f, HFunctor sig) =>
f ~> h sig f
liftLowerHT
    {-# INLINE lift #-}