blob: c340c74e7202ca0a201aa3a882de20a8205764a7 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
;; PersistentFnMap.clj: implementation for clojure.contrib.fnmap
;; Copyright (c) Stuart Sierra, 2009. All rights reserved. The use
;; and distribution terms for this software are covered by the Eclipse
;; Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)
;; which can be found in the file epl-v10.html at the root of this
;; distribution. By using this software in any fashion, you are
;; agreeing to be bound by the terms of this license. You must not
;; remove this notice, or any other, from this software.
;; Thanks to Meikel Brandmeyer for his work on lazymap, which made
;; this implementation easier.
(ns clojure.contrib.fnmap.PersistentFnMap
(:gen-class :extends clojure.lang.APersistentMap
:state state
:init init
:constructors {[clojure.lang.IPersistentMap] [],
[clojure.lang.IPersistentMap clojure.lang.IPersistentMap] [clojure.lang.IPersistentMap]}))
(defn -init
([theMap] [[] theMap])
([theMap metadata] [[metadata] theMap]))
(defn create [getter setter]
(clojure.contrib.fnmap.PersistentFnMap.
{::getter getter ::setter setter}))
;; IPersistentMap
(defn -assoc [this key value]
(clojure.contrib.fnmap.PersistentFnMap.
((::setter (. this state)) (. this state) key value)))
;; Associative
(defn- -containsKey [this key]
(not (nil? ((::getter (. this state)) this key))))
(defn- -entryAt [this key]
(clojure.lang.MapEntry. key ((::getter (. this state)) (. this state) key)))
(defn -valAt [this key]
((::getter (. this state)) (. this state) key))
;; Iterable
(defn -iterator [this]
(.. this state iterator))
;; IPersistentCollection
(defn -count [this]
(count (. this state)))
(defn -seq [this]
(seq (. this state)))
(defn -cons [this that]
(.. this state (cons this that)))
(defn -empty [this]
(.. this state empty))
|