{"version":3,"sources":["../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 * 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":["TokenType","end","i","pos","e","end","value","scope","_a","r","end","items","pos","ch","pos","i","scope","kw","pattern","bind","tree","_a"]}