preserves/implementations/javascript/src/schema/meta.ts

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}`);
}