UNPKG

functionalscript

Version:

FunctionalScript is a purely functional subset of JavaScript

69 lines (68 loc) 2.37 kB
import * as list from "../types/list/module.f.js"; const { next, flat, map } = list; import * as string from "../types/string/module.f.js"; const { concat } = string; import * as object from "../types/object/module.f.js"; const { at } = object; import * as f from "../types/function/module.f.js"; const { compose, fn } = f; const { entries } = Object; import * as s from "./serializer/module.f.js"; const { objectWrap, arrayWrap, stringSerialize, numberSerialize, nullSerialize, boolSerialize } = s; export const setProperty = value => { const f = path => src => { const result = next(path); if (result === null) { return value; } const srcObject = (src === null || typeof src !== 'object' || src instanceof Array) ? {} : src; const { first, tail } = result; return { ...srcObject, [first]: f(tail)(at(first)(srcObject)) }; }; return f; }; const colon = [':']; export const serialize = sort => { const propertySerialize = ([k, v]) => flat([ stringSerialize(k), colon, f(v) ]); const mapPropertySerialize = map(propertySerialize); const objectSerialize = fn(entries) .then(sort) .then(mapPropertySerialize) .then(objectWrap) .result; const f = value => { switch (typeof value) { case 'boolean': { return boolSerialize(value); } case 'number': { return numberSerialize(value); } case 'string': { return stringSerialize(value); } default: { if (value === null) { return nullSerialize; } if (value instanceof Array) { return arraySerialize(value); } return objectSerialize(value); } } }; const arraySerialize = compose(map(f))(arrayWrap); return f; }; /** * The standard `JSON.stringify` rules determined by * https://262.ecma-international.org/6.0/#sec-ordinary-object-internal-methods-and-internal-slots-ownpropertykeys */ export const stringify = sort => compose(serialize(sort))(concat); export const parse = JSON.parse; export const isObject = (value) => typeof value === 'object' && value !== null && !(value instanceof Array);