Awesome
chainmap
A custom Map-like datastructure where multiple maps can be linked in O(1) time and can be treated as a single unit. When looking up keys in a ChainMap the individual maps are searched in succession.
Useful when you need to quickly create multiple contexts without the O(n) overhead of using merge
.
Caveat - The current implementation is not performant.
Usage
(ns foo
(:use [chainmap.core :only [chainmap]]))
(chainmap {:x 1} {:x 10 :y 20} {:x 100 :y 200 :z 300})
;=> #ChainMap<({:x 1} {:y 20, :x 10} {:z 300, :y 200, :x 100})>
(def cm (chainmap {:x 1} {:x 10, :y 20} {:x 100, :y 200, :z 300}))
;=> #'user/cm
(maps cm)
;=> ({:x 1} {:y 20, :x 10} {:z 300, :y 200, :x 100})
(get cm :z)
;=> 300
(map cm [:x :y :z])
;=> (1 20 300)
(parents cm)
;=> #ChainMap<({:y 20, :x 10} {:z 300, :y 200, :x 100})>
(add-child cm)
;=> #ChainMap<({} {:x 1} {:y 20, :x 10} {:z 300, :y 200, :x 100})>
(add-child cm {:x 42})
;=> #ChainMap<({:x 42} {:x 1} {:y 20, :x 10} {:z 300, :y 200, :x 100})>
Acknowledgements
Based on the ChainMap class from Python collections library.
License
Copyright (C) 2011 Baishampayan Ghose
Distributed under the Eclipse Public License, the same as Clojure.