summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2009-02-02 16:40:22 +0000
committerRich Hickey <richhickey@gmail.com>2009-02-02 16:40:22 +0000
commit688633e70fdeeb70c56e2f7dd8e5551378c9d764 (patch)
tree41df218d56a05b602f531d828b9dbabcec3e9947
parent65528bfe81d605eab6fe3e475ada08f55bcc5ab5 (diff)
[lazy] moving off of lazy-cons - remove, takes, drops
-rw-r--r--src/clj/clojure/core.clj58
-rw-r--r--src/jvm/clojure/lang/APersistentMap.java4
-rw-r--r--src/jvm/clojure/lang/APersistentVector.java4
-rw-r--r--src/jvm/clojure/lang/ASeq.java19
-rw-r--r--src/jvm/clojure/lang/ArraySeq.java10
-rw-r--r--src/jvm/clojure/lang/Cons.java6
-rw-r--r--src/jvm/clojure/lang/EnumerationSeq.java2
-rw-r--r--src/jvm/clojure/lang/IteratorSeq.java2
-rw-r--r--src/jvm/clojure/lang/LazyCons.java2
-rw-r--r--src/jvm/clojure/lang/PersistentArrayMap.java2
-rw-r--r--src/jvm/clojure/lang/PersistentHashMap.java4
-rw-r--r--src/jvm/clojure/lang/PersistentList.java2
-rw-r--r--src/jvm/clojure/lang/PersistentQueue.java2
-rw-r--r--src/jvm/clojure/lang/PersistentStructMap.java2
-rw-r--r--src/jvm/clojure/lang/PersistentTreeMap.java2
-rw-r--r--src/jvm/clojure/lang/RT.java2
-rw-r--r--src/jvm/clojure/lang/Range.java2
-rw-r--r--src/jvm/clojure/lang/StreamSeq.java2
-rw-r--r--src/jvm/clojure/lang/StringSeq.java2
19 files changed, 74 insertions, 55 deletions
diff --git a/src/clj/clojure/core.clj b/src/clj/clojure/core.clj
index fc25a32a..3eeee967 100644
--- a/src/clj/clojure/core.clj
+++ b/src/clj/clojure/core.clj
@@ -834,8 +834,12 @@
(defn complement
"Takes a fn f and returns a fn that takes the same arguments as f,
has the same effects, if any, and returns the opposite truth value."
- [f] (fn [& args]
- (not (apply f args))))
+ [f]
+ (fn
+ ([] (not (f)))
+ ([x] (not (f x)))
+ ([x y] (not (f x y)))
+ ([x y & zs] (not (apply f x y zs)))))
(defn constantly
"Returns a function that takes any number of arguments and returns x."
@@ -1419,9 +1423,8 @@
f should accept number-of-colls arguments."
([f coll]
(lazy-seq
- (let [s (seq coll)]
- (when s
- (cons (f (first s)) (map f (more s)))))))
+ (when (seq coll)
+ (cons (f (first coll)) (map f (more coll))))))
([f c1 c2]
(lazy-seq
(when (and (seq c1) (seq c2))
@@ -1458,47 +1461,50 @@
(defn remove
- "Returns a lazy seq of the items in coll for which
+ "Returns a lazy sequence of the items in coll for which
(pred item) returns false. pred must be free of side-effects."
[pred coll]
- (when (seq coll)
- (if (pred (first coll))
- (recur pred (rest coll))
- (lazy-cons (first coll) (remove pred (rest coll))))))
+ (filter (complement pred) coll))
(defn take
- "Returns a lazy seq of the first n items in coll, or all items if
+ "Returns a lazy sequence of the first n items in coll, or all items if
there are fewer than n."
[n coll]
- (when (and (pos? n) (seq coll))
- (lazy-cons (first coll) (when (> n 1) (take (dec n) (rest coll))))))
+ (lazy-seq
+ (when (and (pos? n) (seq coll))
+ (cons (first coll) (take (dec n) (more coll))))))
(defn take-while
- "Returns a lazy seq of successive items from coll while
+ "Returns a lazy sequence of successive items from coll while
(pred item) returns true. pred must be free of side-effects."
[pred coll]
- (when (and (seq coll) (pred (first coll)))
- (lazy-cons (first coll) (take-while pred (rest coll)))))
+ (lazy-seq
+ (when (and (seq coll) (pred (first coll)))
+ (cons (first coll) (take-while pred (more coll))))))
(defn drop
- "Returns a lazy seq of all but the first n items in coll."
+ "Returns a lazy sequence of all but the first n items in coll."
[n coll]
- (if (and (pos? n) (seq coll))
- (recur (dec n) (rest coll))
- (seq coll)))
+ (let [step (fn [n coll]
+ (if (and (pos? n) (seq coll))
+ (recur (dec n) (more coll))
+ (seq coll)))]
+ (lazy-seq (step n coll))))
(defn drop-last
- "Return a lazy seq of all but the last n (default 1) items in coll"
+ "Return a lazy sequence of all but the last n (default 1) items in coll"
([s] (drop-last 1 s))
- ([n s] (map (fn [x _] x) (seq s) (drop n s))))
+ ([n s] (map (fn [x _] x) s (drop n s))))
(defn drop-while
- "Returns a lazy seq of the items in coll starting from the first
+ "Returns a lazy sequence of the items in coll starting from the first
item for which (pred item) returns nil."
[pred coll]
- (if (and (seq coll) (pred (first coll)))
- (recur pred (rest coll))
- (seq coll)))
+ (let [step (fn [pred coll]
+ (if (and (seq coll) (pred (first coll)))
+ (recur pred (more coll))
+ (seq coll)))]
+ (lazy-seq (step pred coll))))
(defn cycle
"Returns a lazy (infinite!) seq of repetitions of the items in
diff --git a/src/jvm/clojure/lang/APersistentMap.java b/src/jvm/clojure/lang/APersistentMap.java
index fd700e0e..4d8bc8f7 100644
--- a/src/jvm/clojure/lang/APersistentMap.java
+++ b/src/jvm/clojure/lang/APersistentMap.java
@@ -130,7 +130,7 @@ static public class KeySeq extends ASeq{
return ((Map.Entry) seq.first()).getKey();
}
- public Seqable more(){
+ public ISeq rest(){
return create(seq.rest());
}
@@ -161,7 +161,7 @@ static public class ValSeq extends ASeq{
return ((Map.Entry) seq.first()).getValue();
}
- public Seqable more(){
+ public ISeq rest(){
return create(seq.rest());
}
diff --git a/src/jvm/clojure/lang/APersistentVector.java b/src/jvm/clojure/lang/APersistentVector.java
index 8e6a85b8..4cb753a8 100644
--- a/src/jvm/clojure/lang/APersistentVector.java
+++ b/src/jvm/clojure/lang/APersistentVector.java
@@ -438,7 +438,7 @@ public IStream stream() throws Exception {
return v.nth(i);
}
- public Seqable more(){
+ public ISeq rest(){
if(i + 1 < v.count())
return new APersistentVector.Seq(v, i + 1);
return null;
@@ -490,7 +490,7 @@ static class RSeq extends ASeq implements IndexedSeq{
return v.nth(i);
}
- public Seqable more(){
+ public ISeq rest(){
if(i > 0)
return new APersistentVector.RSeq(v, i - 1);
return null;
diff --git a/src/jvm/clojure/lang/ASeq.java b/src/jvm/clojure/lang/ASeq.java
index f658ee91..29cc61d4 100644
--- a/src/jvm/clojure/lang/ASeq.java
+++ b/src/jvm/clojure/lang/ASeq.java
@@ -110,12 +110,19 @@ public ISeq cons(Object o){
return new Cons(o, this);
}
-final public ISeq rest(){
- Seqable m = more();
- if(m == null)
- return null;
- return m.seq();
-}
+public Seqable more(){
+ ISeq s = rest();
+ if(s == null)
+ return PersistentList.EMPTY;
+ return s;
+}
+
+//final public ISeq rest(){
+// Seqable m = more();
+// if(m == null)
+// return null;
+// return m.seq();
+//}
// java.util.Collection implementation
diff --git a/src/jvm/clojure/lang/ArraySeq.java b/src/jvm/clojure/lang/ArraySeq.java
index f0d825a4..bbe3b199 100644
--- a/src/jvm/clojure/lang/ArraySeq.java
+++ b/src/jvm/clojure/lang/ArraySeq.java
@@ -65,7 +65,7 @@ public Object first(){
return Reflector.prepRet(Array.get(array, i));
}
-public Seqable more(){
+public ISeq rest(){
if(oa != null)
{
if(i + 1 < oa.length)
@@ -138,7 +138,7 @@ static public class ArraySeq_int extends ASeq implements IndexedSeq, IReduce{
return array[i];
}
- public Seqable more(){
+ public ISeq rest(){
if(i + 1 < array.length)
return new ArraySeq_int(meta(), array, i + 1);
return null;
@@ -186,7 +186,7 @@ static public class ArraySeq_float extends ASeq implements IndexedSeq, IReduce{
return array[i];
}
- public Seqable more(){
+ public ISeq rest(){
if(i + 1 < array.length)
return new ArraySeq_float(meta(), array, i + 1);
return null;
@@ -233,7 +233,7 @@ static public class ArraySeq_double extends ASeq implements IndexedSeq, IReduce{
return array[i];
}
- public Seqable more(){
+ public ISeq rest(){
if(i + 1 < array.length)
return new ArraySeq_double(meta(), array, i + 1);
return null;
@@ -280,7 +280,7 @@ static public class ArraySeq_long extends ASeq implements IndexedSeq, IReduce{
return array[i];
}
- public Seqable more(){
+ public ISeq rest(){
if(i + 1 < array.length)
return new ArraySeq_long(meta(), array, i + 1);
return null;
diff --git a/src/jvm/clojure/lang/Cons.java b/src/jvm/clojure/lang/Cons.java
index a120aa19..3d2aef64 100644
--- a/src/jvm/clojure/lang/Cons.java
+++ b/src/jvm/clojure/lang/Cons.java
@@ -33,7 +33,13 @@ public Object first(){
return _first;
}
+public ISeq rest(){
+ return more().seq();
+}
+
public Seqable more(){
+ if(_more == null)
+ return PersistentList.EMPTY;
return _more;
}
diff --git a/src/jvm/clojure/lang/EnumerationSeq.java b/src/jvm/clojure/lang/EnumerationSeq.java
index 2cd7688c..7c579651 100644
--- a/src/jvm/clojure/lang/EnumerationSeq.java
+++ b/src/jvm/clojure/lang/EnumerationSeq.java
@@ -52,7 +52,7 @@ public Object first(){
return state.val;
}
-public Seqable more(){
+public ISeq rest(){
if(state._rest == state)
synchronized(state)
{
diff --git a/src/jvm/clojure/lang/IteratorSeq.java b/src/jvm/clojure/lang/IteratorSeq.java
index 6015428c..4a5ab80c 100644
--- a/src/jvm/clojure/lang/IteratorSeq.java
+++ b/src/jvm/clojure/lang/IteratorSeq.java
@@ -50,7 +50,7 @@ public Object first(){
return state.val;
}
-public Seqable more(){
+public ISeq rest(){
if(state._rest == state)
synchronized(state)
{
diff --git a/src/jvm/clojure/lang/LazyCons.java b/src/jvm/clojure/lang/LazyCons.java
index 20daba01..ee60a891 100644
--- a/src/jvm/clojure/lang/LazyCons.java
+++ b/src/jvm/clojure/lang/LazyCons.java
@@ -49,7 +49,7 @@ public Object first(){
final
synchronized
-public Seqable more(){
+public ISeq rest(){
if(_rest == sentinel)
{
try
diff --git a/src/jvm/clojure/lang/PersistentArrayMap.java b/src/jvm/clojure/lang/PersistentArrayMap.java
index 6fa05319..d8fbd354 100644
--- a/src/jvm/clojure/lang/PersistentArrayMap.java
+++ b/src/jvm/clojure/lang/PersistentArrayMap.java
@@ -216,7 +216,7 @@ static class Seq extends ASeq{
return new MapEntry(array[i],array[i+1]);
}
- public Seqable more(){
+ public ISeq rest(){
if(i + 2 < array.length)
return new Seq(array, i + 2);
return null;
diff --git a/src/jvm/clojure/lang/PersistentHashMap.java b/src/jvm/clojure/lang/PersistentHashMap.java
index f4c700e4..d696cd5a 100644
--- a/src/jvm/clojure/lang/PersistentHashMap.java
+++ b/src/jvm/clojure/lang/PersistentHashMap.java
@@ -349,7 +349,7 @@ final static class FullNode implements INode{
return s.first();
}
- public Seqable more(){
+ public ISeq rest(){
ISeq nexts = s.rest();
if(nexts != null)
return new Seq(nexts, i, node);
@@ -507,7 +507,7 @@ final static class BitmapIndexedNode implements INode{
return s.first();
}
- public Seqable more(){
+ public ISeq rest(){
ISeq nexts = s.rest();
if(nexts != null)
return new Seq(nexts, i, node);
diff --git a/src/jvm/clojure/lang/PersistentList.java b/src/jvm/clojure/lang/PersistentList.java
index 26f7fea3..fabe5e1e 100644
--- a/src/jvm/clojure/lang/PersistentList.java
+++ b/src/jvm/clojure/lang/PersistentList.java
@@ -64,7 +64,7 @@ public Object first(){
return _first;
}
-public Seqable more(){
+public ISeq rest(){
if(_count == 1)
return null;
return (ISeq) _rest;
diff --git a/src/jvm/clojure/lang/PersistentQueue.java b/src/jvm/clojure/lang/PersistentQueue.java
index f2205741..552cdb42 100644
--- a/src/jvm/clojure/lang/PersistentQueue.java
+++ b/src/jvm/clojure/lang/PersistentQueue.java
@@ -140,7 +140,7 @@ static class Seq extends ASeq{
return f.first();
}
- public Seqable more(){
+ public ISeq rest(){
ISeq f1 = f.rest();
ISeq r1 = rseq;
if(f1 == null)
diff --git a/src/jvm/clojure/lang/PersistentStructMap.java b/src/jvm/clojure/lang/PersistentStructMap.java
index affad2fe..01e86346 100644
--- a/src/jvm/clojure/lang/PersistentStructMap.java
+++ b/src/jvm/clojure/lang/PersistentStructMap.java
@@ -216,7 +216,7 @@ static class Seq extends ASeq{
return new MapEntry(keys.first(), vals[i]);
}
- public Seqable more(){
+ public ISeq rest(){
if(i + 1 < vals.length)
return new Seq(_meta, keys.rest(), vals, i + 1, ext);
return ext.seq();
diff --git a/src/jvm/clojure/lang/PersistentTreeMap.java b/src/jvm/clojure/lang/PersistentTreeMap.java
index 035c01eb..1cd40969 100644
--- a/src/jvm/clojure/lang/PersistentTreeMap.java
+++ b/src/jvm/clojure/lang/PersistentTreeMap.java
@@ -781,7 +781,7 @@ static public class Seq extends ASeq{
return stack.first();
}
- public Seqable more(){
+ public ISeq rest(){
Node t = (Node) stack.first();
ISeq nextstack = push(asc ? t.right() : t.left(), stack.rest(), asc);
if(nextstack != null)
diff --git a/src/jvm/clojure/lang/RT.java b/src/jvm/clojure/lang/RT.java
index 50a4baae..3a9b6c3b 100644
--- a/src/jvm/clojure/lang/RT.java
+++ b/src/jvm/clojure/lang/RT.java
@@ -585,7 +585,7 @@ static public Seqable more(Object x){
return ((ISeq) x).more();
ISeq seq = seq(x);
if(seq == null)
- return null;
+ return PersistentList.EMPTY;
return seq.more();
}
diff --git a/src/jvm/clojure/lang/Range.java b/src/jvm/clojure/lang/Range.java
index 59d3dda3..226a77ba 100644
--- a/src/jvm/clojure/lang/Range.java
+++ b/src/jvm/clojure/lang/Range.java
@@ -39,7 +39,7 @@ public Object first(){
return n;
}
-public Seqable more(){
+public ISeq rest(){
if(n < end-1)
return new Range(_meta, n + 1, end);
return null;
diff --git a/src/jvm/clojure/lang/StreamSeq.java b/src/jvm/clojure/lang/StreamSeq.java
index dfc8cf63..44cfe28c 100644
--- a/src/jvm/clojure/lang/StreamSeq.java
+++ b/src/jvm/clojure/lang/StreamSeq.java
@@ -41,7 +41,7 @@ public class StreamSeq extends ASeq {
return _first;
}
- synchronized public Seqable more() {
+ synchronized public ISeq rest() {
if (stream != null) {
try {
_rest = create(stream);
diff --git a/src/jvm/clojure/lang/StringSeq.java b/src/jvm/clojure/lang/StringSeq.java
index f5800f45..cf370224 100644
--- a/src/jvm/clojure/lang/StringSeq.java
+++ b/src/jvm/clojure/lang/StringSeq.java
@@ -38,7 +38,7 @@ public Object first(){
return Character.valueOf(s.charAt(i));
}
-public Seqable more(){
+public ISeq rest(){
if(i + 1 < s.length())
return new StringSeq(_meta, s, i + 1);
return null;