-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Nested composition of functors with a type index tracking nesting. -- @package NestedFunctor @version 0.2.0.2 -- | This module implements something akin to Compose, but with a -- type index that tracks the order in which things are nested. This -- makes it possible to write code using polymorphic recursion over the -- levels of the structure contained in a Nested value. module Data.Functor.Nested -- | Flat x is the type index used for the base case of a -- Nested value. Thus, a (Nested (Flat []) Int is -- isomorphic to a [Int]. data Flat (x :: * -> *) -- | Nest o i is the type index used for the recursive case of a -- Nested value: the o parameter is the type constructors -- corresponding to the outside levels, and the i -- parameter is the single type constructor corresponding to the -- inner-most level. Thus, a (Nested (Nest (Flat Maybe) []) -- Int) is isomorphic to a (Maybe [Int]). data Nest (o :: *) (i :: * -> *) -- | A Nested fs a is the composition of all the layers mentioned -- in fs, applied to an a. Specifically, the -- fs parameter is a sort of snoc-list holding type constructors -- of kind (* -> *). The outermost layer appears as the -- parameter to Flat; the innermost layer appears as the -- rightmost argument to the outermost Nest. For instance: -- --
-- [Just ['a']] :: [Maybe [Char]] -- Flat [Just ['a']] :: Nested (Flat []) (Maybe [Char]) -- Nest (Flat [Just ['a']]) :: Nested (Nest (Flat []) Maybe) [Char] -- Nest (Nest (Flat [Just ['a']])) :: Nested (Nest (Nest (Flat []) Maybe) []) Char --data Nested fs a Flat :: f a -> Nested (Flat f) a Nest :: Nested fs (f a) -> Nested (Nest fs f) a -- | The UnNest type family describes what happens when you peel -- off one Nested constructor from a Nested value. -- | Removes one Nested constructor (either Nest or -- Flat) from a Nested value. -- --
-- unNest . Nest == id -- unNest . Flat == id ---- --
-- unNest (Nest (Flat [['x']])) == Flat [['x']] -- unNest (Flat (Just 'x')) == Just 'x' --unNest :: Nested fs a -> UnNest (Nested fs a) class NestedAs x y asNestedAs :: NestedAs x y => x -> y -> x `AsNestedAs` y -- | This type family calculates the result type of applying the -- Nested constructors to its first argument a number of times -- equal to the depth of nesting in its second argument. -- | This type family calculates the type of a Nested value if one -- more Nest constructor is applied to it. instance (AsNestedAs (f a) (UnNest (Nested (Nest g h) b)) ~ Nested fs (f' a'), AddNest (Nested fs (f' a')) ~ Nested (Nest fs f') a', NestedAs (f a) (UnNest (Nested (Nest g h) b))) => NestedAs (f a) (Nested (Nest g h) b) instance AsNestedAs (f a) (Nested (Flat g) b) ~ Nested (Flat f) a => NestedAs (f a) (Nested (Flat g) b) instance (Distributive f, Distributive (Nested fs)) => Distributive (Nested (Nest fs f)) instance Distributive f => Distributive (Nested (Flat f)) instance (Applicative f, Alternative (Nested fs)) => Alternative (Nested (Nest fs f)) instance Alternative f => Alternative (Nested (Flat f)) instance (Traversable f, Traversable (Nested fs)) => Traversable (Nested (Nest fs f)) instance Traversable f => Traversable (Nested (Flat f)) instance (Foldable f, Foldable (Nested fs)) => Foldable (Nested (Nest fs f)) instance Foldable f => Foldable (Nested (Flat f)) instance (Comonad f, Comonad (Nested fs), Distributive f, Functor (Nested (Nest fs f))) => Comonad (Nested (Nest fs f)) instance Comonad f => Comonad (Nested (Flat f)) instance (ComonadApply f, Distributive f, ComonadApply (Nested fs)) => ComonadApply (Nested (Nest fs f)) instance ComonadApply f => ComonadApply (Nested (Flat f)) instance (Applicative f, Applicative (Nested fs)) => Applicative (Nested (Nest fs f)) instance Applicative f => Applicative (Nested (Flat f)) instance (Functor f, Functor (Nested fs)) => Functor (Nested (Nest fs f)) instance Functor f => Functor (Nested (Flat f)) instance Show (Nested fs (f a)) => Show (Nested (Nest fs f) a) instance Show (f a) => Show (Nested (Flat f) a)