hetero-dict-0.1.0.1: Fast heterogeneous data structures

Safe HaskellNone
LanguageHaskell2010

Data.Hetero.DynDict

Contents

Description

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

Synopsis

DynDict

data DynDict kvs Source #

heterogeneous persistent sequence.

The underline data structure is Seq. support efficient add, get and modify operations.

Instances

ShowDynDict kvs => Show (DynDict kvs) Source # 

Methods

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

show :: DynDict kvs -> String #

showList :: [DynDict kvs] -> ShowS #

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 k -> DynDict ((KV * ': (* := k') v') kvs) -> v

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

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

Methods

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

modify' :: proxy 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(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")

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 k -> DynDict ((KV * ': (* := k') v') kvs) -> v

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

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

Methods

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

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

(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 k -> Dict ((KV * ': (* := k') v') kvs) -> v

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

Methods

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

ShowDynDict ([] (KV *)) Source # 

Methods

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

ShowDict ([] (KV *)) Source # 

Methods

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

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

Methods

showDict :: Int -> DynDict ((KV * ': (* := k) v) kvs) -> [(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.

Internal helpers

class ShowDynDict kvs where Source #

Helper class for defining store's Show instance.

Minimal complete definition

showDict

Methods

showDict :: Int -> DynDict kvs -> [(String, String, TypeRep)] Source #

Instances

ShowDynDict ([] (KV *)) Source # 

Methods

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

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

Methods

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