import { Voidable } from "../maybe" import * as seq from './ops' export { collect, count, isEmpty, first, last } from './ops' export function join(separator?: string): (iter: Iterable) => string { return iter => seq.join(iter, separator) } export function nth(n: number): (iter: Iterable) => Voidable { return iter => seq.nth(iter, n) } export function stepBy(step: number): (iter: Iterable) => Iterable { return iter => seq.stepBy(iter, step) } export function chain(b: Iterable, ...more: Iterable[]): (a: Iterable) => Iterable { return a => seq.chain(a, b, ...more) } export function zip(b: Iterable): (a: Iterable) => Iterable<[A, B]> { return a => seq.zip(a, b) } export { unzip } from './ops' export function map(f: (v: T) => R): (iter: Iterable) => Iterable { return iter => seq.map(iter, f) } export function fill(v: R): (iter: Iterable) => Iterable { return iter => seq.fill(iter, v) } export function forEach(f: (v: T) => unknown): (iter: Iterable) => void { return iter => seq.forEach(iter, f) } export { run } from './ops' export function filter(f: (v: T) => v is S): (iter: Iterable) => Iterable export function filter(f: (v: T) => unknown): (iter: Iterable) => Iterable export function filter(f: (v: T) => unknown): (iter: Iterable) => Iterable { return iter => seq.filter(iter, f) } export { enumerate, indexed } from './ops' export function skip(n: number): (iter: Iterable) => Iterable { return iter => seq.skip(iter, n) } export function take(n: number): (iter: Iterable) => Iterable { return iter => seq.take(iter, n) } export function slice(from: number, to: number): (iter: Iterable) => Iterable { return iter => seq.slice(iter, from, to) } export function sub(from: number, count: number): (iter: Iterable) => Iterable { return iter => seq.sub(iter, from, count) } export function scan(f: (acc: R, val: T) => R, init: R): (iter: Iterable) => Iterable { return iter => seq.scan(iter, init, f) } export function flatMap(f: (v: T) => Iterable): (iter: Iterable) => Iterable { return iter => seq.flatMap(iter, f) } export { flatten } from './ops' export function also(f: (v: T) => void): (iter: Iterable) => Iterable { return iter => seq.also(iter, f) } export function fold(f: (acc: R, val: T) => R, init: R): (a: Iterable) => R { return a => seq.fold(a, init, f) } export function reduce(f: (acc: T, val: T) => T): (a: Iterable) => T { return a => seq.reduce(a, f) } export function all(f: (v: T) => v is S): (a: Iterable) => a is Iterable export function all(f: (v: T) => unknown): (a: Iterable) => boolean export function all(f: (v: T) => unknown): (a: Iterable) => boolean { return a => seq.all(a, f) } export function any(f: (v: T) => unknown): (a: Iterable) => boolean { return a => seq.any(a, f) } export function find(f: (v: T) => unknown): (a: Iterable) => Voidable { return a => seq.find(a, f) } export function position(f: (v: T) => unknown): (a: Iterable) => number { return a => seq.position(a, f) } export function indexOf(v: T): (a: Iterable) => number { return a => seq.indexOf(a, v) } export { max, min } from './ops' export function push(...items: T[]): (a: Iterable) => Iterable { return a => seq.push(a, ...items) } export function unshift(...items: T[]): (a: Iterable) => Iterable { return a => seq.unshift(a, ...items) } export function as(): (a: Iterable) => Iterable { return a => seq.as(a) } export { toArray, toSet, toMap } from './ops' export function groupBy(keyf: (v: T) => K): (a: Iterable) => Iterable<[K, T[]]> export function groupBy(keyf: (v: T) => K, valf: (v: T) => V): (a: Iterable) => Iterable<[K, V[]]> export function groupBy(keyf: (v: T) => K, valf?: (v: T) => V): (a: Iterable) => Iterable<[K, (V | T)[]]> { return a => seq.groupBy(a, keyf, valf!) } export function relate(outerKey: (a: O) => K, innerKey: (b: I) => K): (inner: Iterable) => (outer: Iterable) => Iterable<[O, I]> { return inner => outer => seq.relate(outer, inner, outerKey, innerKey) } export function relateMap(outerKey: (a: O) => K, innerKey: (b: I) => K, selector: (a: O, b: I) => R): (inner: Iterable) => (outer: Iterable) => Iterable { return inner => outer => seq.relateMap(outer, inner, outerKey, innerKey, selector) } export function mapKey(f: (key: K) => R): (iter: Iterable<[K, V]>) => Iterable<[R, V]> { return iter => seq.mapKey(iter, f) } export function mapValue(f: (val: V) => R): (iter: Iterable<[K, V]>) => Iterable<[K, R]> { return iter => seq.mapValue(iter, f) }