functionalscript
Version:
FunctionalScript is a purely functional subset of JavaScript
51 lines (50 loc) • 3.16 kB
TypeScript
import { type Scan, type StateScan, type Fold, type Reduce, type Equal } from '../function/operator/module.f.ts';
export type List<T> = NotLazy<T> | Thunk<T>;
type NotLazy<T> = Result<T> | Concat<T> | readonly T[];
type Empty = null;
export type Result<T> = Empty | NonEmpty<T>;
export type Thunk<T> = () => List<T>;
type NonEmpty<T> = {
readonly first: T;
readonly tail: List<T>;
};
type Concat<T> = {
readonly head: List<T>;
readonly tail: List<T>;
};
export declare const concat: <T>(head: List<T>) => (tail: List<T>) => List<T>;
export declare const next: <T>(head: List<T>) => Result<T>;
export declare const iterable: <T>(list: List<T>) => Iterable<T>;
export declare const toArray: <T>(list: List<T>) => readonly T[];
export declare const flat: <T>(list: List<List<T>>) => Thunk<T>;
export declare const map: <I, O>(f: (value: I) => O) => (input: List<I>) => Thunk<O>;
export declare const flatMap: <I, O>(f: (value: I) => List<O>) => (input: List<I>) => Thunk<O>;
export declare const filter: <T>(f: (value: T) => boolean) => (input: List<T>) => Thunk<T>;
export declare const filterMap: <I, O>(f: (value: I) => O | null) => (input: List<I>) => Thunk<O>;
export declare const takeWhile: <T>(f: (value: T) => boolean) => (input: List<T>) => Thunk<T>;
export declare const take: (n: number) => <T>(input: List<T>) => Thunk<T>;
export declare const dropWhile: <T>(f: (value: T) => boolean) => (input: List<T>) => Thunk<T>;
export declare const drop: (n: number) => <T>(input: List<T>) => Thunk<T>;
export declare const first: <D>(def: D) => <T>(input: List<T>) => D | T;
export declare const last: <D>(first: D) => <T>(tail: List<T>) => D | T;
export declare const find: <D>(def: D) => <T>(f: (value: T) => boolean) => (input: List<T>) => D | T;
export declare const some: (input: List<boolean>) => boolean;
export declare const isEmpty: <T>(input: List<T>) => boolean;
export declare const every: (_: List<boolean>) => boolean;
export declare const includes: <T>(value: T) => (sequence: List<T>) => boolean;
export declare const countdown: (count: number) => Thunk<number>;
export declare const repeat: <T>(v: T) => (c: number) => Thunk<T>;
export declare const cycle: <T>(list: List<T>) => List<T>;
export declare const scan: <I, O>(op: Scan<I, O>) => (input: List<I>) => Thunk<O>;
export declare const stateScan: <I, S, O>(op: StateScan<I, S, O>) => (init: S) => (input: List<I>) => Thunk<O>;
export declare const foldScan: <I, O>(op: Fold<I, O>) => (init: O) => (input: List<I>) => Thunk<O>;
export declare const fold: <I, O>(op: Fold<I, O>) => (init: O) => (input: List<I>) => O;
export declare const reduce: <T>(op: Reduce<T>) => <D>(def: D) => (input: List<T>) => D | T;
export declare const length: <T>(input: List<T>) => number;
export type Entry<T> = readonly [number, T];
export declare const entries: <T>(input: List<T>) => Thunk<Entry<T>>;
export declare const reverse: <T>(input: List<T>) => List<T>;
export declare const zip: <A>(a: List<A>) => <B>(b: List<B>) => Thunk<readonly [A, B]>;
export declare const equal: <T>(e: Equal<T>) => (a: List<T>) => (b: List<T>) => boolean;
export declare const empty: null;
export {};