Linked
Clojure(Script) efficient map and set structures that preserve insertion order
Install / Use
/learn @frankiesardo/LinkedREADME
Linked
Map and Set structures that rememeber the insertion order of its elements, even after multiple assoc and dissoc. For Clojure and ClojureScript.
Download
Map
(require '[linked.core :as linked])
(linked/map :b 2 :a 1 :d 4)
;=> #linked/map [[:b 2] [:a 1] [:d 4]]
(assoc (linked/map :b 2 :a 1 :d 4) :c 3)
;=> #linked/map [[:b 2] [:a 1] [:d 4] [:c 3]]
(into (linked/map) [[:c 3] [:a 1] [:d 4]])
;=> #linked/map [[:c 3] [:a 1] [:d 4]]
(dissoc (linked/map :c 3 :a 1 :d 4) :a)
;=> #linked/map [[:c 3] [:d 4]]
Set
(require '[linked.core :as linked])
(linked/set 4 3 1 8 2)
;=> #linked/set [4 3 1 8 2]
(conj (linked/set 9 10) 1 2 3)
;=> #linked/set [9 10 1 2 3]
(into (linked/set) [7 6 1 5 6])
;=> #linked/set [7 6 1 5]
(disj (linked/set 8 1 7 2 6) 7)
;=> #linked/set [8 1 2 6]
Performance
These data structures wrap a normal hash-map but instead of feeding it a normal [key value] pair their remeber a [key value left-key right-key] record. When an item is removed from the data structure it is sufficient to update the left and right node to reference each others keys while removing the chosen node. This implementation yields the same Big O time and space complexity of a standard hash-map (altought effective performance will be slower by a constant factor).
Comparison with ordered
- Ordered will keep on allocating memory space until you explicitly call compact to clean up the garbage. Linked doesn't keep a pointer to old elements
- Ordered has transient support for faster allocation of a large number of items
- Linked works with ClojureScript
License
Copyright © 2014 Frankie Sardo
Distributed under the Eclipse Public License either version 1.0 or (at your option) any later version.
Related Skills
node-connect
350.8kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
110.4kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
350.8kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
350.8kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
