From c7f5f487e7e814c3ca23c4c017e0bb4fe40114b5 Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Thu, 25 Feb 2021 23:23:51 +0100 Subject: [PATCH] Better record typing --- actor.ts | 53 ++++++++++++++++++++++++++-------------------------- dataspace.ts | 8 ++++---- 2 files changed, 31 insertions(+), 30 deletions(-) diff --git a/actor.ts b/actor.ts index 4fb69c8..ea88300 100644 --- a/actor.ts +++ b/actor.ts @@ -33,65 +33,66 @@ export type Rewrite = { pattern: Pattern, template: Template }; export const _CRec = Symbol.for('rec'); export const CRec = Record.makeConstructor<{label: Assertion, arity: number}, Ref>()( _CRec, ['label', 'arity']); -export type CRec = ReturnType; export const _CArr = Symbol.for('arr'); export const CArr = Record.makeConstructor<{arity: number}, Ref>()( _CArr, ['arity']); -export type CArr = ReturnType; export const _CDict = Symbol.for('dict'); export const CDict = Record.makeConstructor<{}, Ref>()( _CDict, []); -export type CDict = ReturnType; -export type ConstructorSpec = CRec | CArr | CDict; +export type ConstructorSpec = + | Record + | Record + | Record; export const _PDiscard = Symbol.for('_'); export const PDiscard = Record.makeConstructor<{}, Ref>()( _PDiscard, []); -export type PDiscard = ReturnType; export const _PBind = Symbol.for('bind'); -export const PBind = Record.makeConstructor<{name: string, pattern: Assertion}, Ref>()( +export const PBind = Record.makeConstructor<{name: string, pattern: Pattern}, Ref>()( _PBind, ['name', 'pattern']); -export type PBind = ReturnType; export const _PAnd = Symbol.for('and'); -export const PAnd = Record.makeConstructor<{patterns: Array}, Ref>()( +export const PAnd = Record.makeConstructor<{patterns: Array}, Ref>()( _PAnd, ['patterns']); -export type PAnd = ReturnType; export const _PNot = Symbol.for('not'); -export const PNot = Record.makeConstructor<{pattern: Assertion}, Ref>()( +export const PNot = Record.makeConstructor<{pattern: Pattern}, Ref>()( _PNot, ['pattern']); -export type PNot = ReturnType; export const _Lit = Symbol.for('lit'); export const Lit = Record.makeConstructor<{value: Assertion}, Ref>()( _Lit, ['value']); -export type Lit = ReturnType; export const _PCompound = Symbol.for('compound'); export const PCompound = - Record.makeConstructor<{ctor: ConstructorSpec, members: Dictionary}, Ref>()( + Record.makeConstructor<{ctor: ConstructorSpec, members: Dictionary}, Ref>()( _PCompound, ['ctor', 'members']); -export type PCompound = ReturnType; -export type Pattern = PDiscard | PBind | PAnd | PNot | Lit | PCompound; +export type Pattern = + | Record + | Record + | Record + | Record + | Record + | Record], Ref>; export const _TRef = Symbol.for('ref'); export const TRef = Record.makeConstructor<{name: string}, Ref>()( _TRef, ['name']); -export type TRef = ReturnType; export const _TCompound = Symbol.for('compound'); export const TCompound = - Record.makeConstructor<{ctor: ConstructorSpec, members: Dictionary}, Ref>()( + Record.makeConstructor<{ctor: ConstructorSpec, members: Dictionary