@mojir/lits
Version:
Lits is a pure functional programming language implemented in TypeScript
28 lines (27 loc) • 1.77 kB
TypeScript
import type { SourceCodeInfo } from '../../../../tokenizer/token';
import type { MaybePromise } from '../../../../utils/maybePromise';
import type { BuiltinNormalExpression, BuiltinNormalExpressions } from '../../../../builtin/interface';
type SeqKey<T extends string> = `${T}-seq`;
type TakeWhileKey<T extends string> = `${T}-take-while`;
type NthKey<T extends string> = `${T}-nth`;
type PredKey<T extends string> = `${T}?`;
type SeqFunction<Type extends number | string> = (length: number, sourceCodeInfo: SourceCodeInfo | undefined) => Type[];
type TakeWhileFunction<Type extends number | string> = (pred: (value: Type, index: number) => MaybePromise<boolean>, sourceCodeInfo: SourceCodeInfo | undefined) => MaybePromise<Type[]>;
type PredFunction<Type extends number | string> = (n: Type, sourceCodeInfo: SourceCodeInfo | undefined) => boolean;
export type SequenceKeys<T extends string> = SeqKey<T> | TakeWhileKey<T> | NthKey<T> | PredKey<T>;
export type SequenceDefinition<T extends string, Type extends number | string = number> = {
[key in Exclude<SequenceKeys<T>, NthKey<T>>]: key extends SeqKey<T> ? SeqFunction<Type> : key extends TakeWhileKey<T> ? TakeWhileFunction<Type> : PredFunction<Type>;
} & {
maxLength?: number;
} & (Type extends string ? {
string: true;
} : {
string?: never;
}) & {
noNth?: true;
};
export type SequenceNormalExpressions<T extends string, Type extends string | number = number> = {
[key in SequenceKeys<T>]: key extends SeqKey<T> ? BuiltinNormalExpression<Type[]> : key extends TakeWhileKey<T> ? BuiltinNormalExpression<Type[]> : key extends NthKey<T> ? BuiltinNormalExpression<Type> : BuiltinNormalExpression<boolean>;
};
export declare const sequenceNormalExpressions: BuiltinNormalExpressions;
export {};