type-combinators-0.2.0.0: A collection of data types for type-level programming

CopyrightCopyright (C) 2015 Kyle Carter
LicenseBSD3
MaintainerKyle Carter <kylcarte@indiana.edu>
Stabilityexperimental
PortabilityRankNTypes
Safe HaskellNone
LanguageHaskell2010

Data.Type.Disjunction

Description

Two type combinators for working with disjunctions: A branch combinator '(:|:)', and a choice combinator '(:+:)'.

These are analogous to '(|||)' and '(+++)' from Arrow, respectively.

Documentation

data f :|: g :: k -> * where infixr 4 Source

Constructors

L :: !(f a) -> (f :|: g) a 
R :: !(g a) -> (f :|: g) a 

Instances

Bifunctor1 k k k ((:|:) k) Source 
Traversable1 k k ((:|:) k f) Source 
Foldable1 k k ((:|:) k f) Source 
Functor1 k k ((:|:) k f) Source 
(Witness p q (f a), Witness p q (g a)) => Witness p q ((:|:) k f g a) Source 
(Read1 k f, Read1 k g) => Read1 k ((:|:) k f g) Source 
(Show1 k f, Show1 k g) => Show1 k ((:|:) k f g) Source 
(Ord1 k f, Ord1 k g) => Ord1 k ((:|:) k f g) Source 
(Eq1 k f, Eq1 k g) => Eq1 k ((:|:) k f g) Source 
(Eq (f a), Eq (g a)) => Eq ((:|:) k f g a) Source 
(Ord (f a), Ord (g a)) => Ord ((:|:) k f g a) Source 
(Read (f a), Read (g a)) => Read ((:|:) k f g a) Source 
(Show (f a), Show (g a)) => Show ((:|:) k f g a) Source 
type WitnessC p q ((:|:) k f g a) = (Witness p q (f a), Witness p q (g a)) Source 

(>|<) :: (f a -> r) -> (g a -> r) -> (f :|: g) a -> r infixr 2 Source

data f :+: g :: Either k l -> * where infixr 4 Source

Constructors

L' :: !(f a) -> (f :+: g) (Left a) 
R' :: !(g b) -> (f :+: g) (Right b) 

Instances

Bifunctor1 k k (Either k k) ((:+:) k k) Source 
Witness p q (g b) => Witness p q ((:+:) k k f g (Right k k b)) Source 
Witness p q (f a) => Witness p q ((:+:) k k f g (Left k k a)) Source 
Traversable1 k (Either k k) ((:+:) k k f) Source 
Foldable1 k (Either k k) ((:+:) k k f) Source 
Functor1 k (Either k k) ((:+:) k k f) Source 
(Read1 k f, Read1 k1 g) => Read1 (Either k k) ((:+:) k k f g) Source 
(Show1 k f, Show1 k1 g) => Show1 (Either k k) ((:+:) k k f g) Source 
(Ord1 k f, Ord1 k1 g) => Ord1 (Either k k) ((:+:) k k f g) Source 
(Eq1 k f, Eq1 k1 g) => Eq1 (Either k k) ((:+:) k k f g) Source 
Known k1 g b => Known (Either k k) ((:+:) k k f g) (Right k k b) Source 
Known k1 f a => Known (Either k k) ((:+:) k k f g) (Left k k a) Source 
(Eq (f (FromLeft k k1 e)), Eq (g (FromRight k1 k e))) => Eq ((:+:) k k f g e) Source 
(Ord (f (FromLeft k k1 e)), Ord (g (FromRight k1 k e))) => Ord ((:+:) k k f g e) Source 
(Show (f (FromLeft k k1 e)), Show (g (FromRight k1 k e))) => Show ((:+:) k k f g e) Source 
type WitnessC p q ((:+:) k k1 f g (Right k k1 b)) = Witness p q (g b) Source 
type WitnessC p q ((:+:) k1 k f g (Left k1 k a)) = Witness p q (f a) Source 
type KnownC (Either k k1) ((:+:) k k1 f g) (Right k k1 b) = Known k1 g b Source 
type KnownC (Either k1 k) ((:+:) k1 k f g) (Left k1 k a) = Known k1 f a Source 

(>+<) :: (forall a. (e ~ Left a) => f a -> r) -> (forall b. (e ~ Right b) => g b -> r) -> (f :+: g) e -> r infixr 2 Source