typerep-map: Efficient implementation of a dependent map with types as keys

This is a package candidate release! Here you can preview how this package release will appear once published to the main package index (which can be accomplished via the 'maintain' link below). Please note that once a package has been published to the main package index it cannot be undone! Please consult the package uploading documentation for more information.

[maintain] [Publish]


A dependent map from type representations to values of these types.

Here is an illustration of such a map:

 Int  -> 5
 Bool -> True
 Char -> 'x'

In addition to TMap, we provide TypeRepMap parametrized by a vinyl-style interpretation. This data structure is equivalent to DMap TypeRep, but with significantly more efficient lookups.

[Skip to Readme]


Versions 0.1.0, 0.2.0, 0.3.0, 0.3.1, 0.3.2,,,
Change log CHANGELOG.md
Dependencies base (>=4.10 && <4.15), containers (>= && <0.7), deepseq (==1.4.*), ghc-prim (>= && <0.7), primitive (>=0.7.0 && <0.8), vector (>= && <0.13) [details]
License MPL-2.0
Copyright 2017-2020 Kowainik
Author Veronika Romashkina, Vladislav Zavialov, Dmitrii Kovanikov
Maintainer Kowainik <xrom.xkov@gmail.com>
Category Data, Data Structures, Types
Home page https://github.com/kowainik/typerep-map
Bug tracker https://github.com/kowainik/typerep-map/issues
Source repo head: git clone https://github.com/kowainik/typerep-map.git
Uploaded by vrom911 at 2020-04-18T18:52:08Z




Maintainer's Corner

For package maintainers and hackage trustees

Readme for typerep-map-

[back to package description]



GitHub CI Build status Windows build status Hackage Stackage LTS Stackage Nightly MPL-2.0 license

typerep-map introduces TMap and TypeRepMap — data structures like Map, but where types serve as keys, and values have the types specified in the corresponding key spots.

For the more details on the implementation see the following blog post:

Usage example

ghci> import Data.TMap

ghci> tm = insert True $ one (42 :: Int)

ghci> size tm

ghci> res = lookup tm

ghci> res :: Maybe Int
Just 42

ghci> res :: Maybe Bool
Just True

ghci> res :: Maybe String

ghci> lookup (insert "hello" tm) :: Maybe String
Just "hello"

ghci> member @Int tm

ghci> tm' = delete @Int tm

ghci> member @Int tm'


Tables below contain comparision with DMap TypeRep of ten lookup operations on structure with size 10^4:

ghc-8.2.2 ghc-8.4.3 ghc-8.8.3 ghc-8.10.1
DMap TypeRep 517.5 ns 779.9 ns 1.559 μs 1.786 μs
typerep-map 205.3 ns 187.2 ns 190.1 ns 169.1 ns
ghc-8.2.2 ghc-8.4.3
DMap 8.2.2 DMap 8.4.3
TMap 8.2.2 TMap 8.4.3