{-# Language FlexibleContexts, FlexibleInstances, MultiParamTypeClasses, RankNTypes, TypeFamilies, TypeOperators #-}
module Transformation.Full where
import qualified Data.Functor
import Data.Functor.Compose (Compose(getCompose))
import Data.Functor.Const (Const(getConst))
import qualified Data.Foldable
import qualified Data.Traversable
import qualified Rank2
import qualified Transformation
import Transformation (Transformation, Domain, Codomain)
import {-# SOURCE #-} qualified Transformation.Deep as Deep
import Prelude hiding (Foldable(..), Traversable(..), Functor(..), Applicative(..), (<$>), fst, snd)
class (Transformation t, Rank2.Functor (g (Domain t))) => Functor t g where
(<$>) :: t -> Domain t (g (Domain t) (Domain t)) -> Codomain t (g (Codomain t) (Codomain t))
infixl 4 <$>
class (Transformation t, Rank2.Foldable (g (Domain t))) => Foldable t g where
foldMap :: (Codomain t ~ Const m, Monoid m) => t -> Domain t (g (Domain t) (Domain t)) -> m
class (Transformation t, Rank2.Traversable (g (Domain t))) => Traversable t g where
traverse :: Codomain t ~ Compose m f => t -> Domain t (g (Domain t) (Domain t)) -> m (f (g f f))
fmap :: Functor t g => t -> Domain t (g (Domain t) (Domain t)) -> Codomain t (g (Codomain t) (Codomain t))
fmap :: forall t (g :: (* -> *) -> (* -> *) -> *).
Functor t g =>
t
-> Domain t (g (Domain t) (Domain t))
-> Codomain t (g (Codomain t) (Codomain t))
fmap = forall t (g :: (* -> *) -> (* -> *) -> *).
Functor t g =>
t
-> Domain t (g (Domain t) (Domain t))
-> Codomain t (g (Codomain t) (Codomain t))
(<$>)
mapDownDefault :: (Deep.Functor t g, t `Transformation.At` g (Domain t) (Domain t), Data.Functor.Functor (Codomain t))
=> t -> Domain t (g (Domain t) (Domain t)) -> Codomain t (g (Codomain t) (Codomain t))
mapDownDefault :: forall t (g :: (* -> *) -> (* -> *) -> *).
(Functor t g, At t (g (Domain t) (Domain t)),
Functor (Codomain t)) =>
t
-> Domain t (g (Domain t) (Domain t))
-> Codomain t (g (Codomain t) (Codomain t))
mapDownDefault t
t Domain t (g (Domain t) (Domain t))
x = (t
t forall t (g :: (* -> *) -> (* -> *) -> *).
Functor t g =>
t -> g (Domain t) (Domain t) -> g (Codomain t) (Codomain t)
Deep.<$>) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Data.Functor.<$> (t
t forall t x. At t x => t -> Domain t x -> Codomain t x
Transformation.$ Domain t (g (Domain t) (Domain t))
x)
mapUpDefault :: (Deep.Functor t g, t `Transformation.At` g (Codomain t) (Codomain t), Data.Functor.Functor (Domain t))
=> t -> Domain t (g (Domain t) (Domain t)) -> Codomain t (g (Codomain t) (Codomain t))
mapUpDefault :: forall t (g :: (* -> *) -> (* -> *) -> *).
(Functor t g, At t (g (Codomain t) (Codomain t)),
Functor (Domain t)) =>
t
-> Domain t (g (Domain t) (Domain t))
-> Codomain t (g (Codomain t) (Codomain t))
mapUpDefault t
t Domain t (g (Domain t) (Domain t))
x = t
t forall t x. At t x => t -> Domain t x -> Codomain t x
Transformation.$ ((t
t forall t (g :: (* -> *) -> (* -> *) -> *).
Functor t g =>
t -> g (Domain t) (Domain t) -> g (Codomain t) (Codomain t)
Deep.<$>) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Data.Functor.<$> Domain t (g (Domain t) (Domain t))
x)
foldMapDownDefault, foldMapUpDefault :: (t `Transformation.At` g (Domain t) (Domain t), Deep.Foldable t g,
Codomain t ~ Const m, Data.Foldable.Foldable (Domain t), Monoid m)
=> t -> Domain t (g (Domain t) (Domain t)) -> m
foldMapDownDefault :: forall t (g :: (* -> *) -> (* -> *) -> *) m.
(At t (g (Domain t) (Domain t)), Foldable t g,
Codomain t ~ Const m, Foldable (Domain t), Monoid m) =>
t -> Domain t (g (Domain t) (Domain t)) -> m
foldMapDownDefault t
t Domain t (g (Domain t) (Domain t))
x = forall {k} a (b :: k). Const a b -> a
getConst (t
t forall t x. At t x => t -> Domain t x -> Codomain t x
Transformation.$ Domain t (g (Domain t) (Domain t))
x) forall a. Monoid a => a -> a -> a
`mappend` forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
Data.Foldable.foldMap (forall t (g :: (* -> *) -> (* -> *) -> *) m.
(Foldable t g, Codomain t ~ Const m, Monoid m) =>
t -> g (Domain t) (Domain t) -> m
Deep.foldMap t
t) Domain t (g (Domain t) (Domain t))
x
foldMapUpDefault :: forall t (g :: (* -> *) -> (* -> *) -> *) m.
(At t (g (Domain t) (Domain t)), Foldable t g,
Codomain t ~ Const m, Foldable (Domain t), Monoid m) =>
t -> Domain t (g (Domain t) (Domain t)) -> m
foldMapUpDefault t
t Domain t (g (Domain t) (Domain t))
x = forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
Data.Foldable.foldMap (forall t (g :: (* -> *) -> (* -> *) -> *) m.
(Foldable t g, Codomain t ~ Const m, Monoid m) =>
t -> g (Domain t) (Domain t) -> m
Deep.foldMap t
t) Domain t (g (Domain t) (Domain t))
x forall a. Monoid a => a -> a -> a
`mappend` forall {k} a (b :: k). Const a b -> a
getConst (t
t forall t x. At t x => t -> Domain t x -> Codomain t x
Transformation.$ Domain t (g (Domain t) (Domain t))
x)
traverseDownDefault :: (Deep.Traversable t g, t `Transformation.At` g (Domain t) (Domain t),
Codomain t ~ Compose m f, Data.Traversable.Traversable f, Monad m)
=> t -> Domain t (g (Domain t) (Domain t)) -> m (f (g f f))
traverseDownDefault :: forall t (g :: (* -> *) -> (* -> *) -> *) (m :: * -> *)
(f :: * -> *).
(Traversable t g, At t (g (Domain t) (Domain t)),
Codomain t ~ Compose m f, Traversable f, Monad m) =>
t -> Domain t (g (Domain t) (Domain t)) -> m (f (g f f))
traverseDownDefault t
t Domain t (g (Domain t) (Domain t))
x = forall {k1} {k2} (f :: k1 -> *) (g :: k2 -> k1) (a :: k2).
Compose f g a -> f (g a)
getCompose (t
t forall t x. At t x => t -> Domain t x -> Codomain t x
Transformation.$ Domain t (g (Domain t) (Domain t))
x) forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
Data.Traversable.traverse (forall t (g :: (* -> *) -> (* -> *) -> *) (m :: * -> *)
(f :: * -> *).
(Traversable t g, Codomain t ~ Compose m f) =>
t -> g (Domain t) (Domain t) -> m (g f f)
Deep.traverse t
t)
traverseUpDefault :: (Deep.Traversable t g, Codomain t ~ Compose m f, t `Transformation.At` g f f,
Data.Traversable.Traversable (Domain t), Monad m)
=> t -> Domain t (g (Domain t) (Domain t)) -> m (f (g f f))
traverseUpDefault :: forall t (g :: (* -> *) -> (* -> *) -> *) (m :: * -> *)
(f :: * -> *).
(Traversable t g, Codomain t ~ Compose m f, At t (g f f),
Traversable (Domain t), Monad m) =>
t -> Domain t (g (Domain t) (Domain t)) -> m (f (g f f))
traverseUpDefault t
t Domain t (g (Domain t) (Domain t))
x = forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
Data.Traversable.traverse (forall t (g :: (* -> *) -> (* -> *) -> *) (m :: * -> *)
(f :: * -> *).
(Traversable t g, Codomain t ~ Compose m f) =>
t -> g (Domain t) (Domain t) -> m (g f f)
Deep.traverse t
t) Domain t (g (Domain t) (Domain t))
x forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall {k1} {k2} (f :: k1 -> *) (g :: k2 -> k1) (a :: k2).
Compose f g a -> f (g a)
getCompose forall b c a. (b -> c) -> (a -> b) -> a -> c
. (t
t forall t x. At t x => t -> Domain t x -> Codomain t x
Transformation.$)