From 6b9a3d2ee4ec49f38f02106e3aa264946b7cdc93 Mon Sep 17 00:00:00 2001 From: Akshay Nair Date: Thu, 13 Jan 2022 14:49:05 +0530 Subject: refactor: type + constructors refactor --- src/parser/index.ts | 18 +++++++++--------- src/types.ts | 28 ++++++++++++++-------------- src/utils.ts | 18 ++++++++++-------- 3 files changed, 33 insertions(+), 31 deletions(-) (limited to 'src') diff --git a/src/parser/index.ts b/src/parser/index.ts index 386fa94..c61364d 100644 --- a/src/parser/index.ts +++ b/src/parser/index.ts @@ -20,15 +20,15 @@ import { } from './utils' import { Expr, ListExpr } from '../types' -const start = mapTo(symbol('^'), _ => Expr.Start(null)) -const end = mapTo(symbol('$'), _ => Expr.End(null)) -const anyItem = mapTo(symbol('.'), _ => Expr.AnyItem(null)) -const nextItem = mapTo(symbol(','), _ => Expr.NextItem(null)) -const anyString = mapTo(symbol('\\s'), _ => Expr.AnyString(null)) -const anyNumber = mapTo(symbol('\\n'), _ => Expr.AnyNumber(null)) -const anyBool = mapTo(symbol('\\b'), _ => Expr.AnyBool(null)) -const truthy = mapTo(symbol('\\T'), _ => Expr.Truthy(null)) -const falsey = mapTo(symbol('\\F'), _ => Expr.Falsey(null)) +const start = mapTo(symbol('^'), _ => Expr.Start()) +const end = mapTo(symbol('$'), _ => Expr.End()) +const anyItem = mapTo(symbol('.'), _ => Expr.AnyItem()) +const nextItem = mapTo(symbol(','), _ => Expr.NextItem()) +const anyString = mapTo(symbol('\\s'), _ => Expr.AnyString()) +const anyNumber = mapTo(symbol('\\n'), _ => Expr.AnyNumber()) +const anyBool = mapTo(symbol('\\b'), _ => Expr.AnyBool()) +const truthy = mapTo(symbol('\\T'), _ => Expr.Truthy()) +const falsey = mapTo(symbol('\\F'), _ => Expr.Falsey()) const wrapQuantifiers: (e: ParserResult) => ParserResult = chain( ([expr, input]) => diff --git a/src/types.ts b/src/types.ts index 07e6e8a..d30413d 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,27 +1,27 @@ import {Option} from "fp-ts/lib/Option" import { constructors, Union } from "./utils" -type ExprT = { - Start: null, - End: null, +type _ = never + +export type Expr = Union<{ + Start: _, + End: _, Optional: { expr: Expr }, OneOrMore: { expr: Expr }, ZeroOrMore: { expr: Expr }, - NextItem: null, - AnyItem: null, + NextItem: _, + AnyItem: _, Or: { left: Expr, right: Expr[] }, - AnyString: null, - AnyNumber: null, - AnyBool: null, - Truthy: null, - Falsey: null, + AnyString: _, + AnyNumber: _, + AnyBool: _, + Truthy: _, + Falsey: _, Group: { exprs: Expr[] }, PropertyMatch: { name: string, exprs: Expr[] }, -} - -export type Expr = Union +}> -export const Expr = constructors() +export const Expr = constructors() export type ListExpr = [ Option, diff --git a/src/utils.ts b/src/utils.ts index 15d5fb0..66c4c53 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -3,19 +3,22 @@ export const eq = (b: T): boolean => a === b -type TagValue = T extends Tag ? V : never; +type TagValue = T extends Tag ? V : never export const match = - > - (pattern: { [key in T['tag'] | '_']?: (v: TagValue) => R }) => - (tag: T): R => - (pattern[tag.tag] || pattern._ as any)(tag.value) + >(pattern: { + [key in T['tag'] | '_']?: (v: TagValue) => R + }) => + (tag: T): R => + (pattern[tag.tag] || (pattern._ as any))(tag.value) type Tag = { tag: N; value: V } export type Union = { [N in keyof T]: Tag }[keyof T] -export const constructors = >(): { - [N in keyof T]: (value: T[N]) => Union // Tag +export const constructors = >(): { + [N in T['tag']]: TagValue extends null|never + ? (value?: null | never) => T + : (value: TagValue) => T } => new Proxy( {}, @@ -27,4 +30,3 @@ export const constructors = >(): { ) as any export const jlog = (x: any) => console.log(JSON.stringify(x, null, 2)) - -- cgit v1.3.1