Safe Haskell | None |
---|---|
Language | Haskell2010 |
Fast persistent heterogeneous sequence.
This module define DynDict
, which use Seq
as underline data structure,
so all operations(add, get, modify, set)'s time complexity are similar.
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
- 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
- class ShowDynDict kvs where
DynDict
heterogeneous persistent sequence.
The underline data structure is Seq
.
support efficient add
, get
and modify
operations.
ShowDynDict kvs => Show (DynDict kvs) 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'
get :: InDict k v kvs => proxy k -> DynDict kvs -> v Source #
O(log(min(i,n-i))) get value using associated key.
modify :: InDict k v kvs => proxy k -> (v -> v) -> DynDict kvs -> DynDict kvs Source #
O(log(min(i,n-i))) modify value by associated key.
set :: InDict k v kvs => proxy k -> v -> DynDict kvs -> DynDict kvs Source #
O(log(min(i,n-i))) 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 # | |
ShowDynDict ([] (KV *)) Source # | |
ShowDict ([] (KV *)) Source # | |
(KnownSymbol k, Typeable * v, Show v, ShowDynDict kvs) => ShowDynDict ((:) (KV *) ((:=) * k v) kvs) Source # | |
(KnownSymbol k, Typeable * v, Show v, ShowDict kvs) => ShowDict ((:) (KV *) ((:=) * k v) kvs) Source # | |
type NotHasKey k kvs = AddKey k kvs ~ HasKey k Source #
Constraint ensure a key will be inserted into Store
.
Internal helpers
class ShowDynDict kvs where Source #
Helper class for defining store's Show
instance.
ShowDynDict ([] (KV *)) Source # | |
(KnownSymbol k, Typeable * v, Show v, ShowDynDict kvs) => ShowDynDict ((:) (KV *) ((:=) * k v) kvs) Source # | |