import { Annotated, Bytes, Set, Dictionary, Fold, fold, Record, Tuple, Value, stringify } from "@preserves/core"; import { brackets, Item, parens, seq } from "./block"; import * as M from '../meta'; export function sourceCodeFor(v: Value): Item { return fold(v, { boolean(b: boolean): Item { return b.toString(); }, single(f: number): Item { return f.toString(); }, double(f: number): Item { return f.toString(); }, integer(i: number): Item { return i.toString(); }, string(s: string): Item { return JSON.stringify(s); }, bytes(b: Bytes): Item { return seq(`Uint8Array.from(`, brackets(... Array.from(b).map(b => b.toString())), `)`); }, symbol(s: symbol): Item { return `Symbol.for(${JSON.stringify(s.description!)})`; }, record(r: Record, Tuple>, M._embedded>, k: Fold): Item { return seq(`_.Record<_val, _.Tuple<_val>, _embedded>`, parens(k(r.label), brackets(... r.map(k)))); }, array(a: Array>, k: Fold): Item { return brackets(... a.map(k)); }, set(s: Set, k: Fold): Item { return seq('new _.Set<_val>', parens(brackets(... Array.from(s).map(k)))); }, dictionary(d: Dictionary, k: Fold): Item { return seq('new _.Dictionary<_embedded>', parens(brackets(... Array.from(d).map(([kk,vv]) => brackets(k(kk), k(vv)))))); }, annotated(a: Annotated, k: Fold): Item { return seq('_.annotate<_embedded>', parens(k(a.item), ... a.annotations.map(k))); }, embedded(t: M._embedded, _k: Fold): Item { throw new Error(`Cannot emit source code for construction of embedded ${stringify(t)}`); }, }); }