{"version":3,"sources":["../src/index.ts","../src/syntax/index.ts","../src/syntax/tokens.ts","../src/syntax/position.ts","../src/syntax/vlq.ts","../src/syntax/span.ts","../src/syntax/codewriter.ts","../src/syntax/list.ts","../src/syntax/matcher.ts","../src/syntax/scanner.ts","../src/syntax/reader.ts","../src/syntax/template.ts","../src/compiler/grammar.ts","../src/compiler/codegen.ts"],"sourcesContent":["/// SPDX-License-Identifier: GPL-3.0-or-later\n/// SPDX-FileCopyrightText: Copyright © 2016-2025 Tony Garnock-Jones <tonyg@leastfixedpoint.com>\n\nexport * as Syntax from './syntax/index.js';\nexport * from './compiler/index.js';\n","/// SPDX-License-Identifier: GPL-3.0-or-later\n/// SPDX-FileCopyrightText: Copyright © 2016-2025 Tony Garnock-Jones <tonyg@leastfixedpoint.com>\n\nexport * from './codewriter.js';\nexport * from './list.js';\nexport * from './matcher.js';\nexport * from './position.js';\nexport * from './reader.js';\nexport * from './scanner.js';\nexport * from './span.js';\nexport * from './template.js';\nexport * from './tokens.js';\nexport * from './vlq.js';\n","/// SPDX-License-Identifier: GPL-3.0-or-later\n/// SPDX-FileCopyrightText: Copyright © 2016-2025 Tony Garnock-Jones <tonyg@leastfixedpoint.com>\n\nimport { Pos } from './position.js';\n\nexport enum TokenType {\n    SPACE,\n    NEWLINE,\n    ATOM,\n    STRING,\n    OPEN,\n    CLOSE,\n}\n\nexport interface TokenBase {\n    start: Pos;\n    end: Pos;\n    synthetic?: boolean; // default: false\n}\n\nexport interface Token extends TokenBase {\n    type: TokenType;\n    text: string;\n}\n\nexport interface Group extends TokenBase {\n    open: Token;\n    close: Token | null;\n    items: Items;\n}\n\nexport type Item = Token | Group;\nexport type Items = Array<Item>;\n\nexport type GroupInProgress = Omit<Group, 'end'>;\n\nexport function getRange(t: Item | Items): TokenBase {\n    if (Array.isArray(t)) {\n        return { start: t[0].start, end: t[t.length - 1].end, synthetic: true };\n    } else {\n        return t;\n    }\n}\n\nexport function finishGroup(g: GroupInProgress, end: Pos): Group {\n    return { ... g, end };\n}\n\nexport function makeGroup(open: Token, items: Array<Item>, close: Token): Group {\n    return { start: open.start, open, end: close.end, close, items };\n}\n\nexport function isSpace(i: Item): i is Token {\n    return isTokenType(i, TokenType.SPACE) || isTokenType(i, TokenType.NEWLINE);\n}\n\nexport function isGroup(i: Item): i is Group {\n    return i && ('items' in i);\n}\n\nexport function isToken(i: Item): i is Token {\n    return i && ('type' in i);\n}\n\nexport function isTokenType(i: Item, t: TokenType): i is Token {\n    return isToken(i) && i.type === t;\n}\n\nexport type ItemTextOptions = {\n    missing?: string,\n    color?: boolean,\n};\n\nexport function foldItems<T>(i: Items,\n                             fToken: (t: Token) => T,\n                             fGroup: (g: Group, t: T, k: (t: Token) => T) => T,\n                             fItems: (ts: T[]) => T): T\n{\n    const walk = (i: Item): T => {\n        if (isGroup(i)) {\n            return fGroup(i, fItems(i.items.map(walk)), walk);\n        } else {\n            return fToken(i);\n        }\n    };\n    return fItems(i.map(walk));\n}\n\nexport function itemText(items: Items, options: ItemTextOptions = {}): string {\n    return foldItems(\n        items,\n        i => {\n            if (options.color ?? false) {\n                switch (i.type) {\n                    case TokenType.SPACE:\n                    case TokenType.NEWLINE:\n                        return '\\x1b[31m' + i.text + '\\x1b[0m';\n                    case TokenType.STRING:\n                        return '\\x1b[34m' + i.text + '\\x1b[0m';\n                    default:\n                        return i.text;\n                }\n            } else {\n                return i.text;\n            }\n        },\n        (g, inner, k) => k(g.open) + inner + (g.close ? k(g.close) : options.missing ?? ''),\n        strs => strs.join(''));\n}\n","/// SPDX-License-Identifier: GPL-3.0-or-later\n/// SPDX-FileCopyrightText: Copyright © 2016-2025 Tony Garnock-Jones <tonyg@leastfixedpoint.com>\n\nexport interface Pos {\n    line: number;\n    column: number;\n    pos: number;\n    name: string | null;\n    fixed?: boolean;\n}\n\nexport function formatPos(p?: Pos): string {\n    return p ? `${p.name ?? '?'}:${p.line}:${p.column}` : '?';\n}\n\nexport function startPos(name: string | null): Pos {\n    return { line: 1, column: 0, pos: 0, name };\n}\n\nexport function fixPos(p: Pos): Pos {\n    return { ... p, fixed: true };\n}\n\nexport function advancePos(p: Pos, ch: string): boolean {\n    if (p.fixed ?? false) {\n        return ch === '\\n';\n    } else {\n        let advancedLine = false;\n        p.pos++;\n        switch (ch) {\n            case '\\t':\n                p.column = (p.column + 8) & ~7;\n                break;\n            case '\\n':\n                p.column = 0;\n                p.line++;\n                advancedLine = true;\n                break;\n            case '\\r':\n                p.column = 0;\n                break;\n            default:\n                p.column++;\n                break;\n        }\n        return advancedLine;\n    }\n}\n","/// SPDX-License-Identifier: GPL-3.0-or-later\n/// SPDX-FileCopyrightText: Copyright © 2016-2025 Tony Garnock-Jones <tonyg@leastfixedpoint.com>\n\nconst alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\nconst inverse_alphabet =\n    new Map<string, number>(Object.entries(alphabet).map(([i,c])=>[c,parseInt(i)]));\n\nexport function vlqDecode(s: string): Array<number> {\n    let acc = 0;\n    let shift_amount = 0;\n    const buf = [];\n    for (const ch of s) {\n        const sextet = inverse_alphabet.get(ch) ?? 0;\n        acc |= (sextet & 0x1f) << shift_amount;\n        shift_amount += 5;\n        if (!(sextet & 0x20)) {\n            const negative = !!(acc & 1);\n            acc = acc >> 1;\n            if (negative) acc = -acc;\n            buf.push(acc);\n            acc = 0;\n            shift_amount = 0;\n        }\n    }\n    return buf;\n}\n\nexport function vlqEncode(ns: Array<number>): string {\n    const buf = [];\n    for (let n of ns) {\n        n = (n < 0) ? ((-n) << 1) | 1 : (n << 1);\n        do {\n            const m = n & 0x1f;\n            n = n >> 5;\n            const sextet = (n > 0) ? m | 0x20 : m;\n            buf.push(alphabet[sextet]);\n        } while (n > 0);\n    }\n    return buf.join('');\n}\n","/// SPDX-License-Identifier: GPL-3.0-or-later\n/// SPDX-FileCopyrightText: Copyright © 2016-2025 Tony Garnock-Jones <tonyg@leastfixedpoint.com>\n\nexport class SpanResult<T> {\n    readonly searchTarget: number;\n    readonly start: number;\n    readonly items: Array<{ end: number, item: T }> = [];\n\n    constructor(searchTarget: number, start: number) {\n        this.searchTarget = searchTarget;\n        this.start = start;\n    }\n\n    get offset(): number {\n        return this.searchTarget - this.start;\n    }\n\n    get firstItem(): T {\n        return this.items[0].item;\n    }\n\n    get lastItem(): T {\n        return this.items[this.items.length - 1].item;\n    }\n}\n\nexport class SpanIndex<T> {\n    readonly index: Array<[number, Array<[number, T]>]> = [];\n\n    get(pos: number): SpanResult<T> | null {\n        if (this.index.length === 0) return null;\n\n        let lo = 0;\n        let hi = this.index.length;\n\n        // console.log(`\\nsearching for ${pos}`);\n        while (true) {\n            if (lo === hi) {\n                if (lo === 0) return null;\n                const e = this.index[lo - 1];\n                if (e[0] > pos) throw new Error(\"INTERNAL ERROR: bad binary search (1)\");\n                if (this.index[lo]?.[0] <= pos) throw new Error(\"INTERNAL ERROR: bad binary search (2)\");\n                // console.log(`found ${JSON.stringify(e)}, ${JSON.stringify(this.index[lo] ?? null)}`);\n                const r = new SpanResult<T>(pos, e[0]);\n                e[1].forEach(([end, item]) => {\n                    if (pos <= end) {\n                        r.items.push({ end, item });\n                    }\n                });\n                return (r.items.length > 0) ? r : null;\n            }\n\n            const mid = (lo + hi) >> 1;\n            const e = this.index[mid];\n\n            // console.log(`${pos} lo ${lo} hi ${hi} mid ${mid} probe ${JSON.stringify(e)}`);\n\n            if (e[0] <= pos) {\n                lo = mid + 1;\n            } else {\n                hi = mid;\n            }\n        }\n    }\n}\n\nexport class SpanInfo<T> {\n    readonly spans: Map<number, Array<[number, T]>> = new Map();\n\n    add(start: number, end: number, t: T) {\n        if (!this.spans.has(start)) {\n            this.spans.set(start, []);\n        }\n        this.spans.get(start)!.push([end, t]);\n    }\n\n    index(): SpanIndex<T> {\n        const i = new SpanIndex<T>();\n        this.spans.forEach((ends, start) => {\n            ends.sort((a, b) => a[0] - b[0]);\n            i.index.push([start, ends]);\n        });\n        i.index.sort((a, b) => a[0] - b[0]);\n        return i;\n    }\n}\n","/// SPDX-License-Identifier: GPL-3.0-or-later\n/// SPDX-FileCopyrightText: Copyright © 2016-2025 Tony Garnock-Jones <tonyg@leastfixedpoint.com>\n\nimport { Token, TokenType, Item, Items, isGroup } from './tokens.js';\nimport { Pos, startPos, advancePos } from './position.js';\nimport { vlqEncode } from './vlq.js';\nimport { SpanInfo } from './span.js';\n\nexport interface SourceMap {\n    version: 3;\n    file?: string;\n    sourceRoot?: string, // default: \"\"\n    sources: Array<string>;\n    sourcesContent?: Array<string | null>; // default: null at each entry\n    names: Array<string>;\n    mappings: string;\n}\n\nexport interface NoSourceMapping {\n    generatedStartColumn: number; // zero-based\n}\nexport interface SourceMapping extends NoSourceMapping {\n    sourceIndex: number;\n    sourceStartLine: number; // zero-based (!!)\n    sourceStartColumn: number; // zero-based\n}\nexport interface SourceNameMapping extends SourceMapping {\n    nameIndex: number;\n}\n\nexport type NonEmptyMapping = NoSourceMapping | SourceMapping | SourceNameMapping;\nexport type Mapping = {} | NonEmptyMapping;\n\nfunction encodeMapping(entry: NonEmptyMapping): Array<number> {\n    const a = [entry.generatedStartColumn];\n    if ('sourceIndex' in entry) {\n        a.push(entry.sourceIndex);\n        a.push(entry.sourceStartLine);\n        a.push(entry.sourceStartColumn);\n        if ('nameIndex' in entry) {\n            a.push(entry.nameIndex);\n        }\n    }\n    return a;\n}\n\nfunction maybeDelta(newValue: number, oldValue: number | undefined): number {\n    // console.log('maybeDelta', oldValue, newValue);\n    return (oldValue === void 0) ? newValue : newValue - oldValue;\n}\n\nexport class CodeWriter {\n    readonly file: string | null;\n    readonly pos: Pos;\n    readonly sources: Array<string> = [];\n    readonly chunks: Array<string> = [];\n    readonly mappings: Array<Array<NonEmptyMapping>> = [];\n    readonly targetToSourceMap = new SpanInfo<Token>();\n    readonly sourceToTargetMap = new SpanInfo<number>();\n    previous: Partial<SourceNameMapping> = {};\n    previousPos: Pos | null = null;\n\n    constructor(file: string | null) {\n        this.file = file;\n        this.pos = startPos(this.file ?? '');\n    }\n\n    get text(): string {\n        return this.chunks.join('');\n    }\n\n    get map(): SourceMap {\n        // console.log(this.mappings.map(segs => segs.map(encodeMapping)));\n        const mappings = this.mappings.map(segments =>\n            segments.map(encodeMapping).map(vlqEncode).join(',')).join(';');\n        const m: SourceMap = {\n            version: 3,\n            sources: [... this.sources],\n            names: [],\n            mappings,\n        };\n        if (this.file !== null) m.file = this.file;\n        return m;\n    }\n\n    finishLine() {\n        // console.log('newline');\n        this.mappings.push([]);\n        this.previous.generatedStartColumn = undefined;\n        this.previousPos = null;\n    }\n\n    sourceIndexFor(name: string) {\n        let i = this.sources.indexOf(name);\n        if (i === -1) {\n            this.sources.push(name);\n            i = this.sources.length - 1;\n        }\n        return i;\n    }\n\n    addMapping(p: Pos, type: TokenType) {\n        // console.log('considering', p, type);\n\n        const oldPos = this.previousPos;\n\n        if ((oldPos === null || oldPos.name === p.name) &&\n            (type === TokenType.SPACE || type === TokenType.NEWLINE))\n        {\n            // console.log('whitespace skip');\n            if (this.previousPos !== null) {\n                this.previousPos = p;\n            }\n            return;\n        }\n\n        this.previousPos = p;\n\n        if ((oldPos?.name === p.name) &&\n            ((p.name === null) ||\n                ((oldPos?.column === p.column) && (oldPos?.line === p.line))))\n        {\n            // console.log('skipping', this.previous, oldPos, p);\n            return;\n        }\n\n        let n: NonEmptyMapping = {\n            generatedStartColumn: maybeDelta(this.pos.column, this.previous.generatedStartColumn),\n        };\n        this.previous.generatedStartColumn = this.pos.column;\n\n        if (p.name !== null) {\n            const sourceIndex = this.sourceIndexFor(p.name);\n            n = {\n                ... n,\n                sourceIndex: maybeDelta(sourceIndex, this.previous.sourceIndex),\n                sourceStartColumn: maybeDelta(p.column, this.previous.sourceStartColumn),\n                sourceStartLine: maybeDelta(p.line - 1, this.previous.sourceStartLine),\n            };\n            this.previous.sourceIndex = sourceIndex;\n            this.previous.sourceStartColumn = p.column;\n            this.previous.sourceStartLine = p.line - 1;\n        }\n\n        // console.log('pushing',\n        //             n,\n        //             this.previous,\n        //             oldPos?.line + ':' + oldPos?.column,\n        //             p.line + ':' + p.column);\n        this.mappings[this.mappings.length - 1].push(n);\n    }\n\n    chunk(p: Pos, s: string, type: TokenType) {\n        p = { ... p };\n        this.chunks.push(s);\n        if (this.mappings.length === 0) this.finishLine();\n        this.addMapping(p, type);\n        for (const ch of s) {\n            advancePos(p, ch);\n            if (advancePos(this.pos, ch)) {\n                this.finishLine();\n                this.addMapping(p, type);\n            }\n        }\n    }\n\n    emit(i: Item | Items) {\n        if (Array.isArray(i)) {\n            i.forEach(j => this.emit(j));\n        } else if (isGroup(i)) {\n            this.emit(i.open);\n            this.emit(i.items);\n            if (i.close) this.emit(i.close);\n        } else if (i === null) {\n            // Do nothing.\n        } else {\n            const targetStart = this.pos.pos;\n            if (!i.synthetic) this.sourceToTargetMap.add(i.start.pos, i.end.pos, targetStart);\n            this.chunk(i.start, i.text, i.type);\n            this.targetToSourceMap.add(targetStart, this.pos.pos, i);\n        }\n    }\n}\n","/// SPDX-License-Identifier: GPL-3.0-or-later\n/// SPDX-FileCopyrightText: Copyright © 2016-2025 Tony Garnock-Jones <tonyg@leastfixedpoint.com>\n\nexport interface List<T, C> extends Iterable<T> {\n    item: T | null;\n    next: List<T, C> | null;\n    context: C;\n\n    toArray(): Array<T>;\n}\n\nexport function atEnd<T, C>(xs: List<T, C>): xs is (List<T, C> & { item: null, next: null }) {\n    return xs.item === null;\n}\n\nexport function notAtEnd<T, C>(xs: List<T, C>): xs is (List<T, C> & { item: T, next: List<T, C> }) {\n    return xs.item !== null;\n}\n\nexport class ArrayList<T, C> implements List<T, C> {\n    readonly items: Array<T>;\n    readonly index: number = 0;\n\n    constructor(items: Array<T>, public context: C, index = 0) {\n        this.items = items;\n        this.index = index;\n    }\n\n    get item(): T | null {\n        return this.items[this.index] ?? null;\n    }\n\n    get next(): List<T, C> | null {\n        if (this.index >= this.items.length) return null;\n        return new ArrayList(this.items, this.context, this.index + 1);\n    }\n\n    toArray(): Array<T> {\n        return this.items.slice(this.index);\n    }\n\n    [Symbol.iterator](): Iterator<T> {\n        let i: List<T, C> = this;\n        return {\n            next(): IteratorResult<T> {\n                if (notAtEnd(i)) {\n                    const value = i.item;\n                    i = i.next;\n                    return { done: false, value };\n                } else {\n                    return { done: true, value: null };\n                }\n            }\n        };\n    }\n}\n","/// SPDX-License-Identifier: GPL-3.0-or-later\n/// SPDX-FileCopyrightText: Copyright © 2016-2025 Tony Garnock-Jones <tonyg@leastfixedpoint.com>\n\nimport {\n    Token, TokenType, Items, Item,\n    isGroup, isToken, isSpace, isTokenType,\n} from './tokens.js';\nimport { Pos, startPos } from './position.js';\nimport { List, ArrayList, atEnd, notAtEnd } from './list.js';\n\n//---------------------------------------------------------------------------\n// Patterns over Item\n\nexport type ItemContext = string /* the opener of the containing group, if any */ | null;\nexport type ItemList = List<Item, ItemContext>;\nexport type PatternResult<T> = [T, ItemList] | null;\nexport type Pattern<T> = (i: ItemList) => PatternResult<T>;\n\nexport type PatternTypeArg<P> = P extends Pattern<infer T> ? T : never;\n\nexport function match<T,F>(p: Pattern<T>, items: Items, failure: F, context: ItemContext): T | F {\n    const r = p(new ArrayList(items, context));\n    if (r === null) return failure;\n    if (notAtEnd(skipSpace(r[1]))) return failure;\n    return r[0];\n}\n\nexport const noItems = (c: ItemContext) => new ArrayList([], c);\n\nexport const fail: Pattern<never> = _i => null;\nexport function succeed<T>(t: T): Pattern<T> { return i => [t, i]; }\n\nexport const discard: Pattern<void> = i => [void 0, noItems(i.context)];\nexport const rest: Pattern<Items> = i => [i.toArray(), noItems(i.context)];\nexport const end: Pattern<void> = i => atEnd(skipSpace(i)) ? [void 0, noItems(i.context)] : null;\nexport const pos: Pattern<Pos> = i => notAtEnd(i) ? [i.item.start, i] : null;\n\nexport const newline: Pattern<Item> = i => {\n    while (notAtEnd(i) && isTokenType(i.item, TokenType.SPACE)) i = i.next;\n    if (!notAtEnd(i) || !isTokenType(i.item, TokenType.NEWLINE)) return null;\n    return [i.item, i.next];\n};\n\nexport function skipSpace(i: ItemList): ItemList {\n    while (notAtEnd(i) && isSpace(i.item)) i = i.next;\n    return i;\n}\n\nexport function collectSpace(i: ItemList, acc: Array<Item>): ItemList {\n    while (notAtEnd(i) && isSpace(i.item)) {\n        acc.push(i.item);\n        i = i.next;\n    }\n    return i;\n}\n\nexport function withoutSpace<T>(p: Pattern<T>): Pattern<T> {\n    return i => p(skipSpace(i));\n}\n\nexport function not(p: Pattern<any>, v?: undefined): Pattern<undefined>;\nexport function not<T>(p: Pattern<any>, v: T): Pattern<T> {\n    return i => p(i) === null ? [v, i] : null;\n}\n\nexport function follows(p: Pattern<any>): Pattern<undefined> {\n    return i => {\n        const r = p(i);\n        if (r === null) return null;\n        return [r[0], i];\n    };\n}\n\nexport function seq(... patterns: Pattern<any>[]): Pattern<any> {\n    return i => {\n        for (const p of patterns) {\n            const r = p(i);\n            if (r === null) return null;\n            i = r[1];\n        }\n        return [void 0, i];\n    };\n}\n\nexport function seqTuple<Patterns extends [...Pattern<any>[]]>(\n    ... patterns: Patterns\n): Pattern<{ [I in keyof Patterns]: PatternTypeArg<Patterns[I]> } & { length: Patterns['length'] }>\n{\n    return i => {\n        const rs = [];\n        for (const p of patterns) {\n            const r = p(i);\n            if (r === null) return null;\n            rs.push(r[0]);\n            i = r[1];\n        }\n        return [rs as unknown as PatternTypeArg<ReturnType<typeof seqTuple<Patterns>>>, i];\n    };\n}\n\nexport function alt<T>(... alts: Pattern<T>[]): Pattern<T> {\n    return i => {\n        for (const a of alts) {\n            const r = a(i);\n            if (r !== null) return r;\n        }\n        return null;\n    };\n}\n\nexport function scope<T>(pf: (scope: T) => Pattern<any>): Pattern<T> {\n    return i => {\n        const scope = Object.create(null);\n        const r = pf(scope)(i);\n        if (r === null) return null;\n        return [scope, r[1]];\n    };\n}\n\nexport function value<T>(pf: (scope: {value: T}) => Pattern<any>): Pattern<T> {\n    return i => {\n        const scope = Object.create(null);\n        const r = pf(scope)(i);\n        if (r === null) return null;\n        return [scope.value, r[1]];\n    };\n}\n\nexport function bind<T, K extends keyof T>(target: T, key: K, pattern: Pattern<T[K]>): Pattern<T[K]> {\n    return i => {\n        const r = pattern(i);\n        if (r === null) return null;\n        target[key] = r[0];\n        return r;\n    };\n}\n\nexport function exec(thunk: (i: ItemList) => void): Pattern<void> {\n    return i => {\n        thunk(i);\n        return [void 0, i];\n    };\n}\n\nexport function map<T, R>(p: Pattern<T>, f: (t: T) => R): Pattern<R> {\n    return i => {\n        const r = p(i);\n        if (r === null) return null;\n        return [f(r[0]), r[1]];\n    };\n}\n\nexport function mapm<T, R>(p: Pattern<T>, f: (t: T) => Pattern<R>): Pattern<R> {\n    return i => {\n        const r = p(i);\n        if (r === null) return null;\n        return f(r[0])(r[1]);\n    };\n}\n\nexport interface ItemOptions {\n    skipSpace?: boolean, // default: true\n    advance?: boolean, // default: true\n}\n\nexport interface GroupOptions extends ItemOptions {\n}\n\nexport interface TokenOptions extends ItemOptions {\n    tokenType?: TokenType, // default: TokenType.ATOM\n}\n\nexport function group<T>(opener: string, items: Pattern<T>, options: GroupOptions = {}): Pattern<T> {\n    return i => {\n        if (options.skipSpace ?? true) i = skipSpace(i);\n        if (!notAtEnd(i)) return null;\n        if (!isGroup(i.item)) return null;\n        if (i.item.open.text !== opener) return null;\n        const r = items(new ArrayList(i.item.items, opener));\n        if (r === null) return null;\n        if (!atEnd(r[1])) return null;\n        return [r[0], (options.advance ?? true) ? i.next : i];\n    };\n}\n\nexport function atomString<T extends string>(text: T, options: TokenOptions = {}): Pattern<T> {\n    return map(atom(text, options), _t => text);\n}\n\nexport function atom(text?: string, options: TokenOptions = {}): Pattern<Token> {\n    return i => {\n        if (options.skipSpace ?? true) i = skipSpace(i);\n        if (!notAtEnd(i)) return null;\n        if (!isToken(i.item)) return null;\n        if (i.item.type !== (options.tokenType ?? TokenType.ATOM)) return null;\n        if (text !== void 0 && i.item.text !== text) return null;\n        return [i.item, (options.advance ?? true) ? i.next : i];\n    }\n}\n\nexport function anything(options: ItemOptions = {}): Pattern<Item> {\n    return i => {\n        if (options.skipSpace ?? true) i = skipSpace(i);\n        if (!notAtEnd(i)) return null;\n        return [i.item, (options.advance ?? true) ? i.next : i];\n    };\n}\n\nexport function upTo(p: Pattern<any>): Pattern<Items> {\n    return i => {\n        const acc = [];\n        while (true) {\n            const r = p(i);\n            if (r !== null) return [acc, i];\n            if (!notAtEnd(i)) break;\n            acc.push(i.item);\n            i = i.next;\n        }\n        return null;\n    };\n}\n\nexport function separatedBy<T>(itemPattern: Pattern<T>, separator: Pattern<any>): Pattern<T[]> {\n    return i => {\n        const acc: T[] = [];\n        if (end(i) !== null) return [acc, noItems(i.context)];\n        while (true) {\n            {\n                const r = itemPattern(i);\n                if (r === null) return null;\n                acc.push(r[0]);\n                i = r[1];\n            }\n            {\n                const r = separator(i);\n                if (r === null) {\n                    if (end(i) !== null) return [acc, noItems(i.context)];\n                    return null;\n                }\n                i = r[1];\n            }\n        }\n    };\n}\n\nexport function separatedOrTerminatedBy<T>(\n    itemPattern: Pattern<T>,\n    separator: Pattern<any>,\n): Pattern<T[]> {\n    return i => {\n        const acc: T[] = [];\n        if (end(i) !== null) return [acc, noItems(i.context)];\n        while (true) {\n            {\n                const r = itemPattern(i);\n                if (r === null) return null;\n                acc.push(r[0]);\n                i = r[1];\n            }\n            {\n                const r = separator(i);\n                if (r === null) {\n                    if (end(i) !== null) return [acc, noItems(i.context)];\n                    return null;\n                } else {\n                    i = r[1];\n                    if (end(i) !== null) return [acc, noItems(i.context)];\n                }\n            }\n        }\n    };\n}\n\nexport interface RepeatOptions {\n    min?: number;\n    max?: number;\n    separator?: Pattern<any>;\n}\n\nexport function repeat<T>(p: Pattern<T>, options: RepeatOptions = {}): Pattern<T[]> {\n    return i => {\n        const acc: T[] = [];\n        let needSeparator = false;\n        const finish = (): PatternResult<T[]> => (acc.length < (options.min ?? 0)) ? null : [acc, i];\n        while (true) {\n            if (acc.length == (options.max ?? Infinity)) return [acc, i];\n            if (needSeparator) {\n                if (options.separator) {\n                    const r = options.separator(i);\n                    if (r === null) return finish();\n                    i = r[1];\n                }\n            } else {\n                needSeparator = true;\n            }\n            const r = p(i);\n            if (r === null) return finish();\n            acc.push(r[0]);\n            i = r[1];\n        }\n    };\n}\n\nexport function option<T>(p: Pattern<T>): Pattern<T[]> {\n    return repeat(p, { max: 1 });\n}\n\n//---------------------------------------------------------------------------\n// Search-and-replace over Item\n\nexport function replace<T>(\n    items: Items,\n    outerContext: ItemContext,\n    p: Pattern<T>,\n    f: (t: T, start: Pos, end: Pos) => Items,\n    end: Pos = items.length > 0 ? items[items.length - 1].end : startPos(null),\n) : Items {\n    const walkItems = (items: Items, end: Pos, context: ItemContext): Items => {\n        let i: ItemList = new ArrayList(items, context);\n        const acc: Items = [];\n        while (notAtEnd(i = collectSpace(i, acc))) {\n            const r = p(i);\n\n            if (r !== null) {\n                acc.push(... f(r[0],\n                               notAtEnd(i) ? i.item.start : end,\n                               notAtEnd(r[1]) ? r[1].item.start : end));\n                i = r[1];\n            } else if (isToken(i.item)) {\n                acc.push(i.item);\n                i = i.next;\n            } else {\n                acc.push({\n                    ... i.item,\n                    items: walkItems(i.item.items, i.item.end, i.item.open.text),\n                });\n                i = i.next;\n            }\n        }\n        return acc;\n    };\n    return walkItems(items, end, outerContext);\n}\n","/// SPDX-License-Identifier: GPL-3.0-or-later\n/// SPDX-FileCopyrightText: Copyright © 2016-2025 Tony Garnock-Jones <tonyg@leastfixedpoint.com>\n\nimport { TokenType, Token, Item, GroupInProgress } from './tokens.js';\nimport { Pos, advancePos } from './position.js';\n\nexport abstract class Scanner implements IterableIterator<Token> {\n    readonly pos: Pos;\n    readonly synthetic: boolean | undefined;\n    charBuffer: string | null = null;\n    tokenBuffer: Token | null = null;\n    delimiters = ' \\t\\n\\r\\'\"`.,;()[]{}/\\\\';\n\n    constructor(pos: Pos, synthetic?: boolean) {\n        this.pos = { ... pos };\n        this.synthetic = synthetic;\n    }\n\n    [Symbol.iterator](): IterableIterator<Token> {\n        return this;\n    }\n\n    abstract _peekChar(): string | null;\n    abstract _dropChar(): void;\n\n    peekChar(): string | null {\n        if (this.charBuffer !== null) return this.charBuffer;\n        this.charBuffer = this._peekChar();\n        return this.charBuffer;\n    }\n\n    dropChar() {\n        if (this.charBuffer === null) this.peekChar();\n        if (this.charBuffer !== null) {\n            this._dropChar();\n            advancePos(this.pos, this.charBuffer);\n            this.charBuffer = null;\n        }\n    }\n\n    shiftChar(): string | null {\n        const ch = this.peekChar();\n        this.dropChar();\n        return ch;\n    }\n\n    makeToken(start: Pos, type: TokenType, text: string): Token {\n        return { type, start, end: this.mark(), text, ... this.synthetic && { synthetic: true } };\n    }\n\n    makeGroupInProgress(open: Token, items: Array<Item> = []): GroupInProgress {\n        return { start: open.start, open, close: null, items, ... this.synthetic && { synthetic: true } };\n    }\n\n    mark(): Pos {\n        return { ... this.pos };\n    }\n\n    _while(pred: (ch: string | null) => boolean, f: (ch: string | null) => void) {\n        while (true) {\n            const ch = this.peekChar();\n            if (!pred(ch)) return;\n            this.dropChar();\n            f(ch);\n        }\n    }\n\n    _collectSpace(buf = '', start = this.mark()): Token {\n        this._while(ch => ch !== null && this.isSpace(ch), ch => buf = buf + ch);\n        return this.makeToken(start, TokenType.SPACE, buf);\n    }\n\n    _punct(type: TokenType): Token {\n        return this.makeToken(this.mark(), type, this.shiftChar()!);\n    }\n\n    _str(q: string, buf: string, isTemplate: boolean): Token {\n        const start = this.mark();\n        let ch: string | null;\n        while (true) {\n            ch = this.shiftChar();\n            if (ch !== null) buf = buf + ch;\n\n            if (ch === null ||\n                ch === q ||\n                (isTemplate ? (ch === '$' && this.peekChar() === '{') : (ch === '\\n')))\n            {\n                return this.makeToken(start, TokenType.STRING, buf);\n            }\n\n            if (ch === '\\\\') {\n                ch = this.shiftChar();\n                if (ch === '\\n') {\n                    // Do nothing. Line continuation.\n                } else if (ch !== null) {\n                    buf = buf + ch;\n                }\n            }\n        }\n    }\n\n    templateConstantFragment(): Token | null {\n        if (this.tokenBuffer !== null) throw new Error(\"Internal error: templateConstantFragment\");\n        const t = this._str('`', '', true);\n        return (t.text.length === 0) ? null : t;\n    }\n\n    isSpace(ch: string): boolean {\n        return ' \\t\\r'.indexOf(ch) >= 0;\n    }\n\n    isDelimiter(ch: string): boolean {\n        return this.delimiters.indexOf(ch) >= 0;\n    }\n\n    addDelimiters(newDelimiters: string) {\n        this.delimiters = this.delimiters + newDelimiters;\n    }\n\n    _atom(start = this.mark(), buf = ''): Token {\n        let ch: string | null;\n        while (true) {\n            ch = this.peekChar();\n            if (ch === null || this.isDelimiter(ch)) {\n                return this.makeToken(start, TokenType.ATOM, buf);\n            }\n            buf = buf + ch;\n            this.dropChar();\n        }\n    }\n\n    _maybeComment(): Token {\n        const start = this.mark();\n        let buf = this.shiftChar()!;\n        let ch = this.peekChar();\n        if (ch === null) return this._collectSpace(buf, start);\n        switch (ch) {\n            case '/': // single-line comment.\n                this._while(ch => ch !== null && ch !== '\\n', ch => buf = buf + ch);\n                return this._collectSpace(buf, start);\n            case '*': // delimited comment.\n                {\n                    let seenStar = false;\n                    buf = buf + this.shiftChar();\n                    while (true) {\n                        ch = this.shiftChar();\n                        if (ch === null) break;\n                        buf = buf + ch;\n                        if ((ch === '/') && seenStar) break;\n                        seenStar = (ch === '*');\n                    }\n                    return this._collectSpace(buf, start);\n                }\n            default:\n                return this._atom(start, buf);\n        }\n    }\n\n    _peek(): Token | null {\n        let ch = this.peekChar();\n        if (ch === null) return null;\n        switch (ch) {\n            case ' ':\n            case '\\t':\n            case '\\r':\n                return this._collectSpace();\n\n            case '\\n':\n                return this._punct(TokenType.NEWLINE);\n\n            case '(':\n            case '[':\n            case '{':\n                return this._punct(TokenType.OPEN);\n            case ')':\n            case ']':\n            case '}':\n                return this._punct(TokenType.CLOSE);\n\n            case '\\'':\n            case '\"':\n                this.dropChar();\n                return this._str(ch, ch, false);\n\n            case '`':\n                this.dropChar();\n                return this._str(ch, ch, true);\n\n            case '/':\n                return this._maybeComment();\n\n            default:\n                if (this.isDelimiter(ch)) {\n                    return this._punct(TokenType.ATOM);\n                } else {\n                    return this._atom(this.mark(), this.shiftChar()!);\n                }\n        }\n    }\n\n    peek(): Token | null {\n        if (this.tokenBuffer === null) this.tokenBuffer = this._peek();\n        return this.tokenBuffer;\n    }\n\n    drop() {\n        if (this.tokenBuffer === null) this.peek();\n        this.tokenBuffer = null;\n    }\n\n    shift(): Token | null {\n        const t = this.peek();\n        this.drop();\n        return t;\n    }\n\n    next(): IteratorResult<Token> {\n        const t = this.shift();\n        if (t === null) {\n            return { done: true, value: null };\n        } else {\n            return { done: false, value: t };\n        }\n    }\n}\n\nexport class StringScanner extends Scanner {\n    readonly input: string;\n    index: number;\n\n    constructor(pos: Pos, input: string, synthetic?: boolean) {\n        super(pos, synthetic);\n        this.input = input;\n        this.index = 0;\n    }\n\n    _peekChar(): string | null {\n        return this.input[this.index] ?? null;\n    }\n\n    _dropChar(): void {\n        this.index++;\n    }\n}\n","/// SPDX-License-Identifier: GPL-3.0-or-later\n/// SPDX-FileCopyrightText: Copyright © 2016-2025 Tony Garnock-Jones <tonyg@leastfixedpoint.com>\n\nimport { TokenType, Token, Group, GroupInProgress, Item, Items, finishGroup } from './tokens.js';\nimport { Pos, startPos } from './position.js';\nimport { Scanner, StringScanner } from './scanner.js';\n\nfunction matchingParen(c: string): string | null {\n    switch (c) {\n        case ')': return '(';\n        case ']': return '[';\n        case '}': return '{';\n        default: return null;\n    }\n}\n\nexport class LaxReader implements IterableIterator<Item> {\n    readonly scanner: Scanner;\n    readonly stack: Array<GroupInProgress> = [];\n\n    constructor(scanner: Scanner) {\n        this.scanner = scanner;\n    }\n\n    [Symbol.iterator](): IterableIterator<Item> {\n        return this;\n    }\n\n    stackTop(): GroupInProgress | null {\n        return this.stack[this.stack.length - 1] ?? null;\n    }\n\n    popUntilMatch(t: Token): Group | 'continue' | 'eof' {\n        const m = matchingParen(t.text);\n\n        if (m !== null && !this.stack.some(g => g.open.text === m)) {\n            if (this.stack.length > 0) {\n                this.stackTop()!.items.push(t);\n                return 'continue';\n            }\n        } else {\n            while (this.stack.length > 0) {\n                const inner = finishGroup(this.stack.pop()!, t.end);\n                if (inner.open.text === m) {\n                    inner.close = t;\n                }\n\n                if (this.stack.length === 0) {\n                    return inner;\n                } else {\n                    const outer = this.stackTop()!;\n                    outer.items.push(inner);\n                    if (inner.open.text === m) {\n                        return 'continue';\n                    }\n                }\n            }\n        }\n\n        return 'eof';\n    }\n\n    _eofClose(): Token {\n        return this.scanner.makeToken(this.scanner.mark(), TokenType.CLOSE, '');\n    }\n\n    peek(): Token {\n        return this.scanner.peek() ?? this._eofClose();\n    }\n\n    drop() {\n        this.scanner.drop();\n    }\n\n    inTemplateString(): boolean {\n        const i = this.stackTop();\n        return (i !== null) && (i.open.text[0] === '`');\n    }\n\n    expectTemplateVariablePart() {\n        const variablePartOpen = this.peek();\n        if (variablePartOpen.type !== TokenType.OPEN || variablePartOpen.text !== '{')\n        {\n            throw new Error(\"Internal parser error: template string variable part mismatch\");\n        }\n        this.drop();\n        this.stack.push(this.scanner.makeGroupInProgress(variablePartOpen));\n    }\n\n    read(): Item | null {\n        while (true) {\n            if (this.inTemplateString()) {\n                const t = this.scanner.templateConstantFragment() ?? this._eofClose();\n                switch (t.type) {\n                    case TokenType.CLOSE: // always means eof, in this case\n                        return this.popUntilMatch(t) as Group; // will always be a Group\n                    case TokenType.STRING:\n                        if (t.text[t.text.length - 1] === '`') {\n                            const inner = finishGroup(this.stack.pop()!, t.end);\n                            inner.close = t;\n                            if (this.stack.length === 0) {\n                                return inner;\n                            } else {\n                                this.stackTop()!.items.push(inner);\n                                break;\n                            }\n                        } else {\n                            // Another unclosed fragment. Expect {...} again.\n                            this.stackTop()!.items.push(t);\n                            this.expectTemplateVariablePart();\n                            break;\n                        }\n                    default:\n                        throw new Error(\"Internal error: LaxReader.read()\");\n                }\n            } else {\n                let g = this.stackTop();\n                const t = this.peek();\n                switch (t.type) {\n                    case TokenType.STRING:\n                        if (t.text[0] === '`' && t.text[t.text.length - 1] !== '`') {\n                            // Unclosed template string - so expect {...} followed by more\n                            // fragments. Encode this as a group with opener the first constant\n                            // template fragment and closer the last template fragment.\n                            this.drop();\n                            this.stack.push(this.scanner.makeGroupInProgress(t));\n                            // We know, from the implementation of the scanner, that the current\n                            // character is '{'.\n                            this.expectTemplateVariablePart();\n                            break;\n                        } else {\n                            // fall through\n                        }\n                    case TokenType.SPACE:\n                    case TokenType.NEWLINE:\n                    case TokenType.ATOM:\n                        this.drop();\n                        if (g === null) {\n                            return t;\n                        }\n                        g.items.push(t);\n                        break;\n\n                    case TokenType.OPEN:\n                        this.drop();\n                        this.stack.push(this.scanner.makeGroupInProgress(t));\n                        break;\n\n                    case TokenType.CLOSE: {\n                        this.drop();\n                        const i = this.popUntilMatch(t);\n                        if (i === 'eof') return null;\n                        if (i === 'continue') break;\n                        return i;\n                    }\n                }\n            }\n        }\n    }\n\n    readToEnd(): Items {\n        return Array.from(this);\n    }\n\n    next(): IteratorResult<Item> {\n        const i = this.read();\n        if (i === null) {\n            return { done: true, value: null };\n        } else {\n            return { done: false, value: i };\n        }\n    }\n}\n\nexport interface LaxReadOptions {\n    start?: Pos,\n    name?: string,\n    extraDelimiters?: string,\n    synthetic?: boolean,\n}\n\nexport function laxRead(source: string, options: LaxReadOptions = {}): Items {\n    const start = options.start ?? startPos(options.name ?? null);\n    const scanner = new StringScanner(start, source, options.synthetic);\n    if (options.extraDelimiters) scanner.addDelimiters(options.extraDelimiters);\n    const reader = new LaxReader(scanner);\n    return reader.readToEnd();\n}\n","/// SPDX-License-Identifier: GPL-3.0-or-later\n/// SPDX-FileCopyrightText: Copyright © 2016-2025 Tony Garnock-Jones <tonyg@leastfixedpoint.com>\n\nimport { Items } from './tokens.js';\nimport { Pos, startPos } from './position.js';\nimport { laxRead, LaxReadOptions } from './reader.js';\nimport * as M from './matcher.js';\n\nconst substPat = M.scope((o: { pos: Pos }) =>\n    M.seq(M.atom('$'),\n          M.seq(M.bind(o, 'pos', M.pos), M.group('{', M.end, { skipSpace: false }))));\n\nexport type Substitution = Items | string;\n\nfunction toItems(readOptions: LaxReadOptions, s: Substitution, pos: Pos): Items {\n    return typeof s === 'string' ? laxRead(s, { ... readOptions, start: pos, synthetic: true }) : s;\n}\n\nexport type TemplateFunction = (consts: TemplateStringsArray, ... vars: Substitution[]) => Items;\n\nexport class Templates {\n    readonly sources: { [name: string]: string } = {};\n    readonly defaultPos: Pos;\n    recordSources = false;\n    readonly readOptions: LaxReadOptions;\n\n    constructor(defaultPos: Pos = startPos(null), readOptions: LaxReadOptions = {}) {\n        this.defaultPos = defaultPos;\n        this.readOptions = readOptions;\n    }\n\n    template(start0: Pos | string = this.defaultPos, context: M.ItemContext = null): TemplateFunction {\n        const start = (typeof start0 === 'string') ? startPos(start0) : start0;\n        return (consts, ... vars) => {\n            const sourcePieces = [consts[0]];\n            for (let i = 1; i < consts.length; i++) {\n                sourcePieces.push('${}');\n                sourcePieces.push(consts[i]);\n            }\n            const source = sourcePieces.join('');\n            if (this.recordSources) {\n                if (start.name !== null) {\n                    if (start.name in this.sources && this.sources[start.name] !== source) {\n                        throw new Error(`Duplicate template name: ${start.name}`);\n                    }\n                    this.sources[start.name] = source;\n                }\n            }\n            let i = 0;\n            return M.replace(laxRead(source, { ... this.readOptions,\n                                               start,\n                                               extraDelimiters:\n                                                 (this.readOptions.extraDelimiters ?? '') + '$',\n                                               synthetic: true,\n                                             }),\n                             context,\n                             substPat,\n                             sub => toItems(this.readOptions, vars[i++], sub.pos));\n        };\n    }\n\n    sourceFor(name: string): string | undefined {\n        return this.sources[name];\n    }\n}\n\nexport function joinItems(itemss: Items[],\n                          separator0: Substitution = '',\n                          readOptions: LaxReadOptions = {}): Items\n{\n    if (itemss.length === 0) return [];\n    const separator = toItems(readOptions, separator0, startPos(null));\n    const acc: Items = [... itemss[0]];\n    for (let i = 1; i < itemss.length; i++) {\n        acc.push(... separator, ... itemss[i]);\n    }\n    return acc;\n}\n\nexport function commaJoin(itemss: Items[]): Items {\n    return joinItems(itemss, ', ');\n}\n\nexport const anonymousTemplate = (new Templates()).template();\n\n// const lib = new Templates();\n// const t = (o: {xs: Items}) => lib.template('testTemplate')`YOYOYOYO ${o.xs}><`;\n// console.log(t({xs: lib.template()`hello there`}));\n","/// SPDX-License-Identifier: GPL-3.0-or-later\n/// SPDX-FileCopyrightText: Copyright © 2016-2025 Tony Garnock-Jones <tonyg@leastfixedpoint.com>\n\nimport {\n    Token, Items, TokenBase, TokenType, Pos,\n    Pattern,\n    foldItems, match, anonymousTemplate as template, commaJoin,\n    advancePos,\n\n    scope, bind, seq, seqTuple, alt, upTo, atom, atomString, group,\n    repeat, option, withoutSpace, map, mapm, rest, discard,\n    value, succeed, fail, separatedOrTerminatedBy, not,\n} from '../syntax/index.js';\nimport * as Matcher from '../syntax/matcher.js';\n\n//---------------------------------------------------------------------------\n// AST types\n\nexport type Expr = Items;\nexport type Statement = Items;\nexport type Identifier = Token;\nexport type Type = Items;\nexport type Binder = { id: Identifier, type?: Type };\n\nexport interface TurnAction {\n}\n\nexport interface FacetSetupAction extends TurnAction {\n    body: Statement;\n}\n\nexport interface SpawnStatement extends FacetSetupAction {\n    name?: Expr;\n    linkedToken: TokenBase | null;\n    parentBinders: Binder[];\n    parentInits: Expr[];\n}\n\nexport interface FieldDeclarationStatement extends TurnAction {\n    field: Binder;\n    init?: Expr;\n}\n\nexport interface AssertionEndpointStatement extends TurnAction {\n    isDynamic: boolean,\n    template: Expr,\n    test?: Expr,\n}\n\nexport interface StatementTurnAction extends TurnAction {\n    body: Statement;\n}\n\nexport type FacetToStop = 'default' | Expr;\n\nexport interface StopStatement extends StatementTurnAction {\n    facetToStop: FacetToStop;\n}\n\nexport interface SyncStatement extends StatementTurnAction {\n    peerToSyncWith: Expr;\n}\n\nexport interface GenericEventEndpointStatement extends StatementTurnAction {\n    facetToStop: FacetToStop | 'none' | 'once-wrapper';\n    once: boolean;\n    isDynamic: boolean;\n}\n\nexport interface DataflowEndpointStatement extends GenericEventEndpointStatement {\n    triggerType: 'dataflow';\n    predicate: Expr;\n}\n\nexport interface PseudoEventEndpointStatement extends GenericEventEndpointStatement {\n    triggerType: 'stop';\n}\n\nexport interface AssertionEventEndpointStatement extends GenericEventEndpointStatement {\n    triggerType: 'asserted' | 'retracted' | 'message';\n    pattern: ValuePattern;\n    test?: Expr,\n}\n\nexport type EventHandlerEndpointStatement =\n    DataflowEndpointStatement | PseudoEventEndpointStatement | AssertionEventEndpointStatement;\n\nexport interface TypeDefinitionStatement {\n    expectedUse: 'message' | 'assertion';\n    label: Identifier;\n    fields: Binder[];\n    wireName?: Expr;\n}\n\nexport interface MessageSendStatement extends TurnAction {\n    expr: Expr;\n}\n\nexport interface DuringStatement extends FacetSetupAction {\n    pattern: ValuePattern;\n    test?: Expr,\n}\n\nexport interface ReactStatement extends FacetSetupAction {\n    label: Identifier | null;\n}\n\nexport interface AtStatement {\n    target: Expr;\n    body: Statement;\n}\n\nexport interface CreateExpression {\n    entity: Expr;\n}\n\n//---------------------------------------------------------------------------\n// Value pattern AST types\n\nexport interface PCapture {\n    type: 'PCapture',\n    binder: Binder,\n    inner: ValuePattern,\n}\n\nexport interface PDiscard {\n    type: 'PDiscard',\n}\n\nexport interface PConstant {\n    type: 'PConstant',\n    value: Expr,\n}\n\nexport interface PConstructor {\n    type: 'PConstructor',\n    ctor: Expr,\n    arguments: ValuePattern[],\n}\n\nexport interface PArray {\n    type: 'PArray',\n    elements: ValuePattern[],\n}\n\nexport interface PDict {\n    type: 'PDict',\n    elements: [Expr, ValuePattern][],\n}\n\nexport interface PUnquote {\n    type: 'PUnquote',\n    unquoted: ValuePattern,\n}\n\nexport interface POuterUnquote {\n    type: 'POuterUnquote',\n    outer: Expr,\n};\n\nexport interface PQuote {\n    type: 'PQuote',\n    quoted: ValuePattern,\n}\n\nexport type ValuePattern =\n    | PCapture | PDiscard\n    | PConstant\n    | PConstructor | PArray | PDict\n    | PUnquote | POuterUnquote | PQuote\n;\n\nexport interface StaticAnalysis {\n    skeleton: Expr; // constructs a P.Pattern\n    captureBinders: Binder[];\n}\n\n//---------------------------------------------------------------------------\n// Parsers\n\nfunction kw(text: string): Pattern<Token> {\n    return value(o => seq(atom(':'), bind(o, 'value', atom(text, { skipSpace: false }))));\n}\n\nconst DOUBLE_QUOTE = template`\"`;\n\nexport class SyndicateParser {\n    block(acc?: Items): Pattern<Items> {\n        return group('{', map(rest, items => (acc?.push(... items), items)));\n    }\n\n    readonly statementBoundary = alt<any>(\n        atom(';'),\n        Matcher.newline,\n        seq(Matcher.end, i => {\n            if (i.context === null || i.context === '{') return discard(i);\n            // ^ toplevel, or inside braces, so presumably statement context\n            return fail(i); // otherwise, parens or brackets presumably, so not statement context\n        }),\n    );\n    readonly exprBoundary = alt<any>(atom(';'), atom(','), group('{', discard), Matcher.end);\n\n    readonly identifier: Pattern<Identifier> = atom();\n    binder(... _extraStops: Pattern<any>[]): Pattern<Binder> { return scope(o => bind(o, 'id', this.identifier)); }\n    readonly defaultBinder = this.binder();\n\n    expr(... extraStops: Pattern<any>[]): Pattern<Expr> {\n        return withoutSpace(upTo(alt(this.exprBoundary, ... extraStops)));\n    }\n\n    expr1(... extraStops: Pattern<any>[]): Pattern<Expr> {\n        return mapm(this.expr(... extraStops), e => e.length ? succeed(e) : fail);\n    }\n\n    propertyNameExpr(): Pattern<Expr> {\n        return alt<Expr>(\n            map(atom(), name => [... DOUBLE_QUOTE, name, ... DOUBLE_QUOTE]),\n            map(atom(void 0, { tokenType: TokenType.STRING }), str => [str]),\n            group('[', this.expr()));\n    }\n\n    readonly type: (... extraStops: Pattern<any>[]) => Pattern<Type> = this.expr;\n\n    statement(acc: Items): Pattern<any> {\n        return alt<any>(this.block(acc),\n                        withoutSpace(seq(map(upTo(this.statementBoundary),\n                                             items => acc.push(... items)),\n                                         map(this.statementBoundary,\n                                             i => i ? acc.push(i) : void 0))));\n    }\n\n    turnAction<T extends TurnAction>(pattern: (scope: T) => Pattern<any>): Pattern<T> {\n        return i => {\n            const scope = Object.create(null);\n            const p = pattern(scope);\n            const r = p(i);\n            if (r === null) return null;\n            return [scope, r[1]];\n        };\n    }\n\n    readonly headerExpr = this.expr(kw('asserting'), kw('let'));\n\n    // Principal: Turn\n    readonly spawn: Pattern<SpawnStatement> =\n        this.turnAction(o => {\n            o.linkedToken = null;\n            o.parentBinders = [];\n            o.parentInits = [];\n            o.body = [];\n            return seq(atom('spawn'),\n                       option(map(atom('linked'), tok => o.linkedToken = tok)),\n                       option(seq(atom('named'), bind(o, 'name', this.headerExpr))),\n                       repeat(alt(\n                           /* seq(kw('asserting'), map(this.headerExpr, e => o.initialAssertions.push(e))), */\n                           map(scope(\n                               (l: { b: Binder, init: Expr }) =>\n                                   seq(kw('let'),\n                                       bind(l, 'b', this.defaultBinder),\n                                       atom('='),\n                                       bind(l, 'init', this.headerExpr))),\n                               l => {\n                                   o.parentBinders.push(l.b);\n                                   o.parentInits.push(l.init);\n                               }))),\n                       this.block(o.body));\n        });\n\n    // Principal: Turn\n    readonly fieldDeclarationStatement: Pattern<FieldDeclarationStatement> =\n        this.turnAction(o => {\n            return seq(atom('field'),\n                       bind(o, 'field', this.defaultBinder),\n                       option(seq(atom('='), bind(o, 'init', this.expr()))),\n                       this.statementBoundary);\n        });\n\n    // Principal: Turn\n    readonly assertionEndpointStatement: Pattern<AssertionEndpointStatement> =\n        this.turnAction(o => {\n            o.isDynamic = true;\n            return seq(atom('assert'),\n                       option(map(kw('snapshot'), _ => o.isDynamic = false)),\n                       bind(o, 'template', this.expr(seq(atom('when'), group('(', discard)))),\n                       option(seq(atom('when'), group('(', bind(o, 'test', this.expr())))),\n                       this.statementBoundary);\n        });\n\n    blockTurnAction(kw: Pattern<any>): Pattern<StatementTurnAction> {\n        return this.turnAction(o => {\n            o.body = [];\n            return seq(kw, this.block(o.body));\n        });\n    }\n\n    // Principal: Turn\n    readonly dataflowStatement = this.blockTurnAction(atom('dataflow'));\n\n    // Expects o to parse something statement-like.\n    mandatoryIfNotTerminal(o: GenericEventEndpointStatement, p: Pattern<any>): Pattern<any> {\n        return i => {\n            return (o.facetToStop !== 'none') ? alt(p, this.statementBoundary)(i) : p(i);\n        };\n    }\n\n    // Principal: Turn\n    readonly eventHandlerEndpointStatement: Pattern<EventHandlerEndpointStatement> =\n        this.turnAction(o => {\n            o.facetToStop = 'none';\n            o.once = false;\n            o.isDynamic = true;\n            o.body = [];\n            return seq(alt(seq(option(seq(atom('stop'),\n                                          map(option(this.expr1(atom('on'))), es => {\n                                              o.facetToStop = es.length ? es[0] : 'default';\n                                          }))),\n                               atom('on')),\n                           map(atom('once'), _ => {\n                               o.once = true;\n                               o.facetToStop = 'once-wrapper';\n                           })),\n                       alt<any>(seq(map(group('(', bind(o as DataflowEndpointStatement, 'predicate',\n                                                        this.expr())),\n                                        _ => o.triggerType = 'dataflow'),\n                                    this.mandatoryIfNotTerminal(o, this.statement(o.body))),\n                                mapm(seq(bind(o, 'triggerType', atomString('stop')),\n                                         option(this.statement(o.body))),\n                                     v => ((o.facetToStop !== 'none') || o.once) ? fail : succeed(v)),\n                                seq(bind(o, 'triggerType',\n                                         alt(atomString('asserted'),\n                                             atomString('retracted'),\n                                             atomString('message'))),\n                                    option(map(kw('snapshot'), _ => o.isDynamic = false)),\n                                    bind(o as AssertionEventEndpointStatement, 'pattern',\n                                         this.valuePattern(1, atom('=>'),\n                                                           seq(atom('when'), group('(', discard)))),\n                                    option(seq(atom('when'), group(\n                                        '(', bind(o as AssertionEventEndpointStatement, 'test',\n                                                  this.expr())))),\n                                    this.mandatoryIfNotTerminal(\n                                        o, seq(atom('=>'), this.statement(o.body))))));\n        });\n\n    // Principal: none\n    readonly typeDefinitionStatement: Pattern<TypeDefinitionStatement> =\n        scope(o => seq(bind(o, 'expectedUse', alt(atomString('message'), atomString('assertion'))),\n                       atom('type'),\n                       bind(o, 'label', this.identifier),\n                       group('(', bind(o, 'fields', repeat(this.defaultBinder, { separator: atom(',') }))),\n                       option(seq(atom('='),\n                                  bind(o, 'wireName', withoutSpace(upTo(this.statementBoundary))))),\n                       this.statementBoundary));\n\n    // Principal: Turn\n    readonly messageSendStatement: Pattern<MessageSendStatement> =\n        this.turnAction(o => seq(atom('send'),\n                                  atom('message'),\n                                  not(this.statementBoundary),\n                                  bind(o, 'expr', withoutSpace(upTo(this.statementBoundary))),\n                                  this.statementBoundary));\n\n    // Principal: Turn\n    readonly duringStatement: Pattern<DuringStatement> =\n        this.turnAction(o => {\n            o.body = [];\n            return seq(atom('during'),\n                       bind(o, 'pattern',\n                            this.valuePattern(1, atom('=>'), seq(atom('when'), group('(', discard)))),\n                       option(seq(atom('when'), group('(', bind(o, 'test', this.expr())))),\n                       seq(atom('=>'), this.statement(o.body)));\n        });\n\n    // Principal: Turn\n    readonly reactStatement: Pattern<ReactStatement> =\n        this.turnAction(o => {\n            o.label = null;\n            o.body = [];\n            return seq(option(map(seqTuple(this.identifier, atom(':')),\n                                  ([i, _colon]) => o.label = i)),\n                       atom('react'),\n                       this.block(o.body));\n        });\n\n    // Principal: Turn\n    readonly stopStatement: Pattern<StopStatement> =\n        this.turnAction(o => {\n            o.facetToStop = 'default';\n            o.body = [];\n            return seq(atom('stop'),\n                       option(map(this.expr1(), e => o.facetToStop = e)),\n                       alt(this.block(o.body), this.statementBoundary));\n        });\n\n    // Principal: Turn\n    readonly syncStatement: Pattern<SyncStatement> =\n        this.turnAction(o => {\n            o.body = [];\n            return seq(atom('sync'),\n                       map(this.expr1(), e => o.peerToSyncWith = e),\n                       this.block(o.body));\n        });\n\n    // Principal: none\n    readonly atStatement: Pattern<AtStatement> =\n        scope(o => {\n            o.body = [];\n            return seq(atom('at'),\n                       bind(o, 'target', this.expr()),\n                       this.block(o.body));\n        });\n\n    // Principal: none\n    readonly createExpression: Pattern<CreateExpression> =\n        scope(o => seq(atom('create'), bind(o, 'entity', this.expr())));\n\n    //---------------------------------------------------------------------------\n    // Syntax of patterns over Value, used in endpoints\n\n    // $id - capture of discard\n    // _ - discard\n    //\n    // expr(pat, ...) - record ctor\n    // $id(pat) - nested capture\n    // [pat, ...] - array pat\n    // {expr: pat, ...} - dict pat\n    //\n    // expr(expr, ...) - constant\n    // [expr, ...] - constant\n    // {expr: expr, ...} - constant\n    // other - constant\n\n    pCaptureBinder = (b: Pattern<Binder>): Pattern<Binder> =>\n        mapm(b, i => {\n            if (i.id.text.startsWith('$')) {\n                const adjustedStart: Pos = { ... i.id.start };\n                advancePos(adjustedStart, ' ');\n                const adjustedId: Token = {\n                    ... i.id,\n                    start: adjustedStart,\n                    text: i.id.text.slice(1),\n                };\n                return succeed({ id: adjustedId, type: i.type });\n            } else {\n                return fail;\n            }\n        });\n    readonly pCaptureDefaultBinder = this.pCaptureBinder(this.defaultBinder);\n\n    readonly pDiscard: Pattern<void> =\n        mapm(this.identifier, i => i.text === '_' ? succeed(void 0) : fail);\n\n    pUnquote(level: number, extraStops: Pattern<any>[]): Pattern<PUnquote | POuterUnquote> {\n        if (level == 1) {\n            return scope<POuterUnquote>(o => {\n                o.type = 'POuterUnquote';\n                return seq(atom('\\\\'), bind(o, 'outer', this.expr(... extraStops)));\n            });\n        } else {\n            return scope<PUnquote>(o => {\n                o.type = 'PUnquote';\n                return seq(atom('\\\\'), bind(o, 'unquoted', this.valuePattern(level - 1, ... extraStops)));\n            });\n        }\n    }\n\n    pQuote(level: number, extraStops: Pattern<any>[]): Pattern<PQuote> {\n        return scope(o => {\n            o.type = 'PQuote';\n            return seq(kw('pattern'), bind(o, 'quoted', this.valuePattern(level + 1, ... extraStops)));\n        });\n    }\n\n    hasCapturesOrDiscards(e: Expr): boolean {\n        return foldItems(e,\n                         t => match(alt<any>(this.pCaptureDefaultBinder, this.pDiscard), [t], null, '(') !== null,\n                         (_g, b, _k) => b,\n                         bs => bs.some(b => b));\n    }\n\n    pArray(level: number): Pattern<PArray> {\n        return scope(o => {\n            o.type = 'PArray';\n            return group(\n                '[', mapm(bind(o, 'elements',\n                               separatedOrTerminatedBy(this.valuePattern(level), atom(','))),\n                          v => (o.elements.every(p => p.type === 'PConstant') ? fail : succeed(v))));\n        });\n    }\n\n    pDict(level: number): Pattern<PDict> {\n        return scope(o => {\n            o.type = 'PDict';\n            return group(\n                '{', mapm(bind(o,\n                               'elements',\n                               separatedOrTerminatedBy(\n                                   value<[Expr, ValuePattern]>(e => {\n                                       e.value = [] as any;\n                                       return alt(\n                                           seq(\n                                               bind(e.value, '0', this.propertyNameExpr()),\n                                               atom(':'),\n                                               bind(e.value, '1', this.valuePattern(level))),\n                                           map(atom(), name => {\n                                               e.value = [\n                                                   [... DOUBLE_QUOTE, name, ... DOUBLE_QUOTE],\n                                                   { type: 'PConstant', value: [name] },\n                                               ];\n                                           }),\n                                       );\n                                   }),\n                                   atom(','))),\n                          v => (o.elements.every(e => e[1].type === 'PConstant') ? fail : succeed(v))));\n        });\n    }\n\n    pConstructor(level: number, extraStops: Pattern<any>[]): Pattern<PConstructor> {\n        return scope(o => {\n            o.type = 'PConstructor';\n            return seq(bind(o, 'ctor', this.expr(... extraStops, group('(', discard))),\n                       // map(anything({ advance: false }), g => o.argumentGroup = g),\n                       group('(', bind(o, 'arguments',\n                                       separatedOrTerminatedBy(\n                                           this.valuePattern(level, ... extraStops),\n                                           atom(',')))));\n        });\n    }\n\n    valuePattern(level: number, ... extraStops: Pattern<any>[]): Pattern<ValuePattern> {\n        return withoutSpace(alt<ValuePattern>(\n            scope(o => map(this.pDiscard, _ => o.type = 'PDiscard')),\n            this.pArray(level),\n            this.pDict(level),\n            this.pQuote(level, extraStops),\n            this.pUnquote(level, extraStops),\n            mapm<PConstructor, PConstant | PCapture | PConstructor>(\n                this.pConstructor(level, extraStops),\n                o => {\n                    // if (o.arguments.every(a => a.type === 'PConstant')) {\n                    //     return succeed({\n                    //         type: 'PConstant',\n                    //         value: [... o.ctor, o.argumentGroup],\n                    //     });\n                    // } else\n                    if (this.hasCapturesOrDiscards(o.ctor)) {\n                        const r = match(this.pCaptureDefaultBinder, o.ctor, null, '(');\n                        if (r !== null && o.arguments.length === 1) {\n                            return succeed({\n                                type: 'PCapture',\n                                inner: o.arguments[0],\n                                binder: r\n                            });\n                        } else {\n                            return fail;\n                        }\n                    } else {\n                        return succeed(o);\n                    }\n                }),\n            scope<PCapture>(o => {\n                o.type = 'PCapture';\n                o.inner = { type: 'PDiscard' };\n                return bind(o, 'binder', this.pCaptureBinder(this.binder(... extraStops)));\n            }),\n            map(this.expr(... extraStops), e => ({ type: 'PConstant', value: e }))\n        ));\n    }\n}\n\nexport class SyndicateTypedParser extends SyndicateParser {\n    binder(... extraStops: Pattern<any>[]): Pattern<Binder> {\n        return scope(o => seq(bind(o, 'id', this.identifier),\n                              option(seq(atom(':'),\n                                         bind(o, 'type', this.type(atom('='), ... extraStops))))));\n    }\n}\n\n//---------------------------------------------------------------------------\n// Value pattern utilities\n\nexport function compilePattern(pattern: ValuePattern): StaticAnalysis {\n    const captureBinders: Binder[] = [];\n\n    function walk(pattern: ValuePattern): Expr {\n        switch (pattern.type) {\n            case 'PDiscard':\n                return template`(__SYNDICATE__.QuasiValue._)`;\n            case 'PCapture': {\n                captureBinders.push(pattern.binder);\n                return template`(__SYNDICATE__.QuasiValue.bind(${walk(pattern.inner)}))`;\n            }\n            case 'PConstant':\n                return template`(__SYNDICATE__.QuasiValue.litFromJS(${pattern.value}))`;\n            case 'PConstructor': {\n                const pieces = [template`${pattern.ctor}`, ... pattern.arguments.map(walk)];\n                return template`(__SYNDICATE__.QuasiValue.ctor(${commaJoin(pieces)}))`;\n            }\n            case 'PArray': {\n                const pieces = pattern.elements.map(walk);\n                return template`(__SYNDICATE__.QuasiValue.arr(${commaJoin(pieces)}))`;\n            }\n            case 'PDict': {\n                const pieces = pattern.elements.map(([k, v]) => template`[${k}, ${walk(v)}]`);\n                return template`(__SYNDICATE__.QuasiValue.dict(${commaJoin(pieces)}))`;\n            }\n            case 'PQuote':\n                return template`(__SYNDICATE__.QuasiValue.quote(${walk(pattern.quoted)}))`;\n            case 'PUnquote':\n                return template`(__SYNDICATE__.QuasiValue.unquote(${walk(pattern.unquoted)}))`;\n            case 'POuterUnquote':\n                return template`(__SYNDICATE__.QuasiValue.unquote(${pattern.outer}))`;\n        }\n    }\n\n    const skeleton = walk(pattern);\n\n    return {\n        skeleton,\n        captureBinders,\n    };\n}\n","/// SPDX-License-Identifier: GPL-3.0-or-later\n/// SPDX-FileCopyrightText: Copyright © 2016-2025 Tony Garnock-Jones <tonyg@leastfixedpoint.com>\n\nimport {\n    isToken, isTokenType, replace, commaJoin, startPos, fixPos, joinItems,\n    laxRead, itemText,\n\n    Items, Pattern, Templates, Substitution, TokenType,\n    SourceMap, CodeWriter, TemplateFunction, Token, SpanIndex, match, TokenBase, getRange, Pos,\n} from '../syntax/index.js';\nimport {\n    SyndicateParser, SyndicateTypedParser,\n    Identifier,\n    TurnAction,\n    Statement,\n    Binder,\n\n    compilePattern,\n    SpawnStatement,\n    FacetToStop,\n} from './grammar.js';\n\nexport function stripShebang(items: Items): Items {\n    if ((items.length > 0) &&\n        isToken(items[0]) &&\n        items[0].text.startsWith('#!')) {\n        while (items.length > 0 && !isTokenType(items[0], TokenType.NEWLINE)) items.shift();\n    }\n    return items;\n}\n\nexport type ModuleType = 'es6' | 'require' | 'global' | 'none';\n\nexport type ErrorSink = (message: string, start: Pos | undefined, end: Pos | undefined) => void;\n\nexport interface CompileOptions {\n    source: string,\n    name?: string,\n    runtime?: string,\n    module?: ModuleType,\n    typescript?: boolean,\n    emitError: ErrorSink,\n}\n\nexport interface CompilerOutput {\n    text: string,\n    map: SourceMap,\n    targetToSourceMap: SpanIndex<Token>;\n    sourceToTargetMap: SpanIndex<number>;\n}\n\nexport class ExpansionContext {\n    readonly parser: SyndicateParser;\n    readonly moduleType: ModuleType;\n    readonly typescript: boolean;\n    readonly errorEmitter: ErrorSink;\n    nextIdNumber = 0;\n\n    constructor(moduleType: ModuleType,\n                typescript: boolean,\n                errorEmitter: ErrorSink)\n    {\n        this.parser = typescript ? new SyndicateTypedParser : new SyndicateParser();\n        this.moduleType = moduleType;\n        this.typescript = typescript;\n        this.errorEmitter = errorEmitter;\n    }\n\n    quasiRandomId(): string {\n        return '__SYNDICATE__id_' + (this.nextIdNumber++);\n    }\n\n    argDecl(t: TemplateFunction, name: Substitution, type: Substitution): Items {\n        return (this.typescript) ? t`${name}: ${type}` : t`${name}`;\n    }\n\n    emitError(m: string, loc: TokenBase) {\n        this.errorEmitter(m, loc.start, loc.end);\n    }\n}\n\nfunction stringifyId(i: Identifier): Items {\n    return [ { ... i, type: TokenType.STRING, text: JSON.stringify(i.text) } ];\n}\n\nfunction binderTypeGuard(t: TemplateFunction): (binder: Binder, index: number) => Items {\n    return (binder, index) => {\n        if (binder.id.text[0] === '_') {\n            return t`${`/* Ignoring underscore-prefixed binder ${binder.id.text} */`}`;\n        }\n\n        const raw = t`__vs[${''+index}]`;\n        const bind = t`const ${[binder.id]} = ${raw};`;\n        if (binder.type === void 0) {\n            return bind;\n        } else {\n            const typeText = itemText(binder.type);\n            switch (typeText) {\n                case 'boolean':\n                case 'string':\n                case 'number':\n                case 'symbol':\n                    return t`if (typeof (${raw}) !== ${JSON.stringify(typeText)}) return;\\n${bind}`;\n                case 'any':\n                    return bind;\n                default: {\n                    const intermediate = t`__v_${''+index}`;\n                    return t`const ${intermediate} = ${binder.type}.__from_preserve__(${raw});\n                             if (${intermediate} === void 0) return;\n                             const ${[binder.id]} = ${intermediate};`;\n                }\n            }\n        }\n    };\n}\n\nexport function expand(tree: Items, ctx: ExpansionContext): Items {\n    const macro = new Templates(undefined, { extraDelimiters: ':' });\n\n    function terminalWrap(\n        t: TemplateFunction,\n        facetToStop: FacetToStop | 'none' | 'once-wrapper',\n        body: Statement,\n    ): Statement {\n        if (facetToStop === 'none') {\n            return walk(body);\n        } else {\n            const toStop =\n                facetToStop === 'default' ? 'currentSyndicateFacet' :\n                facetToStop === 'once-wrapper' ? '__once_facet' :\n                walk(facetToStop);\n            const resetCurrentSyndicateFacet =\n                facetToStop === 'once-wrapper' ? [] :\n                t`const currentSyndicateFacet = __SYNDICATE__.Turn.activeFacet;`;\n            return t`__SYNDICATE__.Turn.active._stop(${toStop}, () => {${resetCurrentSyndicateFacet}${walk(body)}})`;\n        }\n    }\n\n    function facetWrap(\n        t: TemplateFunction,\n        facetName: Identifier | 'default' | 'once-wrapper',\n        items: Items,\n    ): Items {\n        if (facetName === 'once-wrapper') {\n            return t`__SYNDICATE__.Turn.active.facet(() => {const __once_facet = __SYNDICATE__.Turn.activeFacet; ${items}});`;\n        } else {\n            const defaultLabel = t`const currentSyndicateFacet = __SYNDICATE__.Turn.activeFacet; `;\n            const customLabel = facetName === 'default'\n                ? []\n                : t`const ${facetName.text} = currentSyndicateFacet; `;\n            return t`__SYNDICATE__.Turn.active.facet(() => {${defaultLabel}${customLabel}${items}});`;\n        }\n    }\n\n    function x<T>(p: Pattern<T>, f: (v: T, t: TemplateFunction) => Items) {\n        tree = replace(tree, null, p, (v, start) => f(v, macro.template(fixPos(start))));\n    }\n\n    function xf<T extends TurnAction>(p: Pattern<T>, f: (v: T, t: TemplateFunction) => Items) {\n        x(p, (v, t) => t`__SYNDICATE__.Turn.active.${f(v, t)}`);\n    }\n\n    const walk = (tree: Items): Items => expand(tree, ctx);\n    const maybeWalk = (tree?: Items) : Items | undefined => (tree === void 0) ? tree : walk(tree);\n\n    // Unfortunately, because of the incredibly naive repeated\n    // traversal of the syntax tree we're doing, the order of the\n    // following transformations matters.\n\n    xf(ctx.parser.duringStatement, (s, t) => {\n        let spawn = match(ctx.parser.spawn, s.body, null, null);\n        if (spawn !== null) {\n            if (spawn.linkedToken !== null) {\n                ctx.emitError(`during ... spawn doesn't need \"linked\", it's always linked`,\n                              spawn.linkedToken);\n            }\n            spawn.linkedToken = getRange(s.body);\n        }\n\n        let body = (spawn === null)\n            ? walk(s.body)\n            : expandSpawn(spawn, t, t` __SYNDICATE__.Turn.activeFacet.preventInertCheck();`);\n\n        const sa = compilePattern(s.pattern);\n        const assertion = t`__SYNDICATE__.Observe({\n            pattern: __SYNDICATE__.QuasiValue.finish(${sa.skeleton}),\n            observer: __SYNDICATE__.Turn.ref(__SYNDICATE__.assertionFacetObserver(\n                (${ctx.argDecl(t, '__vs', '__SYNDICATE__.AnyValue')}) => {\n                    if (Array.isArray(__vs)) {\n${joinItems(sa.captureBinders.map(binderTypeGuard(t)), '\\n')}\n                        ${body}\n                    }\n                }\n            ))\n        })`;\n        if (s.test === void 0) {\n            return t`assertDataflow(() => ({ target: currentSyndicateTarget(), assertion: ${assertion} }));`;\n        } else {\n            return t`assertDataflow(() => (${walk(s.test)})\n                   ? ({ target: currentSyndicateTarget(), assertion: ${assertion} })\n                   : ({ target: void 0, assertion: void 0 }));`;\n        }\n    });\n\n    function expandSpawn(spawn: SpawnStatement, t: TemplateFunction, inject: Items = []): Items {\n        // TODO: parentBinders, parentInits\n        /*\n        let assertions = (s.initialAssertions.length > 0)\n            ? t`, new __SYNDICATE__.Set([${commaJoin(s.initialAssertions.map(walk))}])`\n            : ``;\n        */\n        const f = t` const currentSyndicateFacet = __SYNDICATE__.Turn.activeFacet;`;\n        const n = spawn.name === void 0 ? '' : t` currentSyndicateFacet.actor.name = ${walk(spawn.name)};`;\n        return t`__SYNDICATE__.Dataspace._spawn${spawn.linkedToken ? 'Link': ''}(() => {${f}${n}${inject}${walk(spawn.body)}});`;\n    }\n\n    x(ctx.parser.spawn, expandSpawn);\n\n    x(ctx.parser.fieldDeclarationStatement, (s, t) => {\n        const ft = ctx.typescript ? t`<${s.field.type ?? '__SYNDICATE__.AnyValue'}>` : '';\n        return t`const ${[s.field.id]} = __SYNDICATE__.Turn.active.field${ft}(${maybeWalk(s.init) ?? 'void 0'}, ${stringifyId(s.field.id)});`;\n    });\n\n    x(ctx.parser.atStatement, (s, t) => {\n        return t`(((${ctx.argDecl(t, 'currentSyndicateTarget', '() => __SYNDICATE__.Ref')}) => {${walk(s.body)}})(() => (${walk(s.target)})));`;\n    });\n\n    x(ctx.parser.createExpression, (s, t) => {\n        return t`__SYNDICATE__.Turn.ref(${walk(s.entity)})`;\n    });\n\n    xf(ctx.parser.assertionEndpointStatement, (s, t) => {\n        if (s.isDynamic) {\n            if (s.test === void 0) {\n                return t`assertDataflow(() => ({ target: currentSyndicateTarget(), assertion: ${walk(s.template)} }));`;\n            } else {\n                return t`assertDataflow(() => (${walk(s.test)})\n                       ? ({ target: currentSyndicateTarget(), assertion: ${walk(s.template)} })\n                       : ({ target: void 0, assertion: void 0 }));`;\n            }\n        } else {\n            if (s.test === void 0) {\n                return t`assert(currentSyndicateTarget(), ${walk(s.template)});`;\n            } else {\n                return t`replace(currentSyndicateTarget(), void 0, (${walk(s.test)}) ? (${walk(s.template)}) : void 0);`;\n            }\n        }\n    });\n\n    xf(ctx.parser.dataflowStatement, (s, t) =>\n        t`_dataflow(() => {${walk(s.body)}});`);\n\n    x(ctx.parser.eventHandlerEndpointStatement, (s, t) => {\n        const wrap = s.once ? (i: Items) => facetWrap(t, 'once-wrapper', i) : (i: Items) => i;\n\n        if (s.triggerType === 'dataflow') {\n            return wrap(t`__SYNDICATE__.Turn.active._dataflow(() => { if (${walk(s.predicate)}) { ${terminalWrap(t, s.facetToStop, s.body)} } });`);\n        }\n\n        if (s.triggerType === 'stop') {\n            return t`__SYNDICATE__.Turn.activeFacet.onStop(() => {${walk(s.body)}});`;\n        }\n\n        const sa = compilePattern(s.pattern);\n        const guardBody = (body: Statement) => t`if (Array.isArray(__vs)) {\n${joinItems(sa.captureBinders.map(binderTypeGuard(t)), '\\n')}\n            ${body}\n        }`;\n\n        let entity: Items;\n        switch (s.triggerType) {\n            case 'asserted':\n                entity = t`{\n                    assert: (${ctx.argDecl(t, '__vs', '__SYNDICATE__.AnyValue')}, ${ctx.argDecl(t, '__handle', '__SYNDICATE__.Handle')}) => {\n                        ${guardBody(terminalWrap(t, s.facetToStop, s.body))}\n                    }\n                }`;\n                break;\n            case 'retracted':\n                entity = t`__SYNDICATE__.assertionObserver((${ctx.argDecl(t, '__vs', '__SYNDICATE__.AnyValue')}) => {\n                    ${guardBody(t`return () => { ${terminalWrap(t, s.facetToStop, s.body)} };`)}\n                })`;\n                break;\n            case 'message':\n                entity = t`{\n                    message: (${ctx.argDecl(t, '__vs', '__SYNDICATE__.AnyValue')}) => {\n                        ${guardBody(terminalWrap(t, s.facetToStop, s.body))}\n                    }\n                }`;\n                break;\n        }\n\n        const assertion = t`__SYNDICATE__.Observe({\n            pattern: __SYNDICATE__.QuasiValue.finish(${sa.skeleton}),\n            observer: __SYNDICATE__.Turn.ref(${entity}),\n        })`;\n\n        if (s.isDynamic) {\n            if (s.test === void 0) {\n                return wrap(t`__SYNDICATE__.Turn.active.assertDataflow(() => ({ target: currentSyndicateTarget(), assertion: ${assertion} }));`);\n            } else {\n                return wrap(t`__SYNDICATE__.Turn.active.assertDataflow(() => (${walk(s.test)})\n                            ? ({ target: currentSyndicateTarget(), assertion: ${assertion} })\n                            : ({ target: void 0, assertion: void 0 }));`);\n            }\n        } else {\n            if (s.test === void 0) {\n                return wrap(t`__SYNDICATE__.Turn.active.replace(currentSyndicateTarget(), void 0, ${assertion});`);\n            } else {\n                return wrap(t`__SYNDICATE__.Turn.active.replace(currentSyndicateTarget(), void 0, (${walk(s.test)}) ? ${assertion} : void 0);`);\n            }\n        }\n    });\n\n    x(ctx.parser.typeDefinitionStatement, (s, t) => {\n        const l = `Symbol.for(${JSON.stringify(s.label.text)})`;\n        const fns = JSON.stringify(s.fields.map(f => f.id.text));\n        const formatBinder = (b: Binder) => t`${[b.id]}: ${b.type ?? '__SYNDICATE__.AnyValue'}`;\n        const fs = ctx.typescript\n            ? t`<{${commaJoin(s.fields.map(formatBinder))}}, __SYNDICATE__.Ref>`\n            : '';\n        return t`const ${[s.label]} = __SYNDICATE__.Record.makeConstructor${fs}()(${maybeWalk(s.wireName) ?? l}, ${fns});`;\n    });\n\n    xf(ctx.parser.messageSendStatement, (s, t) => t`message(currentSyndicateTarget(), ${walk(s.expr)});`);\n\n    x(ctx.parser.reactStatement, (s, t) => facetWrap(t, s.label ?? 'default', s.body));\n\n    x(ctx.parser.stopStatement, (s, t) => t`${terminalWrap(t, s.facetToStop, s.body)};`);\n\n    xf(ctx.parser.syncStatement, (s, t) => t`_sync(${walk(s.peerToSyncWith)}, __SYNDICATE__.Turn.ref({ message() {${walk(s.body)}} }));`);\n\n    return tree;\n}\n\nexport function compile(options: CompileOptions): CompilerOutput {\n    const inputFilename = options.name ?? '/dev/stdin';\n\n    // console.info(`Syndicate: compiling ${inputFilename}`);\n\n    const source = options.source;\n    const moduleType = options.module ?? 'es6';\n    const typescript = options.typescript ?? false;\n\n    const start = startPos(inputFilename);\n    let tree = stripShebang(laxRead(source, { start, extraDelimiters: ':' }));\n    // const end = tree.length > 0 ? tree[tree.length - 1].end : start;\n\n    const macro = new Templates(undefined, { extraDelimiters: ':' });\n\n    const ctx = new ExpansionContext(moduleType, typescript, options.emitError);\n\n    tree = expand(tree, ctx);\n\n    const ts = macro.template(fixPos(start));\n    // const te = macro.template(fixPos(end));\n\n    {\n        const runtime = options.runtime ?? '@syndicate-lang/core';\n        switch (moduleType) {\n            case 'es6':\n                tree = ts`import * as __SYNDICATE__ from ${JSON.stringify(runtime)};\\n${tree}`;\n                break;\n            case 'require':\n                tree = ts`const __SYNDICATE__ = require(${JSON.stringify(runtime)});\\n${tree}`;\n                break;\n            case 'global':\n                tree = ts`const __SYNDICATE__ = ${runtime};\\n${tree}`;\n                break;\n            case 'none':\n                break;\n            default:\n                ((_: never) => {\n                    throw new Error(`Unsupported ModuleType: ${moduleType}`);\n                })(moduleType);\n        }\n    }\n\n    const cw = new CodeWriter(inputFilename);\n    cw.emit(tree);\n\n    const text = cw.text;\n\n    return {\n        text,\n        map: cw.map,\n        targetToSourceMap: cw.targetToSourceMap.index(),\n        sourceToTargetMap: cw.sourceToTargetMap.index(),\n    };\n}\n"],"mappings":"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","names":["src_exports","__export","codegen_exports","grammar_exports","syntax_exports","compile","__toCommonJS","syntax_exports","__export","ArrayList","CodeWriter","LaxReader","Scanner","SpanIndex","SpanInfo","SpanResult","StringScanner","Templates","TokenType","advancePos","alt","anonymousTemplate","anything","atEnd","atom","atomString","bind","collectSpace","commaJoin","discard","end","exec","fail","finishGroup","fixPos","foldItems","follows","formatPos","getRange","group","isGroup","isSpace","isToken","isTokenType","itemText","joinItems","laxRead","makeGroup","map","mapm","match","newline","noItems","not","notAtEnd","option","pos","repeat","replace","rest","scope","separatedBy","separatedOrTerminatedBy","seq","seqTuple","skipSpace","startPos","succeed","upTo","value","vlqDecode","vlqEncode","withoutSpace","TokenType","getRange","t","finishGroup","g","end","__spreadProps","__spreadValues","makeGroup","open","items","close","isSpace","i","isTokenType","isGroup","isToken","foldItems","fToken","fGroup","fItems","walk","itemText","options","_a","inner","k","strs","formatPos","p","_a","startPos","name","fixPos","__spreadProps","__spreadValues","advancePos","ch","advancedLine","alphabet","inverse_alphabet","i","c","vlqDecode","s","_a","acc","shift_amount","buf","ch","sextet","negative","vlqEncode","ns","n","m","SpanResult","searchTarget","start","SpanIndex","pos","_a","lo","hi","e","r","end","item","mid","SpanInfo","t","i","ends","a","b","encodeMapping","entry","a","maybeDelta","newValue","oldValue","CodeWriter","file","SpanInfo","_a","startPos","mappings","segments","vlqEncode","m","name","i","p","type","oldPos","n","sourceIndex","__spreadProps","__spreadValues","s","ch","advancePos","j","isGroup","targetStart","atEnd","xs","notAtEnd","ArrayList","_ArrayList","items","context","index","_a","i","value","match","p","items","failure","context","r","ArrayList","notAtEnd","skipSpace","noItems","c","fail","_i","succeed","t","i","discard","rest","end","atEnd","pos","newline","isTokenType","isSpace","collectSpace","acc","withoutSpace","not","v","follows","seq","patterns","seqTuple","rs","alt","alts","a","scope","pf","value","bind","target","key","pattern","exec","thunk","map","f","mapm","group","opener","options","_a","_b","isGroup","atomString","text","atom","_t","_c","isToken","anything","upTo","separatedBy","itemPattern","separator","separatedOrTerminatedBy","repeat","needSeparator","finish","option","replace","outerContext","startPos","walkItems","__spreadProps","__spreadValues","Scanner","pos","synthetic","__spreadValues","advancePos","ch","start","type","text","open","items","pred","f","buf","q","isTemplate","t","newDelimiters","seenStar","StringScanner","input","_a","matchingParen","c","LaxReader","scanner","_a","t","m","g","inner","finishGroup","i","variablePartOpen","laxRead","source","options","_b","start","startPos","StringScanner","substPat","scope","o","seq","atom","bind","pos","group","end","toItems","readOptions","s","laxRead","__spreadProps","__spreadValues","Templates","defaultPos","startPos","start0","context","start","consts","vars","_a","sourcePieces","i","source","replace","sub","name","joinItems","itemss","separator0","separator","acc","commaJoin","anonymousTemplate","grammar_exports","__export","SyndicateParser","SyndicateTypedParser","compilePattern","kw","text","value","o","seq","atom","bind","DOUBLE_QUOTE","anonymousTemplate","SyndicateParser","alt","newline","end","i","discard","fail","group","option","map","tok","repeat","scope","l","_","es","mapm","atomString","v","succeed","withoutSpace","upTo","not","seqTuple","_colon","e","b","adjustedStart","__spreadValues","advancePos","adjustedId","__spreadProps","acc","rest","items","_extraStops","extraStops","name","str","pattern","r","p","level","foldItems","match","_g","_k","bs","separatedOrTerminatedBy","SyndicateTypedParser","compilePattern","captureBinders","walk","pieces","commaJoin","k","codegen_exports","__export","ExpansionContext","compile","expand","stripShebang","stripShebang","items","isToken","isTokenType","ExpansionContext","moduleType","typescript","errorEmitter","SyndicateTypedParser","SyndicateParser","t","name","type","m","loc","stringifyId","i","__spreadProps","__spreadValues","binderTypeGuard","binder","index","raw","bind","typeText","itemText","intermediate","expand","tree","ctx","macro","Templates","terminalWrap","facetToStop","body","walk","toStop","resetCurrentSyndicateFacet","facetWrap","facetName","defaultLabel","customLabel","x","p","f","replace","v","start","fixPos","xf","maybeWalk","s","spawn","match","getRange","expandSpawn","sa","compilePattern","assertion","joinItems","inject","n","_a","_b","ft","wrap","guardBody","entity","l","fns","formatBinder","b","fs","commaJoin","compile","options","_c","_d","inputFilename","source","startPos","laxRead","ts","runtime","_","cw","CodeWriter"]}