hetero-dict-0.1.1.0: Fast heterogeneous data structures

Safe HaskellNone
LanguageHaskell2010

Data.Hetero.DynDict

Contents

Description

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

Synopsis

DynDict

data DynDict kvs Source #

heterogeneous persistent sequence.

Instances

ShowDict kvs => Show (DynDict kvs) Source # 

Methods

showsPrec :: Int -> DynDict kvs -> ShowS #

show :: DynDict kvs -> String #

showList :: [DynDict kvs] -> ShowS #

(KnownSymbol k, ToJSON v, ToJSON (DynDict kvs)) => ToJSON (DynDict ((:) (KV *) ((:=) * k v) kvs)) Source # 

Methods

toJSON :: DynDict ((KV * ': (* := k) v) kvs) -> Value #

toEncoding :: DynDict ((KV * ': (* := k) v) kvs) -> Encoding #

ToJSON (DynDict ([] (KV *))) Source # 
(KnownSymbol k, FromJSON v, FromJSON (DynDict kvs)) => FromJSON (DynDict ((:) (KV *) ((:=) * k v) kvs)) Source # 

Methods

parseJSON :: Value -> Parser (DynDict ((KV * ': (* := k) v) kvs)) #

FromJSON (DynDict ([] (KV *))) Source # 

Methods

parseJSON :: Value -> Parser (DynDict [KV *]) #

empty :: DynDict '[] Source #

A empty DynDict.

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.

Minimal complete definition

get', modify'

Instances

(InDict k v kvs, (~) GetResult (Index i) (Ix k ((:) (KV *) ((:=) * k' v') kvs)), KnownNat i) => InDict k v ((:) (KV *) ((:=) * k' v') kvs) Source # 

Methods

get' :: Proxy Symbol k -> DynDict ((KV * ': (* := k') v') kvs) -> v

modify' :: Proxy Symbol k -> (v -> v) -> DynDict ((KV * ': (* := k') v') kvs) -> DynDict ((KV * ': (* := k') v') kvs)

InDict k v ((:) (KV *) ((:=) * k v) kvs) Source # 

Methods

get' :: Proxy Symbol k -> DynDict ((KV * ': (* := k) v) kvs) -> v

modify' :: Proxy Symbol k -> (v -> v) -> DynDict ((KV * ': (* := k) v) kvs) -> DynDict ((KV * ': (* := k) v) kvs)

get :: InDict k v kvs => Proxy k -> DynDict kvs -> v Source #

O(m) get value using associated key.

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.

size :: DynDict kvs -> Int Source #

O(n) size

re-export from KVList

key :: QuasiQuoter Source #

Quoter for constructing string literal proxy.

[key|foo|] == (Proxy :: Proxy "foo")

data KV v Source #

(kind) key-value pair

Constructors

Symbol := v 

Instances

(InDict k v kvs, (~) GetResult (Index i) (Ix k ((:) (KV *) ((:=) * k' v') kvs)), KnownNat i) => InDict k v ((:) (KV *) ((:=) * k' v') kvs) Source # 

Methods

get' :: Proxy Symbol k -> Dict ((KV * ': (* := k') v') kvs) -> v

InDict k v ((:) (KV *) ((:=) * k v) kvs) Source # 

Methods

get' :: Proxy Symbol k -> Dict ((KV * ': (* := k) v) kvs) -> v

(InDict k v kvs, (~) GetResult (Index i) (Ix k ((:) (KV *) ((:=) * k' v') kvs)), KnownNat i) => InDict k v ((:) (KV *) ((:=) * k' v') kvs) Source # 

Methods

get' :: Proxy Symbol k -> DynDict ((KV * ': (* := k') v') kvs) -> v

modify' :: Proxy Symbol k -> (v -> v) -> DynDict ((KV * ': (* := k') v') kvs) -> DynDict ((KV * ': (* := k') v') kvs)

InDict k v ((:) (KV *) ((:=) * k v) kvs) Source # 

Methods

get' :: Proxy Symbol k -> DynDict ((KV * ': (* := k) v) kvs) -> v

modify' :: Proxy Symbol k -> (v -> v) -> DynDict ((KV * ': (* := k) v) kvs) -> DynDict ((KV * ': (* := k) v) kvs)

(KnownSymbol k, ToJSON v, ToJSON (DynDict kvs)) => ToJSON (DynDict ((:) (KV *) ((:=) * k v) kvs)) # 

Methods

toJSON :: DynDict ((KV * ': (* := k) v) kvs) -> Value #

toEncoding :: DynDict ((KV * ': (* := k) v) kvs) -> Encoding #

ToJSON (DynDict ([] (KV *))) # 
(KnownSymbol k, FromJSON v, FromJSON (DynDict kvs)) => FromJSON (DynDict ((:) (KV *) ((:=) * k v) kvs)) # 

Methods

parseJSON :: Value -> Parser (DynDict ((KV * ': (* := k) v) kvs)) #

FromJSON (DynDict ([] (KV *))) # 

Methods

parseJSON :: Value -> Parser (DynDict [KV *]) #

ShowDict ([] (KV *)) Source # 

Methods

showDict :: Int -> Dict [KV *] -> [(String, String, TypeRep)] Source #

(KnownSymbol k, Typeable * v, Show v, ShowDict kvs) => ShowDict ((:) (KV *) ((:=) * k v) kvs) Source # 

Methods

showDict :: Int -> Dict ((KV * ': (* := k) v) kvs) -> [(String, String, TypeRep)] Source #

data KVList kvs where Source #

A simple heterogeneous kv linked-list.

Constructors

Cons :: !v -> KVList kvs -> KVList ((k := v) ': kvs) 
Empty :: KVList '[] 

type NotHasKey k kvs = AddKey k kvs ~ HasKey k Source #

Constraint ensure a key will be inserted into Store.

type Ix k kvs = Ix' 0 k kvs Source #

Indexing a key at compile time.