Safe Haskell | Safe-Inferred |
---|---|
Language | Haskell2010 |
This library provide a brief implementation for extensible records. It is sensitive to the ordering of key-value items, but has simple type constraints and provides short compile time.
Synopsis
- data KVList (kvs :: [Type])
- data (key :: Symbol) := (value :: Type) where
- (&=) :: (KnownSymbol k, Appended kvs '[k := v] ~ appended) => KVList kvs -> (k := v) -> KVList appended
- kvcons :: KnownSymbol k => (k := v) -> KVList kvs -> KVList ((k := v) ': kvs)
- empty :: KVList '[]
- singleton :: KnownSymbol k => (k := v) -> KVList '[k := v]
- data ListKey (t :: Symbol) = ListKey
- get :: (KnownSymbol key, HasKey key kvs v) => ListKey key -> KVList kvs -> v
- type HasKey (key :: Symbol) (kvs :: [Type]) (v :: Type) = HasKey_ key kvs kvs v
- (&.) :: (KnownSymbol key, HasKey key kvs v) => KVList kvs -> ListKey key -> v
Constructors
We can create type level KV list as follows.
>>>
:set -XOverloadedLabels -XTypeOperators
>>>
import Prelude
>>>
import Data.KVList (empty, KVList, (:=)((:=)), (&.), (&=))
>>>
let sampleList = empty &= #foo := "str" &= #bar := 34
>>>
type SampleList = KVList '[ "foo" := String, "bar" := Int ]
(&=) :: (KnownSymbol k, Appended kvs '[k := v] ~ appended) => KVList kvs -> (k := v) -> KVList appended infixl 1 Source #
data ListKey (t :: Symbol) Source #
ListKey
is just a proxy, but needed to implement a non-orphan IsLabel
instance.
In most cases, you only need to create a ListKey
instance with OverloadedLabels
, such as `#foo`.