type Predicate = (x: T) => boolean; type TypeGuardPredicate = (x: any) => x is T; interface Type extends Function { (value: T): T; is: TypeGuardPredicate; displayName: string; meta: { kind: string; name: string; identity: boolean; }; t: T; } // // irreducible // interface Irreducible extends Type { meta: { kind: string; name: string; identity: boolean; predicate: TypeGuardPredicate; }; } export function irreducible(name: string, predicate: Predicate): Irreducible; // // basic types // export var Any: Irreducible; export var Nil: Irreducible; export var String: Irreducible; export var Number: Irreducible; export var Integer: Irreducible; export var Boolean: Irreducible; export var Array: Irreducible>; export var Object: Irreducible; // FIXME restrict to POJOs export var Function: Irreducible; export var Error: Irreducible; export var RegExp: Irreducible; export var Date: Irreducible; interface ApplyCommand { $apply: Function; } interface PushCommand { $push: Array; } interface RemoveCommand { $remove: Array; } interface SetCommand { $set: any; } interface SpliceCommand { $splice: Array>; } interface SwapCommand { $swap: { from: number; to: number; }; } interface UnshiftCommand { $unshift: Array; } interface MergeCommand { $merge: Object; } type Command = ApplyCommand | PushCommand | RemoveCommand | SetCommand | SpliceCommand | SwapCommand | UnshiftCommand | MergeCommand; type UpdatePatch = Command | { [key: string]: UpdatePatch }; type Update = (instance: T, spec: UpdatePatch) => T; type Constructor = Type | Function; // // refinement // interface Refinement extends Type { meta: { kind: string; name: string; identity: boolean; type: Constructor; predicate: TypeGuardPredicate; }; update: Update; } export function refinement(type: Constructor, predicate: Predicate, name?: string): Refinement; // // struct // type StructProps = { [key: string]: Constructor }; type StructMixin = StructProps | Struct | Interface; interface Struct extends Type { new(value: T): T; meta: { kind: string; name: string; identity: boolean; props: StructProps; strict: boolean; }; update: Update; extend(mixins: StructMixin | Array, name?: string): Struct; } type StructOptions = { name?: string, strict?: boolean }; export function struct(props: StructProps, name?: string | StructOptions): Struct; // // interface // interface Interface extends Type { meta: { kind: string; name: string; identity: boolean; props: StructProps; strict: boolean; }; update: Update; extend(mixins: StructMixin | Array, name?: string): Struct; } export function interface(props: StructProps, name?: string | StructOptions): Interface; // // list // interface List extends Type> { meta: { kind: string; name: string; identity: boolean; type: Constructor; }; update: Update>; } export function list(type: Constructor, name?: string): List; // // dict combinator // interface Dict extends Type<{ [key: string]: T; }> { meta: { kind: string; name: string; identity: boolean; domain: Constructor; codomain: T; }; update: Update<{ [key: string]: T; }>; } export function dict(domain: Constructor, codomain: Constructor, name?: string): Dict; // // enums combinator // interface Enums extends Type { meta: { kind: string; name: string; identity: boolean; map: Object; }; } interface EnumsFunction extends Function { (map: Object, name?: string): Enums; of(enums: string, name?: string): Enums; of(enums: Array, name?: string): Enums; } export var enums: EnumsFunction; // // maybe combinator // interface Maybe extends Type { meta: { kind: string; name: string; identity: boolean; type: Constructor; }; update: Update; } export function maybe(type: Constructor, name?: string): Maybe; // // tuple combinator // interface Tuple extends Type { meta: { kind: string; name: string; identity: boolean; types: Array>; }; update: Update; } export function tuple(types: Array>, name?: string): Tuple; // // union combinator // interface Union extends Type { meta: { kind: string; name: string; identity: boolean; types: Array>; }; update: Update; dispatch(x: any): Constructor; } export function union(types: Array>, name?: string): Union; // // intersection combinator // interface Intersection extends Type { meta: { kind: string; name: string; identity: boolean; types: Array>; }; update: Update; } export function intersection(types: Array>, name?: string): Intersection; // // declare combinator // interface Declare extends Type { update: Update; define(type: Type): void; } export function declare(name?: string): Declare; // // other exports // export function is(x: any, type: Constructor): boolean; type LazyMessage = () => string; export function assert(guard: boolean, message?: string | LazyMessage): void; export function fail(message: string): void; export function isType(x: Constructor): boolean; export function getTypeName(x: Constructor): string; export function mixin(target: T, source: S, overwrite?: boolean): T & S; type Function1 = (x: any) => any; type Clause = Constructor | Function1; export function match(x: any, ...clauses: Array): any; // FIXME export var update: Update;