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 |
Derive positional product type getters and setters generically.
- class HasPosition (i :: Nat) s t a b | s i -> a, s i b -> t, t i a -> s where
- type HasPosition' i s a = HasPosition i s s a a
- getPosition :: forall i s a. HasPosition' i s a => s -> a
- setPosition :: forall i s a. HasPosition' i s a => a -> s -> s
Lenses
Running example:
>>>
:set -XTypeApplications
>>>
:set -XDataKinds
>>>
:set -XDeriveGeneric
>>>
:set -XGADTs
>>>
:set -XFlexibleContexts
>>>
import GHC.Generics
>>>
:m +Data.Generics.Internal.Lens
>>>
:m +Data.Function
>>>
:{
data Human = Human { name :: String , age :: Int , address :: String } deriving (Generic, Show) human :: Human human = Human "Tunyasz" 50 "London" :}
class HasPosition (i :: Nat) s t a b | s i -> a, s i b -> t, t i a -> s where Source #
Records that have a field at a given position.
position :: Lens s t a b Source #
A lens that focuses on a field at a given position. Compatible with the
lens package's Lens
type.
>>>
human ^. position @1
"Tunyasz">>>
human & position @3 .~ "Berlin"
Human {name = "Tunyasz", age = 50, address = "Berlin"}
Type errors
>>>
human & position @4 .~ "Berlin"
... ... The type Human does not contain a field at position 4 ...
(Generic s, ErrorUnless i s ((&&) ((<?) 0 i) ((<=?) i (Size * (Rep s)))), Generic t, (~) * s' (Proxied * s), (~) * t' (Proxied * t), Generic s', Generic t', GHasPosition' i (Rep s) a, GHasPosition' i (Rep s') a', GHasPosition 1 i (Rep s) (Rep t) a b, (~) * t (Infer s a' b), GHasPosition' i (Rep t') b', (~) * s (Infer t b' a)) => HasPosition i s t a b Source # | |
type HasPosition' i s a = HasPosition i s s a a Source #
getPosition :: forall i s a. HasPosition' i s a => s -> a Source #
setPosition :: forall i s a. HasPosition' i s a => a -> s -> s Source #