inquiry-monad
Version:
Inquiry is an expressive API that allows one ask multiple questions about a subject value, and observe all results. This process returns a collection of all passes, fails, and the original subject value.
114 lines (113 loc) • 3 kB
TypeScript
import { $$inquirySymbol, $$questionsetSymbol, $$questionSymbol, $$passSymbol, $$failSymbol, $$iouSymbol, $$receiptSymbol } from './symbols';
export interface Monad {
map: Function;
chain: Function;
join: Function;
emit: Function;
inspect(): string;
ap: Function;
}
export interface PassFailMonad extends Monad {
fold: Function;
fork: Function;
concat: Function;
answer: Function;
head: Function;
tail: Function;
isEmpty: Function;
[$$passSymbol]: boolean;
[$$failSymbol]: boolean;
[$$iouSymbol]: false;
[$$inquirySymbol]: false;
}
export interface IOUMonad extends Monad {
concat: Function;
head: Function;
tail: Function;
isEmpty: Function;
[$$iouSymbol]: true;
[$$failSymbol]: false;
[$$inquirySymbol]: false;
[$$passSymbol]: false;
}
export interface PassMonad extends PassFailMonad {
[$$failSymbol]: false;
[$$passSymbol]: true;
}
export interface FailMonad extends PassFailMonad {
[$$passSymbol]: false;
[$$failSymbol]: true;
}
export interface QuestionsetMonad extends Monad {
find: Function;
concat: Function;
[$$questionsetSymbol]: true;
}
export interface QuestionMonad extends Monad {
call: (i: InquiryMonad) => PassFailMonad;
extract: () => QuestionValue[1];
name: () => QuestionValue[0];
[$$questionSymbol]: true;
}
export interface ReceiptValue extends Array<string | RegExp | PassFailMonad> {
0: string | RegExp;
1: PassFailMonad;
}
export interface ReceiptMonad extends Monad {
[$$receiptSymbol]: true;
[$$inquirySymbol]: false;
concat: Function;
head: Function;
tail: Function;
isEmpty: Function;
fold: Function;
fork: Function;
}
export interface InquiryValue {
subject: any;
fail: FailMonad;
pass: PassMonad;
informant: Function;
iou: IOUMonad;
questionset: QuestionsetMonad | void;
receipt: ReceiptMonad;
}
export interface InquiryMonad extends Monad {
inquire: Function;
inquireMap: Function;
inquireAll: Function;
zip: Function;
swap: Function;
fork: Function;
fold: Function;
faulted: Function;
cleared: Function;
suffice: Function;
scratch: Function;
informant: Function;
unison: Function;
breakpoint: Function;
milestone: Function;
answer: Function;
conclude: Function;
using: Function;
await?: Function;
[$$inquirySymbol]: true;
}
export interface QuestionValue extends Array<string | RegExp | Function> {
0: string | RegExp;
1: Function;
}
export interface MonadConstructor {
of: Function;
}
export interface QuestionsetMonadConstructor extends MonadConstructor {
of: (x: any) => QuestionsetMonad | void;
}
export interface QuestionMonadConstructor extends MonadConstructor {
of: (x: any) => QuestionMonad | void;
}
export interface InquiryConstructor extends MonadConstructor {
subject: (x: any) => InquiryMonad;
of: (a: InquiryValue) => InquiryMonad;
}