{
  "definitions": [
    {
      "callable": true,
      "callees": [],
      "callers": [
        {
          "file": "core/converters/invariant.converter.ts",
          "name": "modelSeeds",
          "source": {
            "href": "https://banes-lab.com/anatomy/content#file-content-core-converters-invariant-converter-ts",
            "json": "https://banes-lab.com/json/source/content/core/converters/invariant.converter.ts",
            "label": "core/converters/invariant.converter.ts",
            "markdown": "https://banes-lab.com/source/content/core/converters/invariant.converter.ts.md",
            "ref": "anatomy:file-content-core-converters-invariant-converter-ts"
          }
        },
        {
          "file": "core/converters/invariant.converter.ts",
          "name": "modelSeeds",
          "source": {
            "href": "https://banes-lab.com/anatomy/content#file-content-core-converters-invariant-converter-ts",
            "json": "https://banes-lab.com/json/source/content/core/converters/invariant.converter.ts",
            "label": "core/converters/invariant.converter.ts",
            "markdown": "https://banes-lab.com/source/content/core/converters/invariant.converter.ts.md",
            "ref": "anatomy:file-content-core-converters-invariant-converter-ts"
          }
        }
      ],
      "exported": false,
      "flow": "leaf",
      "kind": "lexical_declaration",
      "line": 165,
      "name": "modelStem",
      "signature": "const modelStem = function modelStem(path: string): string {"
    },
    {
      "callable": true,
      "callees": [
        {
          "file": "core/converters/invariant.converter.ts",
          "name": "blocksOf",
          "source": {
            "href": "https://banes-lab.com/anatomy/content#file-content-core-converters-invariant-converter-ts",
            "json": "https://banes-lab.com/json/source/content/core/converters/invariant.converter.ts",
            "label": "core/converters/invariant.converter.ts",
            "markdown": "https://banes-lab.com/source/content/core/converters/invariant.converter.ts.md",
            "ref": "anatomy:file-content-core-converters-invariant-converter-ts"
          }
        }
      ],
      "callers": [
        {
          "file": "core/converters/invariant.converter.ts",
          "name": "modelSeeds",
          "source": {
            "href": "https://banes-lab.com/anatomy/content#file-content-core-converters-invariant-converter-ts",
            "json": "https://banes-lab.com/json/source/content/core/converters/invariant.converter.ts",
            "label": "core/converters/invariant.converter.ts",
            "markdown": "https://banes-lab.com/source/content/core/converters/invariant.converter.ts.md",
            "ref": "anatomy:file-content-core-converters-invariant-converter-ts"
          }
        }
      ],
      "exported": true,
      "flow": "relay",
      "kind": "lexical_declaration",
      "line": 153,
      "name": "invariantsOf",
      "signature": "export const invariantsOf = function invariantsOf(text: string, words: SlotWords): InvariantStatement[] {"
    },
    {
      "callable": true,
      "callees": [],
      "callers": [
        {
          "file": "core/converters/invariant.converter.ts",
          "name": "statementsOf",
          "source": {
            "href": "https://banes-lab.com/anatomy/content#file-content-core-converters-invariant-converter-ts",
            "json": "https://banes-lab.com/json/source/content/core/converters/invariant.converter.ts",
            "label": "core/converters/invariant.converter.ts",
            "markdown": "https://banes-lab.com/source/content/core/converters/invariant.converter.ts.md",
            "ref": "anatomy:file-content-core-converters-invariant-converter-ts"
          }
        }
      ],
      "exported": false,
      "flow": "leaf",
      "kind": "lexical_declaration",
      "line": 105,
      "name": "unitsOf",
      "signature": "const unitsOf = function unitsOf(block: string): string[] {"
    },
    {
      "callable": true,
      "callees": [],
      "callers": [
        {
          "file": "core/converters/invariant.converter.ts",
          "name": "invariantsOf",
          "source": {
            "href": "https://banes-lab.com/anatomy/content#file-content-core-converters-invariant-converter-ts",
            "json": "https://banes-lab.com/json/source/content/core/converters/invariant.converter.ts",
            "label": "core/converters/invariant.converter.ts",
            "markdown": "https://banes-lab.com/source/content/core/converters/invariant.converter.ts.md",
            "ref": "anatomy:file-content-core-converters-invariant-converter-ts"
          }
        }
      ],
      "exported": false,
      "flow": "leaf",
      "kind": "lexical_declaration",
      "line": 134,
      "name": "blocksOf",
      "signature": "const blocksOf = function blocksOf(text: string): { heading: string; body: string }[] {"
    },
    {
      "callable": true,
      "callees": [
        {
          "file": "core/converters/invariant.converter.ts",
          "name": "invariantsOf",
          "source": {
            "href": "https://banes-lab.com/anatomy/content#file-content-core-converters-invariant-converter-ts",
            "json": "https://banes-lab.com/json/source/content/core/converters/invariant.converter.ts",
            "label": "core/converters/invariant.converter.ts",
            "markdown": "https://banes-lab.com/source/content/core/converters/invariant.converter.ts.md",
            "ref": "anatomy:file-content-core-converters-invariant-converter-ts"
          }
        },
        {
          "file": "core/converters/invariant.converter.ts",
          "name": "modelStem",
          "source": {
            "href": "https://banes-lab.com/anatomy/content#file-content-core-converters-invariant-converter-ts",
            "json": "https://banes-lab.com/json/source/content/core/converters/invariant.converter.ts",
            "label": "core/converters/invariant.converter.ts",
            "markdown": "https://banes-lab.com/source/content/core/converters/invariant.converter.ts.md",
            "ref": "anatomy:file-content-core-converters-invariant-converter-ts"
          }
        },
        {
          "file": "core/converters/invariant.converter.ts",
          "name": "modelStem",
          "source": {
            "href": "https://banes-lab.com/anatomy/content#file-content-core-converters-invariant-converter-ts",
            "json": "https://banes-lab.com/json/source/content/core/converters/invariant.converter.ts",
            "label": "core/converters/invariant.converter.ts",
            "markdown": "https://banes-lab.com/source/content/core/converters/invariant.converter.ts.md",
            "ref": "anatomy:file-content-core-converters-invariant-converter-ts"
          }
        }
      ],
      "callers": [],
      "exported": true,
      "flow": "entry",
      "kind": "lexical_declaration",
      "line": 170,
      "name": "modelSeeds",
      "signature": "export const modelSeeds = function modelSeeds(models: readonly SourceText[], words: SlotWords): LessonSeed[] {"
    },
    {
      "callable": true,
      "callees": [
        {
          "file": "core/converters/invariant.converter.ts",
          "name": "unitsOf",
          "source": {
            "href": "https://banes-lab.com/anatomy/content#file-content-core-converters-invariant-converter-ts",
            "json": "https://banes-lab.com/json/source/content/core/converters/invariant.converter.ts",
            "label": "core/converters/invariant.converter.ts",
            "markdown": "https://banes-lab.com/source/content/core/converters/invariant.converter.ts.md",
            "ref": "anatomy:file-content-core-converters-invariant-converter-ts"
          }
        }
      ],
      "callers": [],
      "exported": false,
      "flow": "entry",
      "kind": "lexical_declaration",
      "line": 119,
      "name": "statementsOf",
      "signature": "const statementsOf = function statementsOf(block: string, words: SlotWords): Partial<Record<keyof SlotWords, string>> {"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 20,
      "name": "SOURCE",
      "signature": "const SOURCE = \"model\";"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 21,
      "name": "NO_LEAD",
      "signature": "const NO_LEAD = \"with no \";"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 22,
      "name": "STATEMENT_LEADS",
      "signature": "const STATEMENT_LEADS: readonly string[] = [LEAD_IN_SEPARATOR, \".\", \":\", \",\", \" \"];"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 23,
      "name": "LABEL_STOPS",
      "signature": "const LABEL_STOPS: ReadonlySet<string> = new Set([\".\", \",\", \":\", \" \"]);"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 24,
      "name": "MIN_WORD",
      "signature": "const MIN_WORD = 3;"
    },
    {
      "callable": true,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 26,
      "name": "isUpperWord",
      "signature": "const isUpperWord = function isUpperWord(word: string): boolean {"
    },
    {
      "callable": true,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 38,
      "name": "upperWordsAfterLead",
      "signature": "const upperWordsAfterLead = function upperWordsAfterLead(text: string): string[] {"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 39,
      "name": "lead",
      "signature": "const lead = text.indexOf(SLOT_SENTENCE_LEAD);"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 40,
      "name": "close",
      "signature": "const close = lead === -1 ? -1 : text.indexOf(BOLD_MARK, lead);"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 44,
      "name": "paragraphEnd",
      "signature": "const paragraphEnd = text.indexOf(LINE_END + LINE_END, close);"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 45,
      "name": "body",
      "signature": "const body = text.slice(close, paragraphEnd === -1 ? text.length : paragraphEnd);"
    },
    {
      "callable": true,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 49,
      "name": "objectorWord",
      "signature": "const objectorWord = function objectorWord(text: string): string | null {"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 50,
      "name": "gate",
      "signature": "const gate = text.indexOf(GATE_HEADING);"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 55,
      "name": "rest",
      "signature": "const rest = text.slice(at + NO_LEAD.length);"
    },
    {
      "callable": true,
      "callees": [],
      "callers": [],
      "exported": true,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 60,
      "name": "slotWordsOf",
      "signature": "export const slotWordsOf = function slotWordsOf(template: string): SlotWords | null {"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": true,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 61,
      "name": "[property, set, parties]",
      "signature": "const [property, set, parties] = upperWordsAfterLead(template).map((word) => word.toLowerCase());"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": true,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 62,
      "name": "objector",
      "signature": "const objector = objectorWord(template);"
    },
    {
      "callable": true,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 69,
      "name": "firstWordOf",
      "signature": "const firstWordOf = function firstWordOf(label: string): string {"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 70,
      "name": "lower",
      "signature": "const lower = label.trim().toLowerCase();"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 71,
      "name": "bare",
      "signature": "const bare = lower.startsWith(ITS_PREFIX.toLowerCase()) ? lower.slice(ITS_PREFIX.length) : lower;"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 72,
      "name": "end",
      "signature": "let end = 0;"
    },
    {
      "callable": true,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 79,
      "name": "stripLeads",
      "signature": "const stripLeads = function stripLeads(text: string): string {"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 81,
      "name": "changed",
      "signature": "let changed = true;"
    },
    {
      "callable": true,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 94,
      "name": "slotOf",
      "signature": "const slotOf = function slotOf(label: string, words: SlotWords): keyof SlotWords | null {"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 95,
      "name": "word",
      "signature": "const word = firstWordOf(label);"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 96,
      "name": "entries",
      "signature": "const entries: [keyof SlotWords, string][] = ["
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 106,
      "name": "units",
      "signature": "const units: string[] = [];"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 109,
      "name": "previous",
      "signature": "const previous = units[last];"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 122,
      "name": "segments",
      "signature": "const segments = line.split(BOLD_MARK);"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 123,
      "name": "index",
      "signature": "for (let index = 1; index < segments.length; index += 2) {"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 124,
      "name": "slot",
      "signature": "const slot = slotOf(segments[index] ?? \"\", words);"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 125,
      "name": "statement",
      "signature": "const statement = stripLeads(segments[index + 1] ?? \"\");"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 135,
      "name": "blocks",
      "signature": "const blocks: { heading: string; body: string }[] = [];"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 138,
      "name": "at",
      "signature": "let at = 0;"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 145,
      "name": "last",
      "signature": "const last = blocks.at(-1);"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": true,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 154,
      "name": "out",
      "signature": "const out: InvariantStatement[] = [];"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": true,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 156,
      "name": "found",
      "signature": "const found = statementsOf(block.body, words);"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": true,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 157,
      "name": "{ objector, parties, property, set }",
      "signature": "const { objector, parties, property, set } = found;"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 166,
      "name": "base",
      "signature": "const base = path.slice(path.lastIndexOf(\"/\") + 1);"
    }
  ],
  "document": null,
  "findings": [],
  "generated": false,
  "href": "https://banes-lab.com/anatomy/content#file-content-core-converters-invariant-converter-ts",
  "language": "typescript",
  "layer": "processing",
  "name": "invariant.converter.ts",
  "path": "core/converters/invariant.converter.ts",
  "ref": "anatomy:file-content-core-converters-invariant-converter-ts",
  "relations": [
    {
      "links": [
        {
          "href": "https://banes-lab.com/anatomy/content#folder-content-core-converters",
          "json": "https://banes-lab.com/json/anatomy/content/folder-content-core-converters",
          "label": "core/converters",
          "markdown": "https://banes-lab.com/anatomy/content/folder-content-core-converters.md",
          "ref": "chapter:/anatomy/content#folder-content-core-converters"
        }
      ],
      "relation": "contained-in"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/anatomy/content#folder-content-core-converters",
          "json": "https://banes-lab.com/json/anatomy/content/folder-content-core-converters",
          "label": "core/converters",
          "markdown": "https://banes-lab.com/anatomy/content/folder-content-core-converters.md",
          "ref": "chapter:/anatomy/content#folder-content-core-converters"
        }
      ],
      "relation": "linked-from"
    }
  ],
  "slots": {
    "concern": "converter",
    "subject": "invariant",
    "variant": null
  },
  "stats": {
    "bytes": 6551,
    "callable": 13,
    "definitions": 45,
    "edges": 5,
    "exported": 8,
    "files": 1,
    "findings": {},
    "flows": {
      "leaf": 3,
      "relay": 1,
      "entry": 2,
      "isolated": 39
    },
    "lines": {
      "blank": 14,
      "code": 173,
      "total": 187
    }
  },
  "summary": "173 lines of code and 45 definitions.",
  "text": "https://banes-lab.com/source/content/core/converters/invariant.converter.ts.txt",
  "tree": "content",
  "siblings": {
    "next": {
      "href": "https://banes-lab.com/anatomy/content#file-content-core-converters-inventory-converter-ts",
      "json": "https://banes-lab.com/json/source/content/core/converters/inventory.converter.ts",
      "label": "core/converters/inventory.converter.ts",
      "markdown": "https://banes-lab.com/source/content/core/converters/inventory.converter.ts.md",
      "ref": "anatomy:file-content-core-converters-inventory-converter-ts"
    },
    "previous": null
  },
  "up": {
    "href": null,
    "json": "https://banes-lab.com/json/api/source/content/core/converters",
    "label": "core/converters",
    "markdown": "https://banes-lab.com/api/source/content/core/converters.md",
    "ref": "api:source/content/core/converters"
  }
}
