73 lines
2.6 KiB
TypeScript
73 lines
2.6 KiB
TypeScript
import { Dictionary, KeyedDictionary, Record, Value, preserves } from '..';
|
|
|
|
export type Input = Value<never>;
|
|
|
|
export const AND = Symbol.for('and');
|
|
export const ANDSYM = Symbol.for('&');
|
|
export const ATOM = Symbol.for('atom');
|
|
export const BOOLEAN = Symbol.for('Boolean');
|
|
export const BYTESTRING = Symbol.for('ByteString');
|
|
export const DICT = Symbol.for('dict');
|
|
export const DICTOF = Symbol.for('dictof');
|
|
export const DOT = Symbol.for('.');
|
|
export const DOTDOTDOT = Symbol.for('...');
|
|
export const DOUBLE = Symbol.for('Double');
|
|
export const EQUALS = Symbol.for('=');
|
|
export const FLOAT = Symbol.for('Float');
|
|
export const LIT = Symbol.for('lit');
|
|
export const NAMED = Symbol.for('named');
|
|
export const OR = Symbol.for('or');
|
|
export const ORSYM = Symbol.for('/');
|
|
export const POINTER = Symbol.for('pointer');
|
|
export const REC = Symbol.for('rec');
|
|
export const REF = Symbol.for('ref');
|
|
export const SCHEMA = Symbol.for('schema');
|
|
export const SETOF = Symbol.for('setof');
|
|
export const SIGNEDINTEGER = Symbol.for('SignedInteger');
|
|
export const STRING = Symbol.for('String');
|
|
export const SYMBOL = Symbol.for('Symbol');
|
|
export const TUPLE = Symbol.for('tuple');
|
|
export const TUPLESTAR = Symbol.for('tuple*');
|
|
export const VERSION = Symbol.for('version');
|
|
|
|
export type Environment = Array<Schema>;
|
|
|
|
export const Schema = Record.makeConstructor<{
|
|
version: number,
|
|
definitions: KeyedDictionary<symbol, Pattern, never>,
|
|
}>()(Symbol.for('schema'), ['version', 'definitions']);
|
|
export type Schema = ReturnType<typeof Schema>;
|
|
|
|
export type AtomKind =
|
|
| typeof BOOLEAN
|
|
| typeof FLOAT
|
|
| typeof DOUBLE
|
|
| typeof SIGNEDINTEGER
|
|
| typeof STRING
|
|
| typeof BYTESTRING
|
|
| typeof SYMBOL;
|
|
|
|
export type Pattern =
|
|
| Record<typeof ATOM, [AtomKind], never>
|
|
| Record<typeof LIT, [Input], never>
|
|
| Record<typeof REF, [symbol], never>
|
|
| Record<typeof OR, [Array<Pattern>], never>
|
|
| Record<typeof AND, [Array<Pattern>], never>
|
|
| Record<typeof POINTER, [], never>
|
|
| Record<typeof REC, [Pattern, Pattern], never>
|
|
| Record<typeof TUPLE, [Array<NamedPattern>], never>
|
|
| Record<typeof TUPLESTAR, [Array<NamedPattern>, NamedPattern], never>
|
|
| Record<typeof SETOF, [Pattern], never>
|
|
| Record<typeof DICTOF, [Pattern, Pattern], never>
|
|
| Record<typeof DICT, [Dictionary<Pattern, never>], never>;
|
|
|
|
export type NamedPattern = Record<typeof NAMED, [symbol, Pattern], never> | Pattern;
|
|
|
|
export function lookup(env: Environment, name: symbol): Pattern {
|
|
for (const s of env) {
|
|
const p = Schema._.definitions(s).get(name);
|
|
if (p !== void 0) return p;
|
|
}
|
|
throw new Error(preserves`Schema: unbound name ${name}`);
|
|
}
|