UNPKG

@mojir/lits

Version:

Lits is a pure functional programming language implemented in TypeScript

28 lines (27 loc) 1.77 kB
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 {};