functionalscript
Version:
FunctionalScript is a purely functional subset of JavaScript
75 lines (74 loc) • 3.13 kB
JavaScript
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);