UNPKG

functionalscript

Version:

FunctionalScript is a purely functional subset of JavaScript

151 lines (150 loc) 5.31 kB
import { cp, range, remove, str } from "./module.f.js"; // https://www.json.org/json-en.html export const classic = () => { // {"empty":true,"map":[[false,8],[true,10],[false,12],[true,13],[false,31],[true,32]]} const ws = () => [ [], [cp(' '), ws], // 32 [cp('\n'), ws], // 10 [cp('\r'), ws], // 13 [cp('\t'), ws], // 9 ]; // {"empty":true,"map":[[false,42],[true,43],[false,44],[true,45]]} const sign = () => [ [], str('+'), // 43 str('-'), // 45 ]; // {"empty":false,"map":[[false,48],[true,57]]} const onenine = () => [[[0x31, 0x39]]]; // {"empty":false,"map":[[false,47],[true,57]]} const digit = () => [ str('0'), [onenine], ]; // {"empty":false,"map":[[false,47],[true,57]]} const digits = () => [ [digit], [digit, digits] ]; // {"empty":true,"map":[[false,68],[true,69],[false,100],[true,101]]} const exponent = () => [ [], [cp('E'), sign, digits], // 69 [cp('e'), sign, digits], // 101 ]; // {"empty":true,"map":[[false,45],[true,46]]} const fraction = () => [ [], [cp('.'), digits] // 46 ]; // {"empty":false,"map":[[false,44],[true,45],[false,47],[true,57]]} const integer = () => [ [digit], // 48-57 [onenine, digits], [cp('-'), digit], // 45 [cp('-'), onenine, digits], ]; // {"empty":false,"map":[[false,44],[true,45],[false,47],[true,57]]} const number = () => [ [integer, fraction, exponent] ]; // {"empty":false,"map":[[false,47],[true,57],[false,64],[true,70],[false,96],[true,102]]} const hex = () => [ [digit], // 48-57 [range('AF')], // A..F [range('af')], // a..f ]; // {"empty":false,"map":[[false,33],[true,34],[false,46],[true,47],[false,91],[true,92],[false,97],[true,98],[false,101],[true,102],[false,109],[true,110],[false,113],[true,114],[false,115],[true,117]]} const escape = () => [ str('"'), // 34 str('\\'), // 92 str('/'), // 47 str('b'), // 98 str('f'), // 102 str('n'), // 110 str('r'), // 114 str('t'), // 116 [cp('u'), hex, hex, hex, hex] // 117 ]; // {"empty":false,"map":[[false,31],[true,33],[false,34],[true,1114111]]} const character = () => [ ...remove([0x20, 0x10FFFF], [cp('"'), cp('\\')]), [cp('\\'), escape], ]; // {"empty":true,"map":[[false,31],[true,33],[false,34],[true,1114111]]} const characters = () => [ [], [character, characters] ]; // {"empty":false,"map":[[false,33],[true,34]]} const string = () => [ [cp('"'), characters, cp('"')] ]; // {"empty":false,"map":[[false,8],[true,10],[false,12],[true,13],[false,31],[true,32],[false,33],[true,34],[false,44],[true,45],[false,47],[true,57],[false,90],[true,91],[false,101],[true,102],[false,109],[true,110],[false,115],[true,116],[false,122],[true,123]]} const element = () => [ [ws, value, ws] ]; // {"empty":false,"map":[[false,8],[true,10],[false,12],[true,13],[false,31],[true,32],[false,33],[true,34],[false,44],[true,45],[false,47],[true,57],[false,90],[true,91],[false,101],[true,102],[false,109],[true,110],[false,115],[true,116],[false,122],[true,123]]} const elements = () => [ [element], [element, cp(','), elements] ]; // {"empty":false,"map":[[false,90],[true,91]]} const array = () => [ [cp('['), ws, cp(']')], // 91 [cp('['), elements, cp(']')], ]; // {"empty":false,"map":[[false,8],[true,10],[false,12],[true,13],[false,31],[true,32],[false,33],[true,34]]} const member = () => [ [ws, string, ws, cp(':'), element] ]; // {"empty":false,"map":[[false,8],[true,10],[false,12],[true,13],[false,31],[true,32],[false,33],[true,34]]} const members = () => [ [member], [member, cp(','), members], ]; // {"empty":false,"map":[[false,122],[true,123]]} const object = () => [ [cp('{'), ws, cp('}')], // 123 [cp('{'), members, cp('}')], ]; // {"empty":false,"map":[[false,33],[true,34],[false,44],[true,45],[false,47],[true,57],[false,90],[true,91],[false,101],[true,102],[false,109],[true,110],[false,115],[true,116],[false,122],[true,123]]} const value = () => [ [object], // 123 [array], // 91 [string], // 34 [number], // 45, 48-57 str('true'), // 116 str('false'), // 102 str('null'), // 110 ]; // {"empty":false,"map":[[false,8],[true,10],[false,12],[true,13],[false,31],[true,32],[false,33],[true,34],[false,44],[true,45],[false,47],[true,57],[false,90],[true,91],[false,101],[true,102],[false,109],[true,110],[false,115],[true,116],[false,122],[true,123]]} const json = () => [ [element] ]; return { ws, sign, digits, exponent, fraction, onenine, digit, string, member, members, object, array, integer, number, value, element, elements, json, hex, escape, character, characters, }; };