Safe Haskell | None |
---|---|
Language | Haskell2010 |
Fast persistent heterogeneous list.
This module define DynDict
, which wrap a KVList
linked-list,
benchmark showed that it's faster than previouse Data.Sequence
version,
since usually the element number is small(<20).
so even operations(add, get, modify, set)'s time complexity
are not as good as Seq
, it's constantly faster in practice.
Typical usage: a heterogeneous state store, indexed by type level string.
> :set -XDataKinds -XQuasiQuotes > let d = add [key|foo|] 12 . add [key|bar|] "baz" $ empty > get [key|foo|] d 12 > get [key|bar|] d "baz" > let d' = set [key|foo|] 13 d > get [key|foo|] d' 13
- data DynDict kvs
- empty :: DynDict '[]
- add :: NotHasKey k kvs => Proxy k -> v -> DynDict kvs -> DynDict ((k := v) ': kvs)
- class InDict k v kvs | k kvs -> v
- get :: InDict k v kvs => Proxy k -> DynDict kvs -> v
- modify :: InDict k v kvs => Proxy k -> (v -> v) -> DynDict kvs -> DynDict kvs
- set :: InDict k v kvs => Proxy k -> v -> DynDict kvs -> DynDict kvs
- size :: DynDict kvs -> Int
- key :: QuasiQuoter
- data KV v = Symbol := v
- data KVList kvs where
- type NotHasKey k kvs = AddKey k kvs ~ HasKey k
- type Ix k kvs = Ix' 0 k kvs
DynDict
heterogeneous persistent sequence.
ShowDict kvs => Show (DynDict kvs) Source # | |
(KnownSymbol k, ToJSON v, ToJSON (DynDict kvs)) => ToJSON (DynDict ((:) (KV *) ((:=) * k v) kvs)) Source # | |
ToJSON (DynDict ([] (KV *))) Source # | |
(KnownSymbol k, FromJSON v, FromJSON (DynDict kvs)) => FromJSON (DynDict ((:) (KV *) ((:=) * k v) kvs)) Source # | |
FromJSON (DynDict ([] (KV *))) Source # | |
add :: NotHasKey k kvs => Proxy k -> v -> DynDict kvs -> DynDict ((k := v) ': kvs) Source #
O(1) insert new k-v pair into DynDict
.
class InDict k v kvs | k kvs -> v Source #
Constraint ensure DynDict
must contain k-v pair.
get', modify'
modify :: InDict k v kvs => Proxy k -> (v -> v) -> DynDict kvs -> DynDict kvs Source #
O(m) modify value by associated key.
set :: InDict k v kvs => Proxy k -> v -> DynDict kvs -> DynDict kvs Source #
O(m) modify value by associated key.
re-export from KVList
key :: QuasiQuoter Source #
Quoter for constructing string literal proxy.
[key|foo|] == (Proxy :: Proxy "foo")
(kind) key-value pair
(InDict k v kvs, (~) GetResult (Index i) (Ix k ((:) (KV *) ((:=) * k' v') kvs)), KnownNat i) => InDict k v ((:) (KV *) ((:=) * k' v') kvs) Source # | |
InDict k v ((:) (KV *) ((:=) * k v) kvs) Source # | |
(InDict k v kvs, (~) GetResult (Index i) (Ix k ((:) (KV *) ((:=) * k' v') kvs)), KnownNat i) => InDict k v ((:) (KV *) ((:=) * k' v') kvs) Source # | |
InDict k v ((:) (KV *) ((:=) * k v) kvs) Source # | |
(KnownSymbol k, ToJSON v, ToJSON (DynDict kvs)) => ToJSON (DynDict ((:) (KV *) ((:=) * k v) kvs)) # | |
ToJSON (DynDict ([] (KV *))) # | |
(KnownSymbol k, FromJSON v, FromJSON (DynDict kvs)) => FromJSON (DynDict ((:) (KV *) ((:=) * k v) kvs)) # | |
FromJSON (DynDict ([] (KV *))) # | |
ShowDict ([] (KV *)) Source # | |
(KnownSymbol k, Typeable * v, Show v, ShowDict kvs) => ShowDict ((:) (KV *) ((:=) * k v) kvs) Source # | |