compdata-0.12.1: Compositional Data Types
Copyright(c) 2010-2011 Patrick Bahr Tom Hvitved
LicenseBSD3
MaintainerPatrick Bahr <paba@diku.dk>
Stabilityexperimental
Portabilitynon-portable (GHC Extensions)
Safe HaskellSafe-Inferred
LanguageHaskell2010

Data.Comp.Ops

Description

This module provides operators on functors.

Synopsis

Documentation

data (f :+: g) e infixr 6 Source #

Formal sum of signatures (functors).

Constructors

Inl (f e) 
Inr (g e) 

Instances

Instances details
DistAnn s p s' => DistAnn (f :+: s :: k -> Type) p ((f :&: p) :+: s' :: k -> Type) Source # 
Instance details

Defined in Data.Comp.Ops

Methods

injectA :: forall (a :: k0). p -> (f :+: s) a -> ((f :&: p) :+: s') a Source #

projectA :: forall (a :: k0). ((f :&: p) :+: s') a -> ((f :+: s) a, p) Source #

RemA s s' => RemA ((f :&: p) :+: s :: k -> Type) (f :+: s' :: k -> Type) Source # 
Instance details

Defined in Data.Comp.Ops

Methods

remA :: forall (a :: k0). ((f :&: p) :+: s) a -> (f :+: s') a Source #

(Functor f, Functor g) => Functor (f :+: g) Source # 
Instance details

Defined in Data.Comp.Ops

Methods

fmap :: (a -> b) -> (f :+: g) a -> (f :+: g) b #

(<$) :: a -> (f :+: g) b -> (f :+: g) a #

(Foldable f, Foldable g) => Foldable (f :+: g) Source # 
Instance details

Defined in Data.Comp.Ops

Methods

fold :: Monoid m => (f :+: g) m -> m #

foldMap :: Monoid m => (a -> m) -> (f :+: g) a -> m #

foldMap' :: Monoid m => (a -> m) -> (f :+: g) a -> m #

foldr :: (a -> b -> b) -> b -> (f :+: g) a -> b #

foldr' :: (a -> b -> b) -> b -> (f :+: g) a -> b #

foldl :: (b -> a -> b) -> b -> (f :+: g) a -> b #

foldl' :: (b -> a -> b) -> b -> (f :+: g) a -> b #

foldr1 :: (a -> a -> a) -> (f :+: g) a -> a #

foldl1 :: (a -> a -> a) -> (f :+: g) a -> a #

toList :: (f :+: g) a -> [a] #

null :: (f :+: g) a -> Bool #

length :: (f :+: g) a -> Int #

elem :: Eq a => a -> (f :+: g) a -> Bool #

maximum :: Ord a => (f :+: g) a -> a #

minimum :: Ord a => (f :+: g) a -> a #

sum :: Num a => (f :+: g) a -> a #

product :: Num a => (f :+: g) a -> a #

(Traversable f, Traversable g) => Traversable (f :+: g) Source # 
Instance details

Defined in Data.Comp.Ops

Methods

traverse :: Applicative f0 => (a -> f0 b) -> (f :+: g) a -> f0 ((f :+: g) b) #

sequenceA :: Applicative f0 => (f :+: g) (f0 a) -> f0 ((f :+: g) a) #

mapM :: Monad m => (a -> m b) -> (f :+: g) a -> m ((f :+: g) b) #

sequence :: Monad m => (f :+: g) (m a) -> m ((f :+: g) a) #

(ShowConstr f, ShowConstr g) => ShowConstr (f :+: g) Source # 
Instance details

Defined in Data.Comp.Show

Methods

showConstr :: (f :+: g) a -> String Source #

(ShowF f, ShowF g) => ShowF (f :+: g) Source # 
Instance details

Defined in Data.Comp.Show

Methods

showF :: (f :+: g) String -> String Source #

(EqF f, EqF g) => EqF (f :+: g) Source #

EqF is propagated through sums.

Instance details

Defined in Data.Comp.Equality

Methods

eqF :: Eq a => (f :+: g) a -> (f :+: g) a -> Bool Source #

(OrdF f, OrdF g) => OrdF (f :+: g) Source #

OrdF is propagated through sums.

Instance details

Defined in Data.Comp.Ordering

Methods

compareF :: Ord a => (f :+: g) a -> (f :+: g) a -> Ordering Source #

(NFDataF f, NFDataF g) => NFDataF (f :+: g) Source # 
Instance details

Defined in Data.Comp.DeepSeq

Methods

rnfF :: NFData a => (f :+: g) a -> () Source #

(ArbitraryF f, ArbitraryF g) => ArbitraryF (f :+: g) Source #

Instances of ArbitraryF are closed under forming sums.

Instance details

Defined in Data.Comp.Arbitrary

Methods

arbitraryF' :: Arbitrary v => [(Int, Gen ((f :+: g) v))] Source #

arbitraryF :: Arbitrary v => Gen ((f :+: g) v) Source #

shrinkF :: Arbitrary v => (f :+: g) v -> [(f :+: g) v] Source #

(Render f, Render g) => Render (f :+: g) Source # 
Instance details

Defined in Data.Comp.Render

Methods

stringTreeAlg :: Alg (f :+: g) (Tree String) Source #

(Desugar f h, Desugar g h) => Desugar (f :+: g) h Source # 
Instance details

Defined in Data.Comp.Desugar

Methods

desugHom :: Hom (f :+: g) h Source #

desugHom' :: Alg (f :+: g) (Context h a) Source #

(HasVars f v, HasVars g v) => HasVars (f :+: g) v Source # 
Instance details

Defined in Data.Comp.Variables

Methods

isVar :: (f :+: g) a -> Maybe v Source #

bindsVars :: Mapping m a => (f :+: g) a -> m (Set v) Source #

(Eq (f a), Eq (g a)) => Eq ((f :+: g) a) Source # 
Instance details

Defined in Data.Comp.Sum

Methods

(==) :: (f :+: g) a -> (f :+: g) a -> Bool #

(/=) :: (f :+: g) a -> (f :+: g) a -> Bool #

(Ord (f a), Ord (g a)) => Ord ((f :+: g) a) Source # 
Instance details

Defined in Data.Comp.Sum

Methods

compare :: (f :+: g) a -> (f :+: g) a -> Ordering #

(<) :: (f :+: g) a -> (f :+: g) a -> Bool #

(<=) :: (f :+: g) a -> (f :+: g) a -> Bool #

(>) :: (f :+: g) a -> (f :+: g) a -> Bool #

(>=) :: (f :+: g) a -> (f :+: g) a -> Bool #

max :: (f :+: g) a -> (f :+: g) a -> (f :+: g) a #

min :: (f :+: g) a -> (f :+: g) a -> (f :+: g) a #

(Show (f a), Show (g a)) => Show ((f :+: g) a) Source # 
Instance details

Defined in Data.Comp.Sum

Methods

showsPrec :: Int -> (f :+: g) a -> ShowS #

show :: (f :+: g) a -> String #

showList :: [(f :+: g) a] -> ShowS #

fromInl :: (f :+: g) e -> Maybe (f e) Source #

fromInr :: (f :+: g) e -> Maybe (g e) Source #

caseF :: (f a -> b) -> (g a -> b) -> (f :+: g) a -> b Source #

Utility function to case on a functor sum, without exposing the internal representation of sums.

type family Elem (f :: * -> *) (g :: * -> *) :: Emb where ... Source #

Equations

Elem f f = Found Here 
Elem (f1 :+: f2) g = Sum' (Elem f1 g) (Elem f2 g) 
Elem f (g1 :+: g2) = Choose (Elem f g1) (Elem f g2) 
Elem f g = NotFound 

class Subsume (e :: Emb) (f :: * -> *) (g :: * -> *) where Source #

Methods

inj' :: Proxy e -> f a -> g a Source #

prj' :: Proxy e -> g a -> Maybe (f a) Source #

type (:<:) f g = Subsume (ComprEmb (Elem f g)) f g infixl 5 Source #

A constraint f :<: g expresses that the signature f is subsumed by g, i.e. f can be used to construct elements in g.

inj :: forall f g a. f :<: g => f a -> g a Source #

proj :: forall f g a. f :<: g => g a -> Maybe (f a) Source #

type (:=:) f g = (f :<: g, g :<: f) infixl 5 Source #

spl :: f :=: (f1 :+: f2) => (f1 a -> b) -> (f2 a -> b) -> f a -> b Source #

data (f :*: g) a infixr 8 Source #

Formal product of signatures (functors).

Constructors

(f a) :*: (g a) infixr 8 

Instances

Instances details
(Functor f, Functor g) => Functor (f :*: g) Source # 
Instance details

Defined in Data.Comp.Ops

Methods

fmap :: (a -> b) -> (f :*: g) a -> (f :*: g) b #

(<$) :: a -> (f :*: g) b -> (f :*: g) a #

(Foldable f, Foldable g) => Foldable (f :*: g) Source # 
Instance details

Defined in Data.Comp.Ops

Methods

fold :: Monoid m => (f :*: g) m -> m #

foldMap :: Monoid m => (a -> m) -> (f :*: g) a -> m #

foldMap' :: Monoid m => (a -> m) -> (f :*: g) a -> m #

foldr :: (a -> b -> b) -> b -> (f :*: g) a -> b #

foldr' :: (a -> b -> b) -> b -> (f :*: g) a -> b #

foldl :: (b -> a -> b) -> b -> (f :*: g) a -> b #

foldl' :: (b -> a -> b) -> b -> (f :*: g) a -> b #

foldr1 :: (a -> a -> a) -> (f :*: g) a -> a #

foldl1 :: (a -> a -> a) -> (f :*: g) a -> a #

toList :: (f :*: g) a -> [a] #

null :: (f :*: g) a -> Bool #

length :: (f :*: g) a -> Int #

elem :: Eq a => a -> (f :*: g) a -> Bool #

maximum :: Ord a => (f :*: g) a -> a #

minimum :: Ord a => (f :*: g) a -> a #

sum :: Num a => (f :*: g) a -> a #

product :: Num a => (f :*: g) a -> a #

(Traversable f, Traversable g) => Traversable (f :*: g) Source # 
Instance details

Defined in Data.Comp.Ops

Methods

traverse :: Applicative f0 => (a -> f0 b) -> (f :*: g) a -> f0 ((f :*: g) b) #

sequenceA :: Applicative f0 => (f :*: g) (f0 a) -> f0 ((f :*: g) a) #

mapM :: Monad m => (a -> m b) -> (f :*: g) a -> m ((f :*: g) b) #

sequence :: Monad m => (f :*: g) (m a) -> m ((f :*: g) a) #

ffst :: (f :*: g) a -> f a Source #

fsnd :: (f :*: g) a -> g a Source #

data (f :&: a) e infixr 7 Source #

This data type adds a constant product (annotation) to a signature.

Constructors

(f e) :&: a infixr 7 

Instances

Instances details
DistAnn (f :: k -> Type) p (f :&: p :: k -> Type) Source # 
Instance details

Defined in Data.Comp.Ops

Methods

injectA :: forall (a :: k0). p -> f a -> (f :&: p) a Source #

projectA :: forall (a :: k0). (f :&: p) a -> (f a, p) Source #

RemA (f :&: p :: k -> Type) (f :: k -> Type) Source # 
Instance details

Defined in Data.Comp.Ops

Methods

remA :: forall (a :: k0). (f :&: p) a -> f a Source #

DistAnn s p s' => DistAnn (f :+: s :: k -> Type) p ((f :&: p) :+: s' :: k -> Type) Source # 
Instance details

Defined in Data.Comp.Ops

Methods

injectA :: forall (a :: k0). p -> (f :+: s) a -> ((f :&: p) :+: s') a Source #

projectA :: forall (a :: k0). ((f :&: p) :+: s') a -> ((f :+: s) a, p) Source #

RemA s s' => RemA ((f :&: p) :+: s :: k -> Type) (f :+: s' :: k -> Type) Source # 
Instance details

Defined in Data.Comp.Ops

Methods

remA :: forall (a :: k0). ((f :&: p) :+: s) a -> (f :+: s') a Source #

Functor f => Functor (f :&: a) Source # 
Instance details

Defined in Data.Comp.Ops

Methods

fmap :: (a0 -> b) -> (f :&: a) a0 -> (f :&: a) b #

(<$) :: a0 -> (f :&: a) b -> (f :&: a) a0 #

Foldable f => Foldable (f :&: a) Source # 
Instance details

Defined in Data.Comp.Ops

Methods

fold :: Monoid m => (f :&: a) m -> m #

foldMap :: Monoid m => (a0 -> m) -> (f :&: a) a0 -> m #

foldMap' :: Monoid m => (a0 -> m) -> (f :&: a) a0 -> m #

foldr :: (a0 -> b -> b) -> b -> (f :&: a) a0 -> b #

foldr' :: (a0 -> b -> b) -> b -> (f :&: a) a0 -> b #

foldl :: (b -> a0 -> b) -> b -> (f :&: a) a0 -> b #

foldl' :: (b -> a0 -> b) -> b -> (f :&: a) a0 -> b #

foldr1 :: (a0 -> a0 -> a0) -> (f :&: a) a0 -> a0 #

foldl1 :: (a0 -> a0 -> a0) -> (f :&: a) a0 -> a0 #

toList :: (f :&: a) a0 -> [a0] #

null :: (f :&: a) a0 -> Bool #

length :: (f :&: a) a0 -> Int #

elem :: Eq a0 => a0 -> (f :&: a) a0 -> Bool #

maximum :: Ord a0 => (f :&: a) a0 -> a0 #

minimum :: Ord a0 => (f :&: a) a0 -> a0 #

sum :: Num a0 => (f :&: a) a0 -> a0 #

product :: Num a0 => (f :&: a) a0 -> a0 #

Traversable f => Traversable (f :&: a) Source # 
Instance details

Defined in Data.Comp.Ops

Methods

traverse :: Applicative f0 => (a0 -> f0 b) -> (f :&: a) a0 -> f0 ((f :&: a) b) #

sequenceA :: Applicative f0 => (f :&: a) (f0 a0) -> f0 ((f :&: a) a0) #

mapM :: Monad m => (a0 -> m b) -> (f :&: a) a0 -> m ((f :&: a) b) #

sequence :: Monad m => (f :&: a) (m a0) -> m ((f :&: a) a0) #

(ShowConstr f, Show p) => ShowConstr (f :&: p) Source # 
Instance details

Defined in Data.Comp.Show

Methods

showConstr :: (f :&: p) a -> String Source #

(ShowF f, Show p) => ShowF (f :&: p) Source # 
Instance details

Defined in Data.Comp.Show

Methods

showF :: (f :&: p) String -> String Source #

(NFDataF f, NFData a) => NFDataF (f :&: a) Source # 
Instance details

Defined in Data.Comp.DeepSeq

Methods

rnfF :: NFData a0 => (f :&: a) a0 -> () Source #

(ArbitraryF f, Arbitrary p) => ArbitraryF (f :&: p) Source # 
Instance details

Defined in Data.Comp.Arbitrary

Methods

arbitraryF' :: Arbitrary v => [(Int, Gen ((f :&: p) v))] Source #

arbitraryF :: Arbitrary v => Gen ((f :&: p) v) Source #

shrinkF :: Arbitrary v => (f :&: p) v -> [(f :&: p) v] Source #

HasVars f v => HasVars (f :&: a) v Source # 
Instance details

Defined in Data.Comp.Variables

Methods

isVar :: (f :&: a) a0 -> Maybe v Source #

bindsVars :: Mapping m a0 => (f :&: a) a0 -> m (Set v) Source #

class DistAnn s p s' | s' -> s, s' -> p where Source #

This class defines how to distribute an annotation over a sum of signatures.

Methods

injectA :: p -> s a -> s' a Source #

Inject an annotation over a signature.

projectA :: s' a -> (s a, p) Source #

Project an annotation from a signature.

Instances

Instances details
DistAnn (f :: k -> Type) p (f :&: p :: k -> Type) Source # 
Instance details

Defined in Data.Comp.Ops

Methods

injectA :: forall (a :: k0). p -> f a -> (f :&: p) a Source #

projectA :: forall (a :: k0). (f :&: p) a -> (f a, p) Source #

DistAnn s p s' => DistAnn (f :+: s :: k -> Type) p ((f :&: p) :+: s' :: k -> Type) Source # 
Instance details

Defined in Data.Comp.Ops

Methods

injectA :: forall (a :: k0). p -> (f :+: s) a -> ((f :&: p) :+: s') a Source #

projectA :: forall (a :: k0). ((f :&: p) :+: s') a -> ((f :+: s) a, p) Source #

class RemA s s' | s -> s' where Source #

Methods

remA :: s a -> s' a Source #

Remove annotations from a signature.

Instances

Instances details
RemA (f :&: p :: k -> Type) (f :: k -> Type) Source # 
Instance details

Defined in Data.Comp.Ops

Methods

remA :: forall (a :: k0). (f :&: p) a -> f a Source #

RemA s s' => RemA ((f :&: p) :+: s :: k -> Type) (f :+: s' :: k -> Type) Source # 
Instance details

Defined in Data.Comp.Ops

Methods

remA :: forall (a :: k0). ((f :&: p) :+: s) a -> (f :+: s') a Source #