/** * Written by Nicolas Zozol */ export interface Unit {} // Not needed export interface Option { isPresent(): boolean; map(bindCall: () => any): any; flatMap (bindCall: () => any): Type; filter (f: (value: Type) => boolean): Type | Option get(): Type orElse(v: X): Type | X; orLazyElse(v: X): Type | X; } export interface Try { isSuccess(): boolean; isFailure(): boolean; onSuccess(f: () => any): Try; onFailure(f: () => any): Try; map(bindCall: () => any): Try; flatMap (bindCall: () => any): Try; success(): V; failure(): E; recoverWith(X): V | X; lazyRecoverWith(X): V | X; filter(f: (value: V) => boolean): Try } // Not needed export interface List { size: number; isEmpty: boolean; array(): Array join(string:string): string; } export interface Stream { location(index: number): number; get(index: number): Try; subStreamAt(index: number, stream: Stream) } interface IStreams { ofString(string: string): Stream; ofArray(): Stream>; } export interface ArrayResponse extends Response { value: Array } export interface ListResponse extends Response { value: List } export interface OptionResponse extends Response { value: Option } export interface SingleResponse extends Response { value: T } export interface VoidResponseextends Response { value: void } export interface Response { isAccepted(): boolean isConsumed(): boolean fold(accept, reject?): Response; map(f): Response; flatMap(f): Response; filter(f: (value) => boolean): Response; //value:T offset: number; } /* Array with different values*/ export interface ArrayParser extends IParser { parse(stream: Stream, index?: number): ArrayResponse; then(p: SingleParser): ArrayParser; then(p: VoidParser): ArrayParser; map (f: (T) => Y): ArrayParser; filter(f: (T) => boolean): ArrayParser opt():ArrayParser>; or>(p: P): ArrayParser|P; } /* List with same values ; need bo call array() */ export interface ListParser extends IParser{ parse(stream: Stream, index?: number): ListResponse; then(p: SingleParser): ArrayParser; then(p: VoidParser): ListParser; map (f: (T) => Y): ListParser; opt():ListParser>; // or>(p: P): ListParser|P; } export interface SingleParser extends IParser { parse(stream: Stream, index?: number): SingleResponse; then(p: SingleParser): ArrayParser; then(p: ListParser): ListParser; then(p: VoidParser): SingleParser; map (f: (T) => Y): SingleParser; opt():SingleParser>; //filter(f: () => boolean): SingleParser or>(p: P): SingleParser|P; } interface VoidParser extends IParser { then(p: SingleParser): SingleParser< Y>; then(p: ListParser): ListParser; opt():VoidParser; or>(p: P): VoidParser|P; } /** * T is the type of the Response */ export interface IParser { // Needed because opt() won(t know if we have void, array or single //then(p: IParser): IParser; map (f: (T) => Y): IParser; flatMap>( builder:parserBuilder ):P; drop(): VoidParser; rep(): ListParser; thenReturns(obj:Y):SingleParser; debug(s:string, b?:boolean); //then(p: IParser): IParser; /*flatMap (f: () => Y): IParser; filter(f: (T) => boolean): IParser match(value: T): IParser; thenReturns(value: Y): SingleParser; opt(): IParser; occurrence(n: number): ListParser; optrep(): IParser>; chain(): IParser; debug(hint?: string, details?: boolean): IParser; */ // parse(stream: Stream, index?: number): Response; } /* export declare class Parser implements IParser { then(p: IParser): IParser; flatMap(f: () => Y): IParser ; map(f: (T: any) => Y): IParser; filter(f: (T: any) => boolean): IParser ; match(value: T): IParser ; drop(): VoidParser ; thenReturns(value: Y): SingleParser ; or(p: IParser): IParser ; opt(): IParser ; rep(): ListParser> ; occurrence(n: number): ListParser ; optrep(): IParser> ; chain(): IParser ; debug(hint?: string, details?: boolean): IParser; parse(stream: Stream, index?: number): Response ; }*/ interface CharBundle { UTF8_LETTER:symbol, OCCIDENTAL_LETTER:symbol, ASCII_LETTER:symbol, utf8Letter():SingleParser; letter(): SingleParser; letterAs(s:symbol): SingleParser; letters(): SingleParser; lettersAs(s:symbol): SingleParser; emoji(): SingleParser; notChar(c:string): SingleParser; char(string:string): SingleParser; charIn(strings:string[]): SingleParser; string(string:string): SingleParser; stringIn(strings:string[]): SingleParser; notString(string:string): SingleParser; charLiteral(): SingleParser; stringLiteral(): SingleParser; lowerCase(): SingleParser; upperCase(): SingleParser; } export type parserBuilder> = (...rest:any[])=>P; type extension> = T; type predicate = (value: V)=>boolean; interface FlowBundle { parse>(P):P; nop(): VoidParser; try>(parser:P):P; any():SingleParser; subStream(length:number):ListParser not>(P):SingleParser; lazy> (builder: parserBuilder, args:any[]): P; returns(value:T):SingleParser; error():VoidParser; eos(): SingleParser; satisfy(predicate:predicate):SingleParser startWith(value:V):SingleParser; moveUntil(s:string):SingleParser; moveUntil(p:IParser):SingleParser; dropTo(s:string):VoidParser; dropTo(p:IParser):VoidParser; } interface NumberBundle { number: SingleParser; numberLiteral: SingleParser; } export declare const F: FlowBundle; export declare const C: CharBundle; export declare const N: NumberBundle; export declare const Streams: IStreams; // TODO: Check if this is needed interface MasalaBundlesStatic { Streams: IStreams, C: CharBundle, F: FlowBundle, N: NumberBundle } declare const MasalaBundles: MasalaBundlesStatic; export default MasalaBundles;