Copyright | (C) 2019 Csongor Kiss |
---|---|
License | BSD3 |
Maintainer | Csongor Kiss <kiss.csongor.kiss@gmail.com> |
Stability | experimental |
Portability | non-portable |
Safe Haskell | None |
Language | Haskell2010 |
Derive lenses of a given type in a product.
Lenses
Running example:
>>>
:set -XTypeApplications
>>>
:set -XDataKinds
>>>
:set -XDeriveGeneric
>>>
import GHC.Generics
>>>
:m +Data.Generics.Internal.VL.Lens
>>>
:{
data Human = Human { name :: String , age :: Int , address :: String , tall :: Bool } | HumanNoTall { name :: String , age :: Int , address :: String } deriving (Generic, Show) human :: Human human = Human "Tunyasz" 50 "London" False :}
class HasType a s where Source #
Records that have a field with a unique type.
typed :: Lens s s a a Source #
A lens that focuses on a field with a unique type in its parent type.
Compatible with the lens package's Lens
type.
>>>
human ^. typed @Int
50
Type errors
>>>
human ^. typed @String
... ... ... The type Human contains multiple values of type [Char]. ... The choice of value is thus ambiguous. The offending constructors are: ... Human ... HumanNoTall ...
>>>
human ^. typed @Bool
... ... ... Not all constructors of the type Human contain a field of type Bool. ... The offending constructors are: ... HumanNoTall ...
Get field at type.
setTyped :: a -> s -> s Source #
Set field at type.
Instances
HasType a Void Source # | See Note [Uncluttering type signatures] |
HasType a a Source # | |
(Generic s, ErrorUnlessOne a s (CollectTotalType a (Rep s)), Defined (Rep s) (NoGeneric s ((Text "arising from a generic lens focusing on a field of type " :<>: QuoteType a) ': ([] :: [ErrorMessage]))) (), GLens (HasTotalTypePSym a) (Rep s) (Rep s) a a) => HasType a s Source # | |