aboutsummaryrefslogtreecommitdiff
path: root/src/index.ts
diff options
context:
space:
mode:
authorAkshay Nair <phenax5@gmail.com>2022-01-07 18:13:40 +0530
committerAkshay Nair <phenax5@gmail.com>2022-01-07 18:14:06 +0530
commit6639605b395ceb1355c95e06ff0e1470adc54101 (patch)
tree01e300c50086f8db47300388ab3d7a5e5f83072d /src/index.ts
parentb3fc08cae05f997e71d846109d400e630b8a4c35 (diff)
downloadelxr-6639605b395ceb1355c95e06ff0e1470adc54101.tar.gz
elxr-6639605b395ceb1355c95e06ff0e1470adc54101.zip
refactor: simplifies quantifier logic + moves stuff around
Diffstat (limited to 'src/index.ts')
-rw-r--r--src/index.ts106
1 files changed, 1 insertions, 105 deletions
diff --git a/src/index.ts b/src/index.ts
index 2ea40eb..82eefe8 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -1,106 +1,2 @@
-import { constant, pipe } from 'fp-ts/function'
-import { chain, fold, right } from 'fp-ts/lib/Either'
-import { match } from './utils'
-import {
- delimited,
- many1,
- mapTo,
- optional,
- or,
- Parser,
- ParserResult,
- symbol,
- tuple3,
-} from './parser'
-export const start = mapTo(symbol('^'), constant({ tag: 'Start' } as Expr))
-export const end = mapTo(symbol('$'), constant({ tag: 'End' } as Expr))
-export const anyItem = mapTo(symbol('.'), constant({ tag: 'AnyItem' } as Expr))
-export const nextItem = mapTo(
- symbol(','),
- constant({ tag: 'NextItem' } as Expr)
-)
-export const anyString = mapTo(
- symbol('\\s'),
- constant({ tag: 'AnyString' } as Expr)
-)
-export const anyNumber = mapTo(
- symbol('\\n'),
- constant({ tag: 'AnyNumber' } as Expr)
-)
-export const anyBool = mapTo(
- symbol('\\b'),
- constant({ tag: 'AnyBool' } as Expr)
-)
-export const truthy = mapTo(symbol('\\T'), constant({ tag: 'Truthy' } as Expr))
-export const falsey = mapTo(symbol('\\F'), constant({ tag: 'Falsey' } as Expr))
-
-type Expr =
- | { tag: 'Start' }
- | { tag: 'End' }
- | { tag: 'Optional'; expr: Expr }
- | { tag: 'OneOrMore'; expr: Expr }
- | { tag: 'ZeroOrMore'; expr: Expr }
- | { tag: 'NextItem' }
- | { tag: 'AnyItem' }
- | { tag: 'Or' }
- | { tag: 'AnyString' }
- | { tag: 'AnyNumber' }
- | { tag: 'AnyBool' }
- | { tag: 'Truthy' }
- | { tag: 'Falsey' }
- | { tag: 'Group'; exprs: Expr[] }
-
-export const wrapQuantifiers: (e: ParserResult<Expr>) => ParserResult<Expr> =
- chain(([expr, input]) =>
- pipe(
- input,
- or([symbol('*'), symbol('+'), symbol('?')]),
- fold(
- () => right([expr, input]),
- ([c, inp]) =>
- pipe(
- c,
- match<Expr, string>({
- '*': () => ({ tag: 'ZeroOrMore', expr }),
- '+': () => ({ tag: 'OneOrMore', expr }),
- '?': () => ({ tag: 'Optional', expr }),
- _: () => expr,
- }),
- (ex) => right([ex, inp])
- )
- )
- )
- )
-
-export const expressionP: Parser<Expr> = (input: string) =>
- pipe(
- input,
- or([
- mapTo(
- delimited(symbol('('), many1(expressionP), symbol(')')),
- (exprs) => ({ tag: 'Group', exprs } as Expr)
- ),
- nextItem,
- anyItem,
- anyString,
- anyNumber,
- anyBool,
- truthy,
- falsey,
- ]),
- wrapQuantifiers
- )
-
-export const parser = tuple3(optional(start), many1(expressionP), optional(end))
-
-/*
-
-{3,6} => 3 to 6 instances
-(> 5) => number greater than
-(< 5) => number less than
-[name x] => apply x on property `name`
-| => or
-/x/ => match regular expression (string values in list)
-
-*/
+export * from './parser';