|
@@ -7,6 +7,7 @@ namespace Invercargill {
|
|
public abstract class Enumerable<T> : Object {
|
|
public abstract class Enumerable<T> : Object {
|
|
|
|
|
|
public abstract Tracker<T> get_tracker();
|
|
public abstract Tracker<T> get_tracker();
|
|
|
|
+ public abstract int? peek_count();
|
|
|
|
|
|
// Returns false if iteration was interrupted
|
|
// Returns false if iteration was interrupted
|
|
// Returns true if iteration reached natural end
|
|
// Returns true if iteration reached natural end
|
|
@@ -20,11 +21,16 @@ namespace Invercargill {
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|
|
- public virtual void iterate(ItemDelegate<T> handler) {
|
|
|
|
- iterate_if(i => {
|
|
|
|
- handler(i);
|
|
|
|
- return true;
|
|
|
|
- });
|
|
|
|
|
|
+ public virtual void iterate(ItemDelegate<T>? handler = null) {
|
|
|
|
+ if(handler != null) {
|
|
|
|
+ iterate_if(i => {
|
|
|
|
+ handler(i);
|
|
|
|
+ return true;
|
|
|
|
+ });
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ iterate_if(i => true);
|
|
}
|
|
}
|
|
|
|
|
|
public virtual Series<T> to_series() {
|
|
public virtual Series<T> to_series() {
|
|
@@ -57,9 +63,22 @@ namespace Invercargill {
|
|
return array;
|
|
return array;
|
|
}
|
|
}
|
|
|
|
|
|
- public virtual int count() {
|
|
|
|
|
|
+ public virtual int count(PredicateDelegate<T>? predicate = null) {
|
|
|
|
+ var enumerable = this;
|
|
|
|
+ // When no predicate is passed, see if we can peek at the count of
|
|
|
|
+ // the enumerable before iterating.
|
|
|
|
+ if(predicate == null) {
|
|
|
|
+ var peek = peek_count();
|
|
|
|
+ if(peek != null) {
|
|
|
|
+ return peek;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ enumerable = this.where(predicate);
|
|
|
|
+ }
|
|
|
|
+
|
|
var count = 0;
|
|
var count = 0;
|
|
- iterate(i => count++);
|
|
|
|
|
|
+ enumerable.iterate(i => count++);
|
|
return count;
|
|
return count;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -145,14 +164,6 @@ namespace Invercargill {
|
|
return select<Tout>(i => (Tout)i);
|
|
return select<Tout>(i => (Tout)i);
|
|
}
|
|
}
|
|
|
|
|
|
- // public virtual Enumerable<Tout> convert<Tout>() throws ConverterError {
|
|
|
|
- // var converter = get_converter<T, Tout>();
|
|
|
|
- // if(converter == null) {
|
|
|
|
- // throw new ConverterError.CONVERTER_NOT_FOUND(@"No converter registered that can convert from $(typeof(T).name()) to $(typeof(Tout).name())");
|
|
|
|
- // }
|
|
|
|
- // return select(((Converter<T, Tout>)converter).convert);
|
|
|
|
- // }
|
|
|
|
-
|
|
|
|
public virtual Enumerable<Tout> parallel_select<Tout>(owned TransformDelegate<T, Tout> transform, uint workers = 0) {
|
|
public virtual Enumerable<Tout> parallel_select<Tout>(owned TransformDelegate<T, Tout> transform, uint workers = 0) {
|
|
var actual_workers = workers;
|
|
var actual_workers = workers;
|
|
if(actual_workers < 1) {
|
|
if(actual_workers < 1) {
|
|
@@ -161,12 +172,12 @@ namespace Invercargill {
|
|
return new Parallel<T, Tout>(this, (owned)transform, (int)actual_workers);
|
|
return new Parallel<T, Tout>(this, (owned)transform, (int)actual_workers);
|
|
}
|
|
}
|
|
|
|
|
|
- public virtual int parallel_iterate(ItemDelegate<T> handler, uint workers = 0) {
|
|
|
|
- return parallel_select<T>(i => {
|
|
|
|
|
|
+ public virtual void parallel_iterate(ItemDelegate<T> handler, uint workers = 0) {
|
|
|
|
+ parallel_select<T>(i => {
|
|
handler(i);
|
|
handler(i);
|
|
return i;
|
|
return i;
|
|
}, workers)
|
|
}, workers)
|
|
- .count();
|
|
|
|
|
|
+ .iterate();
|
|
}
|
|
}
|
|
|
|
|
|
public virtual Enumerable<SelectionContext<T, Tout>> contextualised_select<Tout>(owned TransformDelegate<T, Tout> transform) {
|
|
public virtual Enumerable<SelectionContext<T, Tout>> contextualised_select<Tout>(owned TransformDelegate<T, Tout> transform) {
|