|
@@ -1,11 +1,25 @@
|
|
|
|
|
|
namespace Invercargill {
|
|
|
|
|
|
+ // public interface Enumerable<T> {
|
|
|
+
|
|
|
+ // }
|
|
|
+
|
|
|
public abstract class Enumerable<T> {
|
|
|
|
|
|
+ public abstract Tracker<T> to_tracker();
|
|
|
+
|
|
|
// Returns false if iteration was interrupted
|
|
|
// Returns true if iteration reached natural end
|
|
|
- public abstract bool iterate_if(PredicateDelegate<T> handler);
|
|
|
+ public virtual bool iterate_if(PredicateDelegate<T> handler) {
|
|
|
+ var tracker = to_tracker();
|
|
|
+ while(tracker.has_next()) {
|
|
|
+ if(!handler(tracker.get_next())) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
|
|
|
public virtual void iterate(ItemDelegate<T> handler) {
|
|
|
iterate_if(i => {
|
|
@@ -57,20 +71,20 @@ namespace Invercargill {
|
|
|
return all(i => !predicate(i));
|
|
|
}
|
|
|
|
|
|
- public virtual Enumerable<T> where(PredicateDelegate<T> predicate) {
|
|
|
- return new FilterQuery<T>(this, predicate);
|
|
|
+ public virtual Enumerable<T> where(owned PredicateDelegate<T> predicate) {
|
|
|
+ return new FilterQuery<T>(this, (owned)predicate);
|
|
|
}
|
|
|
|
|
|
- public virtual Enumerable<Tout> select<Tout>(TransformDelegate<T, Tout> transform) {
|
|
|
- return new TransformQuery<T, Tout>(this, transform);
|
|
|
+ public virtual Enumerable<Tout> select<Tout>(owned TransformDelegate<T, Tout> transform) {
|
|
|
+ return new TransformQuery<T, Tout>(this, (owned)transform);
|
|
|
}
|
|
|
|
|
|
- public virtual Enumerable<Tout> select_many<Tout>(TransformDelegate<T, Enumerable<Tout>> transform) {
|
|
|
- return new MergeQuery<Tout>(select(transform));
|
|
|
+ public virtual Enumerable<Tout> select_many<Tout>(owned TransformDelegate<T, Enumerable<Tout>> transform) {
|
|
|
+ return new MergeQuery<Tout>(select((owned)transform));
|
|
|
}
|
|
|
|
|
|
- public virtual Enumerable<T> sort(CompareDelegate<T> compare) {
|
|
|
- return new SortQuery<T>(this, compare);
|
|
|
+ public virtual Enumerable<T> sort(owned CompareDelegate<T> compare) {
|
|
|
+ return new SortQuery<T>(this, (owned)compare);
|
|
|
}
|
|
|
|
|
|
public virtual Enumerable<T> concat(Enumerable<T> other) {
|
|
@@ -105,13 +119,13 @@ namespace Invercargill {
|
|
|
return new ZipperEnumerable<T>(this, other);
|
|
|
}
|
|
|
|
|
|
- public virtual Enumerable<Tout> fork<Tout>(TransformDelegate<T, Tout> fork1, TransformDelegate<T, Tout> fork2) {
|
|
|
+ public virtual Enumerable<Tout> fork<Tout>(owned TransformDelegate<T, Tout> fork1, owned TransformDelegate<T, Tout> fork2) {
|
|
|
var seq = to_sequence();
|
|
|
- return seq.select<Tout>(fork1).zip(seq.select<Tout>(fork2));
|
|
|
+ return seq.select<Tout>((owned)fork1).zip(seq.select<Tout>((owned)fork2));
|
|
|
}
|
|
|
|
|
|
- public virtual Enumerable<Tout> fork_many<Tout>(TransformDelegate<T, Enumerable<Tout>> fork1, TransformDelegate<T, Enumerable<Tout>> fork2) {
|
|
|
- return new MergeQuery<Tout>(fork(fork1, fork2));
|
|
|
+ public virtual Enumerable<Tout> fork_many<Tout>(owned TransformDelegate<T, Enumerable<Tout>> fork1, owned TransformDelegate<T, Enumerable<Tout>> fork2) {
|
|
|
+ return new MergeQuery<Tout>(fork((owned)fork1, (owned)fork2));
|
|
|
}
|
|
|
|
|
|
public virtual bool matches(Enumerable<T> other, EqualityDelegate<T> equals) {
|