UNPKG

functionalscript

Version:

FunctionalScript is a purely functional subset of JavaScript

75 lines (74 loc) 3.13 kB
import { strictEqual } from "../types/function/operator/module.f.js"; import { merge as rangeMapMerge, fromRange, get, } from "../types/range_map/module.f.js"; import { reduce as listReduce, toArray, map } from "../types/list/module.f.js"; import { range as asciiRange } from "../text/ascii/module.f.js"; import { fn } from "../types/function/module.f.js"; import { one } from "../types/range/module.f.js"; const fromCharCode = String.fromCharCode; const unexpectedSymbol = codePoint => [[`unexpected symbol ${codePoint}`], unexpectedSymbol]; const def = () => unexpectedSymbol; const union = (a) => (b) => { if (a === def || a === b) { return b; } if (b === def) { return a; } throw [a, b]; }; const empty = []; const reduce = (a) => { const merge = rangeMapMerge({ union, equal: strictEqual, def, }); return toArray(listReduce(merge)(empty)(a)); }; const codePointRange = fromRange(def); const range = fn(asciiRange).then(codePointRange).result; const rangeSet = (l) => (f) => { const codePointRange = fromRange(def); const g = r => codePointRange(asciiRange(r))(f); return reduce(map(g)(l)); }; const create = (a) => { const i = reduce(a); const x = get(def); return v => c => x(c)(i)(v)(c); }; export const terminal = -1; const toInit = () => () => [[], init]; export const init = create([ codePointRange(one(terminal))(toInit), rangeSet(['\t', ' ', '\n', '\r'])(toInit), range('!')(() => () => [['!'], unexpectedSymbol]), range('"')(() => () => [['"'], unexpectedSymbol]), rangeSet(['$', '_', 'AZ', 'az'])(() => c => [[fromCharCode(c)], unexpectedSymbol]), range('%')(() => () => [['%'], unexpectedSymbol]), range('&')(() => () => [['&'], unexpectedSymbol]), range("'")(() => () => [["'"], unexpectedSymbol]), range('(')(() => () => [['('], unexpectedSymbol]), range(')')(() => () => [[')'], unexpectedSymbol]), range('*')(() => () => [['*'], unexpectedSymbol]), range('+')(() => () => [['+'], unexpectedSymbol]), range(',')(() => () => [[','], unexpectedSymbol]), range('-')(() => () => [['-'], unexpectedSymbol]), range('.')(() => () => [['.'], unexpectedSymbol]), range('/')(() => () => [['/'], unexpectedSymbol]), range('09')(() => a => [[fromCharCode(a)], unexpectedSymbol]), range(':')(() => () => [[':'], unexpectedSymbol]), range(';')(() => () => [[';'], unexpectedSymbol]), range('<')(() => () => [['<'], unexpectedSymbol]), range('=')(() => () => [['='], unexpectedSymbol]), range('>')(() => () => [['>'], unexpectedSymbol]), range('?')(() => () => [['?'], unexpectedSymbol]), range('[')(() => () => [['['], unexpectedSymbol]), range(']')(() => () => [[']'], unexpectedSymbol]), range('^')(() => () => [['^'], unexpectedSymbol]), range('`')(() => () => [['`'], unexpectedSymbol]), range('{')(() => () => [['{'], unexpectedSymbol]), range('|')(() => () => [['|'], unexpectedSymbol]), range('}')(() => () => [['}'], unexpectedSymbol]), range('~')(() => () => [['~'], unexpectedSymbol]), ])(undefined);