Commits

Meikel Brandmeyer committed 1633d40

Moved LazyMapSeq to reify

Comments (0)

Files changed (3)

             </classpath>
             <sysproperty key="clojure.compile.path" value="${classes.dir}"/>
             <arg value="de.kotka.lazymap.LazyMapEntry"/>
-            <arg value="de.kotka.lazymap.LazyMapSeq"/>
             <arg value="de.kotka.lazymap"/>
         </java>
     </target>

src/de/kotka/lazymap.clj

      clojure.lang.IFn
      clojure.lang.IMapEntry
      clojure.lang.IPersistentVector
+     clojure.lang.ISeq
      clojure.lang.SeqIterator
-     de.kotka.lazymap.LazyMapEntry
-     de.kotka.lazymap.LazyMapSeq))
+     de.kotka.lazymap.LazyMapEntry))
 
 (gen-interface
   :name    de.kotka.lazymap.ILazyMap
 
 (import 'de.kotka.lazymap.ILazyMap)
 
+(defn create-lazy-map-seq
+  ([inner-seq]
+   (create-lazy-map-seq inner-seq nil))
+  ([inner-seq metadata]
+   (reify this [ISeq IObj]
+     ; ISeq
+     (.first
+       []
+       (let [first-val (first inner-seq)]
+         (LazyMapEntry. (key first-val) (val first-val))))
+     (.next
+       []
+       (when-let [inner-rest (next inner-seq)]
+         (create-lazy-map-seq inner-rest metadata)))
+     (.more
+       []
+       (lazy-seq
+         (.next this)))
+     (.cons
+       [o]
+       (concat [o] this))
+     ; IPersistentCollection
+     (.count
+       []
+       (count inner-seq))
+     (.empty
+       []
+       ())
+     (.seq
+       []
+       this)
+     ; IObj
+     (.withMeta
+       [new-metadata]
+       (create-lazy-map-seq inner-seq new-metadata))
+     ;IMeta
+     (.meta
+       []
+       metadata))))
+
 (defn create-lazy-map
   ([base]
    (create-lazy-map base nil))
      (.seq
        []
        (when-let [inner-seq (seq base)]
-         (LazyMapSeq. inner-seq)))
+         (create-lazy-map-seq inner-seq)))
      ; IObj
      (.withMeta
        [new-metadata]

src/de/kotka/lazymap/LazyMapSeq.clj

-;-
-; Copyright 2008,2009 (c) Meikel Brandmeyer.
-; All rights reserved.
-;
-; Permission is hereby granted, free of charge, to any person obtaining a copy
-; of this software and associated documentation files (the "Software"), to deal
-; in the Software without restriction, including without limitation the rights
-; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-; copies of the Software, and to permit persons to whom the Software is
-; furnished to do so, subject to the following conditions:
-;
-; The above copyright notice and this permission notice shall be included in
-; all copies or substantial portions of the Software.
-;
-; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-; THE SOFTWARE.
-
-(clojure.core/ns de.kotka.lazymap.LazyMapSeq
-  (:gen-class
-     :init         init
-     :state        theSeq
-     :extends      clojure.lang.ASeq
-     :constructors {[clojure.lang.ISeq] []
-                    [clojure.lang.ISeq clojure.lang.IPersistentMap]
-                    [clojure.lang.IPersistentMap]}))
-
-(defn- -init
-  ([theSeq]         [[] theSeq])
-  ([theSeq theMeta] [[theMeta] theSeq]))
-
-(defn- -first
-  [#^de.kotka.lazymap.LazyMapSeq this]
-  (let [first-val (first (.theSeq this))]
-    (de.kotka.lazymap.LazyMapEntry. (key first-val) (val first-val))))
-
-(defn- -next
-  [#^de.kotka.lazymap.LazyMapSeq this]
-  (when-let [inner-rest (next (.theSeq this))]
-    (de.kotka.lazymap.LazyMapSeq. inner-rest)))