{-# LANGUAGE PolyKinds    #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_GHC -Wno-orphans #-}
module Barbies.Internal.TraversableT
  ( TraversableT(..)
  , ttraverse_
  , tsequence
  , tsequence'
  , tfoldMap
  , CanDeriveTraversableT
  , ttraverseDefault
  )
where
import Barbies.Generics.Traversable(GTraversable(..))
import Barbies.Internal.FunctorT(FunctorT (..))
import Barbies.Internal.Writer(execWr, tell)
import Control.Applicative.Backwards(Backwards (..))
import Control.Applicative.Lift(Lift(..))
import Control.Monad.Trans.Except(ExceptT(..))
import Control.Monad.Trans.Identity(IdentityT(..))
import Control.Monad.Trans.Maybe(MaybeT(..))
import Control.Monad.Trans.Writer.Lazy as Lazy (WriterT(..))
import Control.Monad.Trans.Writer.Strict as Strict (WriterT(..))
import Data.Functor           (void)
import Data.Functor.Compose   (Compose (..))
import Data.Functor.Const     (Const (..))
import Data.Functor.Identity  (Identity (..))
import Data.Functor.Product   (Product (..))
import Data.Functor.Reverse   (Reverse (..))
import Data.Functor.Sum       (Sum (..))
import Data.Kind              (Type)
import Data.Generics.GenericN
import Data.Proxy             (Proxy (..))
class FunctorT t => TraversableT (t :: (k -> Type) -> k' -> Type) where
  ttraverse
    :: Applicative e
    => (forall a . f a -> e (g a))
    -> t f x -> e (t g x)
  default ttraverse
    :: ( Applicative e, CanDeriveTraversableT t f g x)
    => (forall a . f a -> e (g a)) -> t f x -> e (t g x)
  ttraverse = forall {k} {k} (t :: (k -> *) -> k -> *) (f :: k -> *)
       (g :: k -> *) (e :: * -> *) (x :: k).
(Applicative e, CanDeriveTraversableT t f g x) =>
(forall (a :: k). f a -> e (g a)) -> t f x -> e (t g x)
ttraverseDefault
ttraverse_
  :: (TraversableT t, Applicative e)
  => (forall a. f a -> e c)
  -> t f x -> e ()
ttraverse_ :: forall {k} {k'} (t :: (k -> *) -> k' -> *) (e :: * -> *)
       (f :: k -> *) c (x :: k').
(TraversableT t, Applicative e) =>
(forall (a :: k). f a -> e c) -> t f x -> e ()
ttraverse_ forall (a :: k). f a -> e c
f
  = forall (f :: * -> *) a. Functor f => f a -> f ()
void forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k k' (t :: (k -> *) -> k' -> *) (e :: * -> *) (f :: k -> *)
       (g :: k -> *) (x :: k').
(TraversableT t, Applicative e) =>
(forall (a :: k). f a -> e (g a)) -> t f x -> e (t g x)
ttraverse (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a b. a -> b -> a
const forall a b. (a -> b) -> a -> b
$ forall {k} a (b :: k). a -> Const a b
Const ()) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (a :: k). f a -> e c
f)
tsequence
  :: (Applicative e, TraversableT t)
  => t (Compose e f) x
  -> e (t f x)
tsequence :: forall {k} {k'} (e :: * -> *) (t :: (k -> *) -> k' -> *)
       (f :: k -> *) (x :: k').
(Applicative e, TraversableT t) =>
t (Compose e f) x -> e (t f x)
tsequence
  = forall k k' (t :: (k -> *) -> k' -> *) (e :: * -> *) (f :: k -> *)
       (g :: k -> *) (x :: k').
(TraversableT t, Applicative e) =>
(forall (a :: k). f a -> e (g a)) -> t f x -> e (t g x)
ttraverse forall {k1} {k2} (f :: k1 -> *) (g :: k2 -> k1) (a :: k2).
Compose f g a -> f (g a)
getCompose
tsequence'
  :: (Applicative e, TraversableT t)
  => t e x
  -> e (t Identity x)
tsequence' :: forall {k'} (e :: * -> *) (t :: (* -> *) -> k' -> *) (x :: k').
(Applicative e, TraversableT t) =>
t e x -> e (t Identity x)
tsequence'
  = forall k k' (t :: (k -> *) -> k' -> *) (e :: * -> *) (f :: k -> *)
       (g :: k -> *) (x :: k').
(TraversableT t, Applicative e) =>
(forall (a :: k). f a -> e (g a)) -> t f x -> e (t g x)
ttraverse (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. a -> Identity a
Identity)
tfoldMap
  :: ( TraversableT t, Monoid m)
  => (forall a. f a -> m)
  -> t f x
  -> m
tfoldMap :: forall {k} {k'} (t :: (k -> *) -> k' -> *) m (f :: k -> *)
       (x :: k').
(TraversableT t, Monoid m) =>
(forall (a :: k). f a -> m) -> t f x -> m
tfoldMap forall (a :: k). f a -> m
f
  = forall w a. Monoid w => Wr w a -> w
execWr forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {k} {k'} (t :: (k -> *) -> k' -> *) (e :: * -> *)
       (f :: k -> *) c (x :: k').
(TraversableT t, Applicative e) =>
(forall (a :: k). f a -> e c) -> t f x -> e ()
ttraverse_ (forall w. Monoid w => w -> Wr w ()
tell forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (a :: k). f a -> m
f)
type CanDeriveTraversableT t f g x
  = ( GenericP 1 (t f x)
    , GenericP 1 (t g x)
    , GTraversable 1 f g (RepP 1 (t f x)) (RepP 1 (t g x))
    )
ttraverseDefault
  :: forall t f g e x
  .  (Applicative e, CanDeriveTraversableT t f g x)
  => (forall a . f a -> e (g a))
  -> t f x -> e (t g x)
ttraverseDefault :: forall {k} {k} (t :: (k -> *) -> k -> *) (f :: k -> *)
       (g :: k -> *) (e :: * -> *) (x :: k).
(Applicative e, CanDeriveTraversableT t f g x) =>
(forall (a :: k). f a -> e (g a)) -> t f x -> e (t g x)
ttraverseDefault forall (a :: k). f a -> e (g a)
h
  = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall (n :: Natural) a x.
GenericP n a =>
Proxy n -> RepP n a x -> a
toP (forall {k} (t :: k). Proxy t
Proxy @1)) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {k} {k} {k} (n :: k) (f :: k -> *) (g :: k -> *)
       (repbf :: k -> *) (repbg :: k -> *) (t :: * -> *) (x :: k).
(GTraversable n f g repbf repbg, Applicative t) =>
Proxy n
-> (forall (a :: k). f a -> t (g a)) -> repbf x -> t (repbg x)
gtraverse (forall {k} (t :: k). Proxy t
Proxy @1) forall (a :: k). f a -> e (g a)
h forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (n :: Natural) a x.
GenericP n a =>
Proxy n -> a -> RepP n a x
fromP (forall {k} (t :: k). Proxy t
Proxy @1)
{-# INLINE ttraverseDefault #-}
type P = Param
instance
  ( TraversableT t
  ) => GTraversable 1 f g (Rec (t (P 1 f) x) (t f x))
                          (Rec (t (P 1 g) x) (t g x))
  where
  gtraverse :: forall (t :: * -> *) (x :: k).
Applicative t =>
Proxy 1
-> (forall (a :: k). f a -> t (g a))
-> Rec (t (P 1 f) x) (t f x) x
-> t (Rec (t (P 1 g) x) (t g x) x)
gtraverse Proxy 1
_ forall (a :: k). f a -> t (g a)
h
    = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall {k} p a (x :: k). K1 R a x -> Rec p a x
Rec forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k i c (p :: k). c -> K1 i c p
K1) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k k' (t :: (k -> *) -> k' -> *) (e :: * -> *) (f :: k -> *)
       (g :: k -> *) (x :: k').
(TraversableT t, Applicative e) =>
(forall (a :: k). f a -> e (g a)) -> t f x -> e (t g x)
ttraverse forall (a :: k). f a -> t (g a)
h forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k i c (p :: k). K1 i c p -> c
unK1 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {k} p a (x :: k). Rec p a x -> K1 R a x
unRec
  {-# INLINE gtraverse #-}
instance
   ( Traversable h
   , TraversableT t
   ) => GTraversable 1 f g (Rec (h (t (P 1 f) x)) (h (t f x)))
                           (Rec (h (t (P 1 g) x)) (h (t g x)))
  where
  gtraverse :: forall (t :: * -> *) (x :: k).
Applicative t =>
Proxy 1
-> (forall (a :: k). f a -> t (g a))
-> Rec (h (t (P 1 f) x)) (h (t f x)) x
-> t (Rec (h (t (P 1 g) x)) (h (t g x)) x)
gtraverse Proxy 1
_ forall (a :: k). f a -> t (g a)
h
    = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall {k} p a (x :: k). K1 R a x -> Rec p a x
Rec forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k i c (p :: k). c -> K1 i c p
K1) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse (forall k k' (t :: (k -> *) -> k' -> *) (e :: * -> *) (f :: k -> *)
       (g :: k -> *) (x :: k').
(TraversableT t, Applicative e) =>
(forall (a :: k). f a -> e (g a)) -> t f x -> e (t g x)
ttraverse forall (a :: k). f a -> t (g a)
h) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k i c (p :: k). K1 i c p -> c
unK1 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {k} p a (x :: k). Rec p a x -> K1 R a x
unRec
  {-# INLINE gtraverse #-}
instance
   ( Traversable h
   , Traversable m
   , TraversableT t
   ) => GTraversable 1 f g (Rec (m (h (t (P 1 f) x))) (m (h (t f x))))
                           (Rec (m (h (t (P 1 g) x))) (m (h (t g x))))
  where
  gtraverse :: forall (t :: * -> *) (x :: k).
Applicative t =>
Proxy 1
-> (forall (a :: k). f a -> t (g a))
-> Rec (m (h (t (P 1 f) x))) (m (h (t f x))) x
-> t (Rec (m (h (t (P 1 g) x))) (m (h (t g x))) x)
gtraverse Proxy 1
_ forall (a :: k). f a -> t (g a)
h
    = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall {k} p a (x :: k). K1 R a x -> Rec p a x
Rec forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k i c (p :: k). c -> K1 i c p
K1) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse (forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse (forall k k' (t :: (k -> *) -> k' -> *) (e :: * -> *) (f :: k -> *)
       (g :: k -> *) (x :: k').
(TraversableT t, Applicative e) =>
(forall (a :: k). f a -> e (g a)) -> t f x -> e (t g x)
ttraverse forall (a :: k). f a -> t (g a)
h)) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k i c (p :: k). K1 i c p -> c
unK1 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {k} p a (x :: k). Rec p a x -> K1 R a x
unRec
  {-# INLINE gtraverse #-}
instance Traversable f => TraversableT (Compose f) where
  ttraverse :: forall (e :: * -> *) (f :: k' -> *) (g :: k' -> *) (x :: k').
Applicative e =>
(forall (a :: k'). f a -> e (g a))
-> Compose f f x -> e (Compose f g x)
ttraverse forall (a :: k'). f a -> e (g a)
h (Compose f (f x)
fga)
    = forall {k} {k1} (f :: k -> *) (g :: k1 -> k) (a :: k1).
f (g a) -> Compose f g a
Compose forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse forall (a :: k'). f a -> e (g a)
h f (f x)
fga
  {-# INLINE ttraverse #-}
instance TraversableT (Product f) where
  ttraverse :: forall (e :: * -> *) (f :: k' -> *) (g :: k' -> *) (x :: k').
Applicative e =>
(forall (a :: k'). f a -> e (g a))
-> Product f f x -> e (Product f g x)
ttraverse forall (a :: k'). f a -> e (g a)
h (Pair f x
fa f x
ga) = forall {k} (f :: k -> *) (g :: k -> *) (a :: k).
f a -> g a -> Product f g a
Pair f x
fa forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (a :: k'). f a -> e (g a)
h f x
ga
  {-# INLINE ttraverse #-}
instance TraversableT (Sum f) where
  ttraverse :: forall (e :: * -> *) (f :: k' -> *) (g :: k' -> *) (x :: k').
Applicative e =>
(forall (a :: k'). f a -> e (g a)) -> Sum f f x -> e (Sum f g x)
ttraverse forall (a :: k'). f a -> e (g a)
h = \case
    InL f x
fa -> forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ forall {k} (f :: k -> *) (g :: k -> *) (a :: k). f a -> Sum f g a
InL f x
fa
    InR f x
ga -> forall {k} (f :: k -> *) (g :: k -> *) (a :: k). g a -> Sum f g a
InR forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (a :: k'). f a -> e (g a)
h f x
ga
  {-# INLINE ttraverse #-}
instance TraversableT Backwards where
  ttraverse :: forall (e :: * -> *) (f :: k' -> *) (g :: k' -> *) (x :: k').
Applicative e =>
(forall (a :: k'). f a -> e (g a))
-> Backwards f x -> e (Backwards g x)
ttraverse forall (a :: k'). f a -> e (g a)
h (Backwards f x
fa)
    = forall {k} (f :: k -> *) (a :: k). f a -> Backwards f a
Backwards forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (a :: k'). f a -> e (g a)
h f x
fa
  {-# INLINE ttraverse #-}
instance TraversableT Lift where
  ttraverse :: forall (e :: * -> *) (f :: * -> *) (g :: * -> *) x.
Applicative e =>
(forall a. f a -> e (g a)) -> Lift f x -> e (Lift g x)
ttraverse forall a. f a -> e (g a)
h = \case
    Pure  x
a  -> forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a. a -> Lift f a
Pure x
a
    Other f x
fa -> forall (f :: * -> *) a. f a -> Lift f a
Other forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. f a -> e (g a)
h f x
fa
  {-# INLINE ttraverse #-}
instance TraversableT Reverse where
  ttraverse :: forall (e :: * -> *) (f :: k' -> *) (g :: k' -> *) (x :: k').
Applicative e =>
(forall (a :: k'). f a -> e (g a))
-> Reverse f x -> e (Reverse g x)
ttraverse forall (a :: k'). f a -> e (g a)
h (Reverse f x
fa) = forall {k} (f :: k -> *) (a :: k). f a -> Reverse f a
Reverse forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (a :: k'). f a -> e (g a)
h f x
fa
  {-# INLINE ttraverse #-}
instance TraversableT (ExceptT e) where
  ttraverse :: forall (e :: * -> *) (f :: * -> *) (g :: * -> *) x.
Applicative e =>
(forall a. f a -> e (g a)) -> ExceptT e f x -> e (ExceptT e g x)
ttraverse forall a. f a -> e (g a)
h (ExceptT f (Either e x)
mea)
    = forall e (m :: * -> *) a. m (Either e a) -> ExceptT e m a
ExceptT forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. f a -> e (g a)
h f (Either e x)
mea
  {-# INLINE ttraverse #-}
instance TraversableT IdentityT where
  ttraverse :: forall (e :: * -> *) (f :: k' -> *) (g :: k' -> *) (x :: k').
Applicative e =>
(forall (a :: k'). f a -> e (g a))
-> IdentityT f x -> e (IdentityT g x)
ttraverse forall (a :: k'). f a -> e (g a)
h (IdentityT f x
ma)
    = forall {k} (f :: k -> *) (a :: k). f a -> IdentityT f a
IdentityT forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (a :: k'). f a -> e (g a)
h f x
ma
  {-# INLINE ttraverse #-}
instance TraversableT MaybeT where
  ttraverse :: forall (e :: * -> *) (f :: * -> *) (g :: * -> *) x.
Applicative e =>
(forall a. f a -> e (g a)) -> MaybeT f x -> e (MaybeT g x)
ttraverse forall a. f a -> e (g a)
h (MaybeT f (Maybe x)
mma)
    = forall (m :: * -> *) a. m (Maybe a) -> MaybeT m a
MaybeT forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. f a -> e (g a)
h f (Maybe x)
mma
  {-# INLINE ttraverse #-}
instance TraversableT (Lazy.WriterT w) where
  ttraverse :: forall (e :: * -> *) (f :: * -> *) (g :: * -> *) x.
Applicative e =>
(forall a. f a -> e (g a)) -> WriterT w f x -> e (WriterT w g x)
ttraverse forall a. f a -> e (g a)
h (Lazy.WriterT f (x, w)
maw)
    = forall w (m :: * -> *) a. m (a, w) -> WriterT w m a
Lazy.WriterT forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. f a -> e (g a)
h f (x, w)
maw
  {-# INLINE ttraverse #-}
instance TraversableT (Strict.WriterT w) where
  ttraverse :: forall (e :: * -> *) (f :: * -> *) (g :: * -> *) x.
Applicative e =>
(forall a. f a -> e (g a)) -> WriterT w f x -> e (WriterT w g x)
ttraverse forall a. f a -> e (g a)
h (Strict.WriterT f (x, w)
maw)
    = forall w (m :: * -> *) a. m (a, w) -> WriterT w m a
Strict.WriterT forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. f a -> e (g a)
h f (x, w)
maw
  {-# INLINE ttraverse #-}