{-# LANGUAGE EmptyCase #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
module Data.Ten.Traversable
( Traversable10(..), traverse10, sequenceA10, fsequenceA10
) where
import Data.Coerce (coerce)
import Data.Functor.Identity (Identity(..))
import Data.Kind (Type)
import GHC.Generics
( Generic1(..)
, (:.:)(..), (:*:)(..), (:+:)(..)
, M1(..), Rec1(..), U1(..), V1, K1(..)
)
import Data.Wrapped (Wrapped1(..))
import Data.Ten.Ap (Ap10(..))
import Data.Ten.Foldable (Foldable10)
import Data.Ten.Functor (Functor10)
(.:) :: (q -> r) -> (a -> b -> q) -> a -> b -> r
.: :: (q -> r) -> (a -> b -> q) -> a -> b -> r
(.:) = ((b -> q) -> b -> r) -> (a -> b -> q) -> a -> b -> r
forall b c a. (b -> c) -> (a -> b) -> a -> c
(.) (((b -> q) -> b -> r) -> (a -> b -> q) -> a -> b -> r)
-> ((q -> r) -> (b -> q) -> b -> r)
-> (q -> r)
-> (a -> b -> q)
-> a
-> b
-> r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (q -> r) -> (b -> q) -> b -> r
forall b c a. (b -> c) -> (a -> b) -> a -> c
(.)
class (Functor10 t, Foldable10 t)
=> Traversable10 (t :: (k -> Type) -> Type) where
mapTraverse10
:: forall f m n r
. Applicative f
=> (t n -> r)
-> (forall a. m a -> f (n a))
-> t m -> f r
traverse10
:: forall t f m n
. (Traversable10 t, Applicative f)
=> (forall a. m a -> f (n a))
-> t m -> f (t n)
traverse10 :: (forall (a :: k). m a -> f (n a)) -> t m -> f (t n)
traverse10 = (t n -> t n) -> (forall (a :: k). m a -> f (n a)) -> t m -> f (t n)
forall k (t :: (k -> *) -> *) (f :: * -> *) (m :: k -> *)
(n :: k -> *) r.
(Traversable10 t, Applicative f) =>
(t n -> r) -> (forall (a :: k). m a -> f (n a)) -> t m -> f r
mapTraverse10 t n -> t n
forall a. a -> a
id
instance (Generic1 f, Traversable10 (Rep1 f))
=> Traversable10 (Wrapped1 Generic1 f) where
mapTraverse10 :: (Wrapped1 Generic1 f n -> r)
-> (forall (a :: k). m a -> f (n a))
-> Wrapped1 Generic1 f m
-> f r
mapTraverse10 Wrapped1 Generic1 f n -> r
r forall (a :: k). m a -> f (n a)
f = (Rep1 f n -> r)
-> (forall (a :: k). m a -> f (n a)) -> Rep1 f m -> f r
forall k (t :: (k -> *) -> *) (f :: * -> *) (m :: k -> *)
(n :: k -> *) r.
(Traversable10 t, Applicative f) =>
(t n -> r) -> (forall (a :: k). m a -> f (n a)) -> t m -> f r
mapTraverse10 (Wrapped1 Generic1 f n -> r
r (Wrapped1 Generic1 f n -> r)
-> (Rep1 f n -> Wrapped1 Generic1 f n) -> Rep1 f n -> r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. f n -> Wrapped1 Generic1 f n
forall k (c :: (k -> *) -> Constraint) (f :: k -> *) (a :: k).
f a -> Wrapped1 c f a
Wrapped1 (f n -> Wrapped1 Generic1 f n)
-> (Rep1 f n -> f n) -> Rep1 f n -> Wrapped1 Generic1 f n
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rep1 f n -> f n
forall k (f :: k -> *) (a :: k). Generic1 f => Rep1 f a -> f a
to1) forall (a :: k). m a -> f (n a)
f (Rep1 f m -> f r)
-> (Wrapped1 Generic1 f m -> Rep1 f m)
-> Wrapped1 Generic1 f m
-> f r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. f m -> Rep1 f m
forall k (f :: k -> *) (a :: k). Generic1 f => f a -> Rep1 f a
from1 (f m -> Rep1 f m)
-> (Wrapped1 Generic1 f m -> f m)
-> Wrapped1 Generic1 f m
-> Rep1 f m
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Wrapped1 Generic1 f m -> f m
forall k (c :: (k -> *) -> Constraint) (f :: k -> *) (a :: k).
Wrapped1 c f a -> f a
unWrapped1
instance Traversable10 (Ap10 a) where
mapTraverse10 :: (Ap10 a n -> r)
-> (forall (a :: k). m a -> f (n a)) -> Ap10 a m -> f r
mapTraverse10 Ap10 a n -> r
r forall (a :: k). m a -> f (n a)
f (Ap10 m a
x) = Ap10 a n -> r
r (Ap10 a n -> r) -> (n a -> Ap10 a n) -> n a -> r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. n a -> Ap10 a n
forall k (a :: k) (f :: k -> *). f a -> Ap10 a f
Ap10 (n a -> r) -> f (n a) -> f r
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m a -> f (n a)
forall (a :: k). m a -> f (n a)
f m a
x
instance Traversable10 (K1 i a) where
mapTraverse10 :: (K1 i a n -> r)
-> (forall (a :: k). m a -> f (n a)) -> K1 i a m -> f r
mapTraverse10 K1 i a n -> r
r forall (a :: k). m a -> f (n a)
_ K1 i a m
k = r -> f r
forall (f :: * -> *) a. Applicative f => a -> f a
pure (K1 i a n -> r
r (K1 i a n -> r) -> K1 i a n -> r
forall a b. (a -> b) -> a -> b
$ K1 i a m -> K1 i a n
coerce K1 i a m
k)
instance Traversable10 V1 where
mapTraverse10 :: (V1 n -> r) -> (forall (a :: k). m a -> f (n a)) -> V1 m -> f r
mapTraverse10 V1 n -> r
_ forall (a :: k). m a -> f (n a)
_ V1 m
x = case V1 m
x of {}
instance Traversable10 U1 where
mapTraverse10 :: (U1 n -> r) -> (forall (a :: k). m a -> f (n a)) -> U1 m -> f r
mapTraverse10 U1 n -> r
r forall (a :: k). m a -> f (n a)
_ U1 m
U1 = r -> f r
forall (f :: * -> *) a. Applicative f => a -> f a
pure (U1 n -> r
r U1 n
forall k (p :: k). U1 p
U1)
instance Traversable10 f => Traversable10 (Rec1 f) where
mapTraverse10 :: (Rec1 f n -> r)
-> (forall (a :: k). m a -> f (n a)) -> Rec1 f m -> f r
mapTraverse10 Rec1 f n -> r
r forall (a :: k). m a -> f (n a)
f (Rec1 f m
x) = (f n -> r) -> (forall (a :: k). m a -> f (n a)) -> f m -> f r
forall k (t :: (k -> *) -> *) (f :: * -> *) (m :: k -> *)
(n :: k -> *) r.
(Traversable10 t, Applicative f) =>
(t n -> r) -> (forall (a :: k). m a -> f (n a)) -> t m -> f r
mapTraverse10 (Rec1 f n -> r
r (Rec1 f n -> r) -> (f n -> Rec1 f n) -> f n -> r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. f n -> Rec1 f n
forall k (f :: k -> *) (p :: k). f p -> Rec1 f p
Rec1) forall (a :: k). m a -> f (n a)
f f m
x
instance Traversable10 f => Traversable10 (M1 i c f) where
mapTraverse10 :: (M1 i c f n -> r)
-> (forall (a :: k). m a -> f (n a)) -> M1 i c f m -> f r
mapTraverse10 M1 i c f n -> r
r forall (a :: k). m a -> f (n a)
f (M1 f m
x) = (f n -> r) -> (forall (a :: k). m a -> f (n a)) -> f m -> f r
forall k (t :: (k -> *) -> *) (f :: * -> *) (m :: k -> *)
(n :: k -> *) r.
(Traversable10 t, Applicative f) =>
(t n -> r) -> (forall (a :: k). m a -> f (n a)) -> t m -> f r
mapTraverse10 (M1 i c f n -> r
r (M1 i c f n -> r) -> (f n -> M1 i c f n) -> f n -> r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. f n -> M1 i c f n
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1) forall (a :: k). m a -> f (n a)
f f m
x
instance (Traversable10 f, Traversable10 g) => Traversable10 (f :+: g) where
mapTraverse10 :: ((:+:) f g n -> r)
-> (forall (a :: k). m a -> f (n a)) -> (:+:) f g m -> f r
mapTraverse10 (:+:) f g n -> r
r forall (a :: k). m a -> f (n a)
f (L1 f m
x) = (f n -> r) -> (forall (a :: k). m a -> f (n a)) -> f m -> f r
forall k (t :: (k -> *) -> *) (f :: * -> *) (m :: k -> *)
(n :: k -> *) r.
(Traversable10 t, Applicative f) =>
(t n -> r) -> (forall (a :: k). m a -> f (n a)) -> t m -> f r
mapTraverse10 ((:+:) f g n -> r
r ((:+:) f g n -> r) -> (f n -> (:+:) f g n) -> f n -> r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. f n -> (:+:) f g n
forall k (f :: k -> *) (g :: k -> *) (p :: k). f p -> (:+:) f g p
L1) forall (a :: k). m a -> f (n a)
f f m
x
mapTraverse10 (:+:) f g n -> r
r forall (a :: k). m a -> f (n a)
f (R1 g m
x) = (g n -> r) -> (forall (a :: k). m a -> f (n a)) -> g m -> f r
forall k (t :: (k -> *) -> *) (f :: * -> *) (m :: k -> *)
(n :: k -> *) r.
(Traversable10 t, Applicative f) =>
(t n -> r) -> (forall (a :: k). m a -> f (n a)) -> t m -> f r
mapTraverse10 ((:+:) f g n -> r
r ((:+:) f g n -> r) -> (g n -> (:+:) f g n) -> g n -> r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. g n -> (:+:) f g n
forall k (f :: k -> *) (g :: k -> *) (p :: k). g p -> (:+:) f g p
R1) forall (a :: k). m a -> f (n a)
f g m
x
instance (Traversable10 f, Traversable10 g) => Traversable10 (f :*: g) where
mapTraverse10 :: ((:*:) f g n -> r)
-> (forall (a :: k). m a -> f (n a)) -> (:*:) f g m -> f r
mapTraverse10 (:*:) f g n -> r
r forall (a :: k). m a -> f (n a)
f (f m
x :*: g m
y) =
(f n -> g n -> r)
-> (forall (a :: k). m a -> f (n a)) -> f m -> f (g n -> r)
forall k (t :: (k -> *) -> *) (f :: * -> *) (m :: k -> *)
(n :: k -> *) r.
(Traversable10 t, Applicative f) =>
(t n -> r) -> (forall (a :: k). m a -> f (n a)) -> t m -> f r
mapTraverse10 ((:*:) f g n -> r
r ((:*:) f g n -> r)
-> (f n -> g n -> (:*:) f g n) -> f n -> g n -> r
forall q r a b. (q -> r) -> (a -> b -> q) -> a -> b -> r
.: f n -> g n -> (:*:) f g n
forall k (f :: k -> *) (g :: k -> *) (p :: k).
f p -> g p -> (:*:) f g p
(:*:)) forall (a :: k). m a -> f (n a)
f f m
x f (g n -> r) -> f (g n) -> f r
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (forall (a :: k). m a -> f (n a)) -> g m -> f (g n)
forall k (t :: (k -> *) -> *) (f :: * -> *) (m :: k -> *)
(n :: k -> *).
(Traversable10 t, Applicative f) =>
(forall (a :: k). m a -> f (n a)) -> t m -> f (t n)
traverse10 forall (a :: k). m a -> f (n a)
f g m
y
instance (Traversable f, Traversable10 g) => Traversable10 (f :.: g) where
mapTraverse10 :: ((:.:) f g n -> r)
-> (forall (a :: k). m a -> f (n a)) -> (:.:) f g m -> f r
mapTraverse10 (:.:) f g n -> r
r forall (a :: k). m a -> f (n a)
f (Comp1 f (g m)
x) = (:.:) f g n -> r
r ((:.:) f g n -> r) -> (f (g n) -> (:.:) f g n) -> f (g n) -> r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. f (g n) -> (:.:) f g n
forall k2 k1 (f :: k2 -> *) (g :: k1 -> k2) (p :: k1).
f (g p) -> (:.:) f g p
Comp1 (f (g n) -> r) -> f (f (g n)) -> f r
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (g m -> f (g n)) -> f (g m) -> f (f (g n))
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse ((forall (a :: k). m a -> f (n a)) -> g m -> f (g n)
forall k (t :: (k -> *) -> *) (f :: * -> *) (m :: k -> *)
(n :: k -> *).
(Traversable10 t, Applicative f) =>
(forall (a :: k). m a -> f (n a)) -> t m -> f (t n)
traverse10 forall (a :: k). m a -> f (n a)
f) f (g m)
x
sequenceA10
:: (Applicative m, Traversable10 f)
=> f m -> m (f Identity)
sequenceA10 :: f m -> m (f Identity)
sequenceA10 = (forall a. m a -> m (Identity a)) -> f m -> m (f Identity)
forall k (t :: (k -> *) -> *) (f :: * -> *) (m :: k -> *)
(n :: k -> *).
(Traversable10 t, Applicative f) =>
(forall (a :: k). m a -> f (n a)) -> t m -> f (t n)
traverse10 ((a -> Identity a) -> m a -> m (Identity a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> Identity a
forall a. a -> Identity a
Identity)
fsequenceA10
:: (Applicative m, Traversable10 f)
=> f (m :.: n) -> m (f n)
fsequenceA10 :: f (m :.: n) -> m (f n)
fsequenceA10 = (forall (a :: k). (:.:) m n a -> m (n a)) -> f (m :.: n) -> m (f n)
forall k (t :: (k -> *) -> *) (f :: * -> *) (m :: k -> *)
(n :: k -> *).
(Traversable10 t, Applicative f) =>
(forall (a :: k). m a -> f (n a)) -> t m -> f (t n)
traverse10 forall (a :: k). (:.:) m n a -> m (n a)
coerce