aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/parser/index.ts18
-rw-r--r--src/types.ts28
-rw-r--r--src/utils.ts18
3 files changed, 33 insertions, 31 deletions
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<Expr>) => ParserResult<Expr> = 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<ExprT>
+}>
-export const Expr = constructors<ExprT>()
+export const Expr = constructors<Expr>()
export type ListExpr = [
Option<Expr>,
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, N> = T extends Tag<N, infer V> ? V : never;
+type TagValue<T, N> = T extends Tag<N, infer V> ? V : never
export const match =
- <R, T extends Tag<string, any>>
- (pattern: { [key in T['tag'] | '_']?: (v: TagValue<T, key>) => R }) =>
- (tag: T): R =>
- (pattern[tag.tag] || pattern._ as any)(tag.value)
+ <R, T extends Tag<string, any>>(pattern: {
+ [key in T['tag'] | '_']?: (v: TagValue<T, key>) => R
+ }) =>
+ (tag: T): R =>
+ (pattern[tag.tag] || (pattern._ as any))(tag.value)
type Tag<N, V> = { tag: N; value: V }
export type Union<T> = { [N in keyof T]: Tag<N, T[N]> }[keyof T]
-export const constructors = <T extends Record<string, any>>(): {
- [N in keyof T]: (value: T[N]) => Union<T> // Tag<N, T[N]>
+export const constructors = <T extends Tag<string, any>>(): {
+ [N in T['tag']]: TagValue<T, N> extends null|never
+ ? (value?: null | never) => T
+ : (value: TagValue<T, N>) => T
} =>
new Proxy(
{},
@@ -27,4 +30,3 @@ export const constructors = <T extends Record<string, any>>(): {
) as any
export const jlog = (x: any) => console.log(JSON.stringify(x, null, 2))
-