//================================================================ /** * @packageDocumentation * @module std.ranges */ //================================================================ import * as base from "../../numeric/operations"; import { IForwardContainer } from "../container/IForwardContainer"; import { IForwardIterator } from "../../iterator/IForwardIterator"; import { IPointer } from "../../functional/IPointer"; import { Writeonly } from "../../internal/functional/Writeonly"; import { begin, end } from "../../iterator/factory"; import { plus, multiplies, minus } from "../../numeric/operators"; type UnaryTransformer< Range extends Array | IForwardContainer, OutputIterator extends IForwardIterator< IPointer.ValueType, OutputIterator >, > = ( val: IForwardContainer.ValueType, ) => IPointer.ValueType; type BinaryTransformer< OutputIterator extends IForwardIterator< IPointer.ValueType, OutputIterator >, > = ( x: IPointer.ValueType, y: IPointer.ValueType, ) => IPointer.ValueType; type Operator< Range1 extends Array | IForwardContainer, Range2 extends Array | IForwardContainer = Range1, > = ( x: IForwardContainer.ValueType, y: IForwardContainer.ValueType, ) => IForwardContainer.ValueType; /* --------------------------------------------------------- COMMON ALGORITHMS --------------------------------------------------------- */ export function iota< Range extends Array | IForwardContainer>, >(range: Range, value: number): void { return base.iota(begin(range), end(range), value); } export function accumulate | IForwardContainer>( range: Range, init: IForwardContainer.ValueType, op: Operator = plus, ): IForwardContainer.ValueType { return base.accumulate(begin(range), end(range), init, op); } export function inner_product< Range1 extends Array | IForwardContainer, Range2 extends Array | IForwardContainer, >( range1: Range1, range2: Range2, value: IForwardContainer.ValueType, adder: Operator = plus, multiplier: Operator = multiplies, ): IForwardContainer.ValueType { return base.inner_product( begin(range1), end(range1), begin(range2), value, adder, multiplier, ); } export function adjacent_difference< Range extends Array | IForwardContainer, OutputIterator extends Writeonly< IForwardIterator, OutputIterator> >, >( range: Range, output: OutputIterator, subtracter: Operator = minus, ): OutputIterator { return base.adjacent_difference( begin(range), end(range), output, subtracter, ); } export function partial_sum< Range extends Array | IForwardContainer, OutputIterator extends Writeonly< IForwardIterator, OutputIterator> >, >( range: Range, output: OutputIterator, adder: Operator = plus, ): OutputIterator { return base.partial_sum(begin(range), end(range), output, adder); } /* --------------------------------------------------------- PREFIX SUMS --------------------------------------------------------- */ export function inclusive_scan< Range extends Array | IForwardContainer, OutputIterator extends Writeonly< IForwardIterator, OutputIterator> >, >( range: Range, output: OutputIterator, adder: Operator = plus, init?: IForwardContainer.ValueType, ): OutputIterator { return base.inclusive_scan(begin(range), end(range), output, adder, init); } export function exclusive_scan< Range extends Array | IForwardContainer, OutputIterator extends Writeonly< IForwardIterator, OutputIterator> >, >( range: Range, output: OutputIterator, init: IForwardContainer.ValueType, adder: Operator = plus, ): OutputIterator { return base.exclusive_scan(begin(range), end(range), output, init, adder); } export function transform_inclusive_scan< Range extends Array | IForwardContainer, OutputIterator extends IForwardIterator< IPointer.ValueType, OutputIterator >, >( range: Range, output: OutputIterator, binary: BinaryTransformer, unary: UnaryTransformer, init?: IForwardContainer.ValueType, ): OutputIterator { return base.transform_inclusive_scan( begin(range), end(range), output, binary, unary, init, ); } export function transform_exclusive_scan< Range extends Array | IForwardContainer, OutputIterator extends IForwardIterator< IPointer.ValueType, OutputIterator >, >( range: Range, output: OutputIterator, init: IForwardContainer.ValueType, binary: BinaryTransformer, unary: UnaryTransformer, ): OutputIterator { return base.transform_exclusive_scan( begin(range), end(range), output, init, binary, unary, ); }