lib-utils-ts
Version:
<img src="https://img.shields.io/npm/v/lib-utils-ts"/> <img src="https://img.shields.io/snyk/vulnerabilities/npm/lib-utils-ts"/> <img src="https://img.shields.io/npm/l/lib-utils-ts"/> <img src="https://img.shields.io/github/languages/top/devGnode/lib-util
144 lines (111 loc) • 5.48 kB
text/typescript
import {terminalOps, terminalSink} from "./TerminalOps";
import {PipelineHelper} from "./PipelineHelper";
import { predicate, supplier, supplierFn} from "../Interface";
import {StreamShape} from "./StreamShape";
import {Spliterator} from "../utils/Spliterator";
import {Optional} from "../utils/Optional";
import {ofInt} from "./Sink";
import {OptionalInt} from "../utils/OptionalInt";
export class FindOps {
private constructor() {}
private static readonly FindOp = class FindOps<T,O> implements terminalOps<T,O>{
protected readonly shapeOps:StreamShape;
readonly mustFindFirst:boolean; // parallel
readonly emptyValue:O;
readonly sinkSupplier:supplier<terminalSink<T, O>>;
readonly predicate:predicate<O>; // parallel
readonly opFlags;
constructor(mustFindFirst:boolean, shapeOps:StreamShape, emptyValue:O, predicate:predicate<O>, sinkSupplier:supplier<terminalSink<T, O>> ) {
this.mustFindFirst = mustFindFirst; // parallel
this.shapeOps = shapeOps;
this.emptyValue = emptyValue;
this.predicate = predicate; // parallel
this.sinkSupplier = sinkSupplier;
this.opFlags = 0x01; // MOCK
}
/**TerminalOps**/
evaluateSequential<S>(helper: PipelineHelper<T>, spliterator: Spliterator<S>): O {
let tmp:O = helper.wrapAndCopyInto(this.sinkSupplier.get(), spliterator).get();
return Optional.ofNullable(tmp).isPresent() ? tmp : this.emptyValue;
}
getOpFlag(): number {return this.opFlags;}
inputShape(): StreamShape {return this.shapeOps;}
};
private static readonly FindSink = class FindSink<T,O> implements terminalSink<T,O>{
protected hasValue:boolean;
value:T;
constructor() {}
accept(o: T): void {
if(!this.hasValue){
this.hasValue = true;
this.value = o;
}
}
/**TerminalSink**/
get(): O {return null;}
begin(value: number): void {}
/**@override**/
cancellationRequested(): boolean {return this.hasValue;}
end(): void {}
};
private static readonly FindSinkImpl = class FindSinkImpl{
public static readonly OfRef = class OfRef<T> extends FindOps.FindSink<T, Optional<T>>{
/**@override**/
public get():Optional<T> {return this.hasValue ? Optional.of(this.value) : null;}
public static readonly OP_FIND_FIRST = class OF_FIND_ANY<T> implements supplier<terminalOps<T, Optional<T>>>{
get = ()=> new FindOps.FindOp<T,Optional<T>>(
true,
StreamShape.REFERENCE,
<Optional<T>>Optional.empty(),
null,
new class implements supplier<terminalSink<T, Optional<T>>>{
get : supplierFn<terminalSink<T, Optional<T>>> = () => new FindOps.FindSinkImpl.OfRef();
})
};
public static readonly OP_FIND_ANY = class OF_FIND_FIRST<T> implements supplier<terminalOps<T, Optional<T>>>{
get = ()=> new FindOps.FindOp<T,Optional<T>>(
false,
StreamShape.REFERENCE,
<Optional<T>>Optional.empty(),
null,
new class implements supplier<terminalSink<T, Optional<T>>>{
get : supplierFn<terminalSink<T, Optional<T>>> = () => new FindOps.FindSinkImpl.OfRef();
})
}
};
public static readonly OfInt = class OfInt extends FindOps.FindSink<number, OptionalInt> implements ofInt{
/**@override**/
accept(o: number) {super.accept(o);}
/**@override**/
public get():OptionalInt {return this.hasValue ? OptionalInt.of(this.value) : null;}
public static readonly OP_FIND_FIRST: terminalOps<number, OptionalInt> = new FindOps.FindOp(
true,
StreamShape.INT_VALUE,
OptionalInt.empty(),
null,
new class implements supplier<terminalSink<number, OptionalInt>>{
get = ()=> new FindOps.FindSinkImpl.OfInt();
}
);
public static readonly OP_FIND_ANY: terminalOps<number, OptionalInt> = new FindOps.FindOp(
false,
StreamShape.INT_VALUE,
OptionalInt.empty(),
null,
new class implements supplier<terminalSink<number, OptionalInt>>{
get = ()=> new FindOps.FindSinkImpl.OfInt();
}
);
}
};
public static makeInt( findFirst:boolean ):terminalOps<number, OptionalInt>{
return findFirst ? FindOps.FindSinkImpl.OfInt.OP_FIND_FIRST : FindOps.FindSinkImpl.OfInt.OP_FIND_ANY;
}
public static makeRef<T>( findFirst:boolean ):terminalOps<T, Optional<T>>{
return (
findFirst ?
new FindOps.FindSinkImpl.OfRef.OP_FIND_FIRST<T>() :
new FindOps.FindSinkImpl.OfRef.OP_FIND_ANY<T>() ).get();
}
}
Object.package(this);