Copyright | (C) 2017 Csongor Kiss |
---|---|
License | BSD3 |
Maintainer | Csongor Kiss <kiss.csongor.kiss@gmail.com> |
Stability | experimental |
Portability | non-portable |
Safe Haskell | Safe |
Language | Haskell2010 |
Magic sum operations using Generics
These classes need not be instantiated manually, as GHC can automatically
prove valid instances via Generics. Only the Generic
class needs to
be derived (see examples).
- class AsAny sel a s | s sel k -> a where
- class AsConstructor ctor a s | s ctor -> a where
- class AsSubtype sub sup where
- class AsType a s where
Prisms
class AsAny sel a s | s sel k -> a where Source #
Sums that have generic prisms.
A prism that projects a sum as identified by some selector. Currently
supported selectors are constructor names and unique types. Compatible
with the lens package's Prism
type.
>>>
dog ^? _As @"Dog"
Just (MkDog {name = "Shep", age = 3})>>>
dog ^? _As @Dog
Just (MkDog {name = "Shep", age = 3})>>>
dog ^? _As @"Cat"
Nothing>>>
cat ^? _As @(Name, Age)
Just ("Mog",5)>>>
cat ^? _As @"Cat"
Just ("Mog",5)>>>
_As @"Cat" # ("Garfield", 6) :: Animal
Cat ("Garfield",6)>>>
duck ^? _As @Age
Just 2
class AsConstructor ctor a s | s ctor -> a where Source #
Sums that have a constructor with a given name.
A prism that projects a named constructor from a sum. Compatible with the
lens package's Prism
type.
>>>
dog ^? _Ctor @"Dog"
Just (MkDog {name = "Shep", age = 3})
>>>
dog ^? _Ctor @"Cat"
Nothing
>>>
cat ^? _Ctor @"Cat"
Just ("Mog", 5)
>>>
_Ctor @"Cat" # ("Garfield", 6) :: Animal
Cat ("Garfield", 6)
class AsSubtype sub sup where Source #
Structural subtyping between sums. A sum Sub
is a subtype of another sum
Sup
if a value of Sub
can be given (modulo naming of constructors)
whenever a value of Sup
is expected. In the running example for instance,
FourLeggedAnimal
is a subtype of Animal
since a value of the former can
be given as a value of the latter (renaming Dog4
to Dog
and Cat4
to
Cat
).
_Sub :: Prism' sup sub Source #
A prism that captures structural subtyping. Allows a substructure to be injected (upcast) into a superstructure or a superstructure to be downcast into a substructure (which may fail).
>>>
_Sub # dog4 :: Animal
Dog (MkDog {name = "Snowy", age = 4})>>>
cat ^? _Sub :: Maybe FourLeggedAnimal
Just (Cat4 "Mog" 5)>>>
duck ^? _Sub :: Maybe FourLeggedAnimal
Nothing
injectSub :: sub -> sup Source #
Injects a subtype into a supertype (upcast).
projectSub :: sup -> Either sup sub Source #
Projects a subtype from a supertype (downcast).
class AsType a s where Source #
Sums that have a constructor with a field of the given type.
A prism that projects a constructor uniquely identifiable by the type of
its field. Compatible with the lens package's Prism
type.
>>>
dog ^? _Typed @Dog
Just (MkDog {name = "Shep", age = 3})>>>
dog ^? _Typed @Age
Nothing>>>
cat ^? _Typed @(Name, Age)
Just ("Mog",5)>>>
duck ^? _Typed @Age
Just 2
injectTyped :: a -> s Source #
Inject by type.
projectTyped :: s -> Maybe a Source #
Project by type.