-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Existential types with lens-like accessors. -- -- Existential types encapsulated in Cell type together with some -- lens-like accessors. A template-haskell-based factory generator is -- also provided to use TypeRep to reconstruct Cell objects. @package existential @version 0.2.0.0 module Data.Existential -- |

The Cell Type

-- -- A polymorphic cell. Type 'Cell MyClass' can take a value of any type -- that conforms to MyClass and to Typeable. It is -- defined in terms of Cell1. type Cell = Cell1 Identity -- | Generilization of Cell. 'Cell1 MyFunctor MyClass' takes values -- ^ of type 'MyFunctor a' with '(MyClass a,Typeable a)'. data Cell1 f (constr :: * -> Constraint) Cell :: (f a) -> Cell1 f type Inst constr a = Inst1 Identity constr a data Inst1 f constr a Inst :: (f a) -> Inst1 f constr a type EntailsAll c0 c1 = forall a. c0 a :- c1 a dictFunToEntails :: Iso' (Dict p -> Dict q) (p :- q) entailsToDictFun :: Iso' (p :- q) (Dict p -> Dict q) dict :: Inst1 f constr a -> Dict (constr a) -- | HasCell permits the overloading of Iso cell and -- makes it easier | to wrap a Cell with a newtype without having -- to mention Cell all | the time. class HasCell a b | a -> b cell :: HasCell a b => Iso' a b -- | Similar to makeCell. Uses Cell1 to allow the content ^ -- of a Cell to be wrapped with a generic type. -- --

Contructors

-- -- We can use 'makeCell "hello" :: MyType' if there is an instance ^ -- 'HasCell MyType (Cell Show)' (or any other class than show). makeCell :: (HasCell a (Cell constr), constr b, Typeable b) => b -> a makeCell1 :: (HasCell a (Cell1 f constr), constr b, Typeable b) => f b -> a -- |

Prisms

-- -- Treats a Cell as an unbounded sum type: 'c^?_Cell :: Maybe a' -- has the ^ value 'Just x' if x is of type a and c -- contains value x. If cell c ^ has a value of any -- other type then a, 'c^?_Cell == Nothing'. _Cell :: (constr b, Typeable b, Typeable a) => Prism (Cell constr) (Cell constr) a b -- | Similar to _Cell but operates on types that wrap a cell instead -- of ^ on the cell itself. _Cell' :: (constr a, Typeable a, HasCell c (Cell constr)) => Prism c c a a -- | Similar to _Cell but values are wrapped in type f -- inside the cell. _Cell1 :: (constr b, Typeable b, Typeable a, Typeable f) => Prism (Cell1 f constr) (Cell1 f constr) (f a) (f b) -- | Analogous to _Cell' and _Cell1. _Cell1' :: (constr a, Typeable a, Typeable f, HasCell c (Cell1 f constr)) => Prism c c (f a) (f a) -- | Like _Cell but disallows changing the type of the content of -- the cell. ^ facilitates type checking when the prism is not used for -- modification. asCell :: (constr a, Typeable a) => Prism (Cell constr) (Cell constr) a a -- | Like _Cell1 and as asCell. asCell1 :: (constr a, Typeable a, Typeable f) => Prism (Cell1 f constr) (Cell1 f constr) (f a) (f a) asInst :: Functor g => (forall a. Inst1 f constr a -> g (Inst1 h constr' a)) -> Cell1 f constr -> g (Cell1 h constr') asInst1 :: Functor g => (forall a. Inst1 f constr a -> g (Inst1 h constr' a)) -> Cell1 f constr -> g (Cell1 h constr') fromInst :: Inst1 f constr a -> Cell1 f constr inst :: Lens' (Inst constr a) a inst1 :: Lens (Inst1 f constr a) (Inst1 g constr a) (f a) (g a) -- |

Traversals

traverseCell :: Functor f => (forall a. (constr a, Typeable a) => a -> f a) -> Cell constr -> f (Cell constr) traverseCell' :: (Functor f, HasCell c (Cell constr)) => (forall a. (constr a, Typeable a) => a -> f a) -> c -> f c traverseCell1 :: Functor f => (forall a. (constr a, Typeable a) => g a -> f (h a)) -> Cell1 g constr -> f (Cell1 h constr) traverseCell1' :: (Functor f, HasCell c (Cell1 g constr)) => (forall a. (constr a, Typeable a) => g a -> f (g a)) -> c -> f c traverseInst :: Functor f => (constr a => a -> f a) -> Inst constr a -> f (Inst constr a) traverseInst1 :: Functor f => (constr a => g a -> f (h a)) -> Inst1 g constr a -> f (Inst1 h constr a) mapCell :: (forall a. (constr a, Typeable a) => a -> a) -> Cell constr -> Cell constr mapCell' :: HasCell c (Cell constr) => (forall a. (constr a, Typeable a) => a -> a) -> c -> c mapCell1 :: (forall a. (constr a, Typeable a) => f a -> f a) -> Cell1 f constr -> Cell1 f constr mapCell1' :: HasCell c (Cell1 f constr) => (forall a. (constr a, Typeable a) => f a -> f a) -> c -> c mapInst :: (constr a => a -> a) -> Inst constr a -> Inst constr a mapInst1 :: (constr a => f a -> f a) -> Inst1 f constr a -> Inst1 f constr a readCell1 :: (forall a. (constr a, Typeable a) => f a -> r) -> Cell1 f constr -> r readCell1' :: HasCell c (Cell1 f constr) => (forall a. (constr a, Typeable a) => f a -> r) -> c -> r readCell :: (forall a. (constr a, Typeable a) => a -> r) -> Cell constr -> r readCell' :: HasCell c (Cell constr) => (forall a. (constr a, Typeable a) => a -> r) -> c -> r readInst :: (constr a => a -> r) -> Inst constr a -> r readInst1 :: (constr a => f a -> r) -> Inst1 f constr a -> r -- |

Combinators =

apply2Cells :: Functor f => (forall a. (constr a, Typeable a) => a -> a -> f a) -> f (Cell constr) -> Cell constr -> Cell constr -> f (Cell constr) apply2Cells' :: (Functor f, HasCell c (Cell constr)) => (forall a. (constr a, Typeable a) => a -> a -> f a) -> f c -> c -> c -> f c apply2Cells1 :: (Functor f, Typeable g) => (forall a. (constr a, Typeable a) => g a -> g a -> f (g a)) -> f (Cell1 g constr) -> Cell1 g constr -> Cell1 g constr -> f (Cell1 g constr) apply2Cells1' :: (Functor f, Typeable g, HasCell c (Cell1 g constr)) => (forall a. (constr a, Typeable a) => g a -> g a -> f (g a)) -> f c -> c -> c -> f c map2Cells :: (forall a. (constr a, Typeable a) => a -> a -> a) -> Cell constr -> Cell constr -> Cell constr -> Cell constr map2Cells' :: HasCell c (Cell constr) => (forall a. (constr a, Typeable a) => a -> a -> a) -> c -> c -> c -> c map2Cells1 :: (forall a. (constr a, Typeable a) => a -> a -> a) -> Cell constr -> Cell constr -> Cell constr -> Cell constr map2Cells1' :: HasCell c (Cell constr) => (forall a. (constr a, Typeable a) => a -> a -> a) -> c -> c -> c -> c read2CellsWith :: (forall a. (constr a, Typeable a) => a -> a -> r) -> r -> Cell constr -> Cell constr -> r read2CellsWith' :: HasCell c (Cell constr) => (forall a. (constr a, Typeable a) => a -> a -> r) -> r -> c -> c -> r read2Cells1With :: Typeable f => (forall a. (constr a, Typeable a) => f a -> f a -> r) -> r -> Cell1 f constr -> Cell1 f constr -> r read2Cells1With' :: (HasCell c (Cell1 f constr), Typeable f) => (forall a. (constr a, Typeable a) => f a -> f a -> r) -> r -> c -> c -> r -- |

Heterogenous Combinators

read2CellsH :: (forall a b. (constr a, Typeable a, constr b, Typeable b) => a -> b -> r) -> Cell constr -> Cell constr -> r read2CellsH' :: HasCell c (Cell constr) => (forall a b. (constr a, Typeable a, constr b, Typeable b) => a -> b -> r) -> c -> c -> r read2Cells1H :: (forall a b. (constr a, Typeable a, constr b, Typeable b) => f a -> f b -> r) -> Cell1 f constr -> Cell1 f constr -> r read2Cells1H' :: (forall a b. (constr a, Typeable a, constr b, Typeable b) => f a -> f b -> r) -> Cell1 f constr -> Cell1 f constr -> r -- |

Comparing the content of cells

cell1Equal :: Typeable f => (forall a. constr a => f a -> f a -> Bool) -> Cell1 f constr -> Cell1 f constr -> Bool cell1Equal' :: (HasCell c (Cell1 f constr), Typeable f) => (forall a. constr a => f a -> f a -> Bool) -> c -> c -> Bool cellEqual :: (forall a. constr a => a -> a -> Bool) -> Cell constr -> Cell constr -> Bool cellEqual' :: HasCell c (Cell constr) => (forall a. constr a => a -> a -> Bool) -> c -> c -> Bool cellZoomEqual' :: (HasCell c (Cell constr), Eq c, Show c) => (forall a. constr a => a -> a -> Invariant) -> c -> c -> Invariant cell1ZoomEqual' :: (HasCell c (Cell1 f constr), Eq c, Show c, Typeable f) => (forall a. constr a => f a -> f a -> Invariant) -> c -> c -> Invariant cellCompare :: (forall a. constr a => a -> a -> Ordering) -> Cell constr -> Cell constr -> Ordering cellCompare' :: HasCell c (Cell constr) => (forall a. constr a => a -> a -> Ordering) -> c -> c -> Ordering cell1Compare :: (Typeable f) => (forall a. constr a => f a -> f a -> Ordering) -> Cell1 f constr -> Cell1 f constr -> Ordering cell1Compare' :: (HasCell c (Cell1 f constr), Typeable f) => (forall a. constr a => f a -> f a -> Ordering) -> c -> c -> Ordering -- |

Creating Lenses

cellLens :: Functor f => (forall a. constr a => LensLike' f a b) -> LensLike' f (Cell constr) b cellLens' :: (HasCell c (Cell constr), Functor f) => (forall a. constr a => LensLike' f a b) -> LensLike' f c b cell1Lens :: Functor f => (forall a. constr a => LensLike' f (g a) b) -> LensLike' f (Cell1 g constr) b cell1Lens' :: (HasCell c (Cell1 g constr), Functor f) => (forall a. constr a => LensLike' f (g a) b) -> LensLike' f c b -- |

Change type classes

rewriteCell :: EntailsAll c0 c1 -> Cell1 f c0 -> Cell1 f c1 rewriteInst :: c0 a :- c1 a -> Inst1 f c0 a -> Inst1 f c1 a spec :: f a -> p a :- q a -> p a :- q a transEnt :: EntailsAll c0 c1 -> EntailsAll c1 c2 -> EntailsAll c0 c2 ordEntailsEq :: EntailsAll Ord Eq exArrow :: forall m cl f b. (forall a. Kleisli m (Inst1 f cl a) b) -> Kleisli m (Cell1 f cl) b -- |

QuickCheck Helpers

arbitraryCell :: Name -> ExpQ arbitraryCell' :: Name -> [TypeQ] -> ExpQ arbitraryInstanceOf :: Name -> Name -> ExpQ arbitraryInstanceOf' :: Name -> Name -> [TypeQ] -> ExpQ -- |

Utilities

-- -- Utility function to facilitate the implementation of Cell | -- functions in terms of Cell1 functions. onIdentity :: (a -> b -> c) -> Identity a -> Identity b -> c -- |

Properties

-- -- Wrapping two values in cells does not change their equality prop_consistent_equal :: (Eq a, Typeable a) => a -> a -> Property -- | Wrapping two values in cells does not change their relative order prop_consistent_compare :: (Ord a, Typeable a) => a -> a -> Property -- | Check all the QuickCheck properties. run_tests :: (PropName -> Property -> IO (a, Result)) -> IO ([a], Bool) instance Data.Existential.HasCell (Data.Existential.Cell1 f constr) (Data.Existential.Cell1 f constr) module Data.Factory type Factory constr = HashMap TypeRep (Cell1 Proxy constr) runFactory :: Factory constr -> TypeRep -> Maybe (Cell1 Proxy constr) class HasFactory constr factory :: HasFactory constr => Proxy constr -> Factory constr makeFactory :: Name -> DecsQ -- |

Serialize Cells

putCell1 :: forall constr f. HasFactory constr => (forall a. constr a => Putter (f a)) -> Putter (Cell1 f constr) getCell1 :: forall constr f. HasFactory constr => (forall a. constr a => Get (f a)) -> Get (Cell1 f constr)