{"entries":[{"anchor":"module-tey-cache","kind":"module","line":1,"name":"Tey.Cache","qualifiedName":"Tey.Cache","signatures":["root : String","packagePath(dep: Tey.Lockfile.Dependency) -> String","repositoryPath(dep: Tey.Lockfile.Dependency) -> String","fetch(dep: Tey.Lockfile.Dependency) -> Result<String, String>","verify(dep: Tey.Lockfile.Dependency) -> Result<String, String>"],"summary":"","types":["String","Tey.Lockfile.Dependency","Result<String, String>"],"urlPath":"tey/cache"},{"anchor":"function-tey-cache-root","kind":"function","line":5,"name":"root","qualifiedName":"Tey.Cache.root","signatures":["root : String"],"summary":"","types":["String"],"urlPath":"tey/cache"},{"anchor":"function-tey-cache-packagepath","kind":"function","line":17,"name":"packagePath","qualifiedName":"Tey.Cache.packagePath","signatures":["packagePath(dep: Tey.Lockfile.Dependency) -> String"],"summary":"Include the source URL in the cache identity: two packages with the same display name must never share a checkout.","types":["Tey.Lockfile.Dependency","String"],"urlPath":"tey/cache"},{"anchor":"function-tey-cache-repositorypath","kind":"function","line":24,"name":"repositoryPath","qualifiedName":"Tey.Cache.repositoryPath","signatures":["repositoryPath(dep: Tey.Lockfile.Dependency) -> String"],"summary":"","types":["Tey.Lockfile.Dependency","String"],"urlPath":"tey/cache"},{"anchor":"function-tey-cache-fetch","kind":"function","line":28,"name":"fetch","qualifiedName":"Tey.Cache.fetch","signatures":["fetch(dep: Tey.Lockfile.Dependency) -> Result<String, String>"],"summary":"","types":["Tey.Lockfile.Dependency","Result<String, String>"],"urlPath":"tey/cache"},{"anchor":"function-tey-cache-verify","kind":"function","line":76,"name":"verify","qualifiedName":"Tey.Cache.verify","signatures":["verify(dep: Tey.Lockfile.Dependency) -> Result<String, String>"],"summary":"","types":["Tey.Lockfile.Dependency","Result<String, String>"],"urlPath":"tey/cache"},{"anchor":"module-tey-cli","kind":"module","line":1,"name":"Tey.Cli","qualifiedName":"Tey.Cli","signatures":["parser : OptionConfig","cli : OptionConfig","dispatch(args: [String]) -> Integer","announceToolchain : Void"],"summary":"","types":["OptionConfig","[String]","Integer","Void"],"urlPath":"tey/cli"},{"anchor":"function-tey-cli-parser","kind":"function","line":14,"name":"parser","qualifiedName":"Tey.Cli.parser","signatures":["parser : OptionConfig"],"summary":"Options AND commands in one declaration: OptionParser matches the command words, strips them, and hands the handler what is left. Tey keeps no dispatcher of its own, so the help text and what actually runs cannot drift apart — they are read off the same list.\n\n`foul` because the handlers do things.","types":["OptionConfig"],"urlPath":"tey/cli"},{"anchor":"function-tey-cli-cli","kind":"function","line":159,"name":"cli","qualifiedName":"Tey.Cli.cli","signatures":["cli : OptionConfig"],"summary":"The parser Tey actually runs: the declared commands, plus one for every `command(...)` this package's manifest declares. Registering them here rather than in a fallback is what gets them into `tey help`, into the unknown-command message, and into argument stripping, for free.\n\nA package command can never shadow a built-in: the manifest reader refuses those names outright (Tey.Manifest.reservedCommands). They are listed under their own help heading regardless — \"unknown command\" should send a reader to package.kex or to Tey, and the two lists are written by different people.","types":["OptionConfig"],"urlPath":"tey/cli"},{"anchor":"function-tey-cli-dispatch","kind":"function","line":173,"name":"dispatch","qualifiedName":"Tey.Cli.dispatch","signatures":["dispatch(args: [String]) -> Integer"],"summary":"The line is parsed once here to answer the two questions `run` cannot — is this `--version`, and does it name a command Tey already answers — and then handed to `run`, which parses it again and dispatches. A parse ERROR is left to `run` as well: reporting it with the help text is the one policy every tool built on OptionParser shares.","types":["[String]","Integer"],"urlPath":"tey/cli"},{"anchor":"function-tey-cli-announcetoolchain","kind":"function","line":194,"name":"announceToolchain","qualifiedName":"Tey.Cli.announceToolchain","signatures":["announceToolchain : Void"],"summary":"Tells the rest of the process which compiler Tey selected.\n\n`Kex.AST` — which is how a `package.kex` is read at all — shells out to the compiler named by `$KEX`, falling back to whatever `kex` PATH happens to hold. Tey is started by `erl`, not by `kex`, so nothing had set that: a manifest was parsed by an unrelated compiler if one was on PATH, and by none at all otherwise — which is why a package's commands silently vanished from `tey help` on a machine where `kex` was installed only inside the Tey home.\n\nAn explicit `$KEX` is left alone: someone who set it means it, and that is the documented override the compiler itself honours.","types":["Void"],"urlPath":"tey/cli"},{"anchor":"module-tey-commands","kind":"module","line":1,"name":"Tey.Commands","qualifiedName":"Tey.Commands","signatures":["manifest : Result<ManifestPackage, String>","lock : Integer","add(name: String, options: ParsedOptions) -> Integer","localOverride(name: String, path: String, remove?: Bool, list?: Bool) -> Integer","install(without: String, packageName: String = …) -> Integer","updateDependencies(name: String = …) -> Integer","dependencyClosure(state: LockState, roots: [String]) -> [String]","mergeUpdate(previous: LockState, fresh: LockState, roots: [String], wholeWorkspace?: Bool) -> LockState","lockReusable?(state: LockState, manifestFingerprint: String, toolchain: Tey.Toolchain.ToolchainInfo) -> Bool","validateUpdateName(members: [Member], name: String) -> Result<Void, String>","updateScopeMembers(context: Context) -> [Member]","installTargets : Integer","installTargetsSelected(context: Context, packageName: String) -> Integer","installMemberTargets(member: Member) -> Integer","dependencyRoots : [String]","sourceRoots : [String]","sourceRootsAt(packageRoot: String) -> [String]","librarySources : [String]","librarySourcesAt(packageRoot: String) -> [String]","backendFlags(interpret?: Bool) -> [String]","runPackage(extra: [String], interpret?: Bool, packageName: String = …) -> Integer","runCommand(command: Command, extra: [String], interpret?: Bool) -> Integer","list : Integer","build : Integer","buildSelected(packageName: String, workspace?: Bool, requestedJobs: String = …) -> Integer","buildMember(member: Member) -> Integer","testReportingFlags(json?: Bool, list?: Bool, only: String) -> [String]","testSpecs(requested: [String]) -> [String]","test(requested: [String], interpret?: Bool, json?: Bool, list?: Bool, only: String) -> Integer","testSelected(requested: [String], packageName: String, workspace?: Bool, interpret?: Bool, json?: Bool, list?: Bool, only: String, requestedJobs: String = …) -> Integer","testAt(packageRoot: String, requested: [String], interpret?: Bool, json?: Bool, list?: Bool, only: String) -> Integer","clean(all?: Bool) -> Integer","setupMergeDriver(remove?: Bool) -> Integer","new(directory: String, library: Bool) -> Integer","init(name: String, library: Bool) -> Integer"],"summary":"","types":["Integer","[String]","Result<ManifestPackage, String>","String","ParsedOptions","Bool","LockState","Tey.Toolchain.ToolchainInfo","[Member]","Result<Void, String>","Context","Member","Command"],"urlPath":"tey/commands"},{"anchor":"record-tey-commands-workspacerunstate","kind":"record","line":14,"name":"WorkspaceRunState","qualifiedName":"Tey.Commands.WorkspaceRunState","signatures":[],"summary":"","types":["Integer","[String]"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-manifest","kind":"function","line":19,"name":"manifest","qualifiedName":"Tey.Commands.manifest","signatures":["manifest : Result<ManifestPackage, String>"],"summary":"","types":["Result<ManifestPackage, String>"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-lock","kind":"function","line":27,"name":"lock","qualifiedName":"Tey.Commands.lock","signatures":["lock : Integer"],"summary":"","types":["Integer"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-add","kind":"function","line":46,"name":"add","qualifiedName":"Tey.Commands.add","signatures":["add(name: String, options: ParsedOptions) -> Integer"],"summary":"","types":["String","ParsedOptions","Integer"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-localoverride","kind":"function","line":68,"name":"localOverride","qualifiedName":"Tey.Commands.localOverride","signatures":["localOverride(name: String, path: String, remove?: Bool, list?: Bool) -> Integer"],"summary":"","types":["String","Bool","Integer"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-install","kind":"function","line":101,"name":"install","qualifiedName":"Tey.Commands.install","signatures":["install(without: String, packageName: String = …) -> Integer"],"summary":"`--without dev` leaves a group's dependencies out of this install. The LOCKFILE still lists them — what is omitted is the fetching, so switching the flag off later needs no re-resolve.","types":["String","Integer"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-updatedependencies","kind":"function","line":144,"name":"updateDependencies","qualifiedName":"Tey.Commands.updateDependencies","signatures":["updateDependencies(name: String = …) -> Integer"],"summary":"","types":["String","Integer"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-dependencyclosure","kind":"function","line":214,"name":"dependencyClosure","qualifiedName":"Tey.Commands.dependencyClosure","signatures":["dependencyClosure(state: LockState, roots: [String]) -> [String]"],"summary":"Names affected by a member-local or named update, including transitive dependency edges recorded in the newly resolved graph.","types":["LockState","[String]"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-mergeupdate","kind":"function","line":221,"name":"mergeUpdate","qualifiedName":"Tey.Commands.mergeUpdate","signatures":["mergeUpdate(previous: LockState, fresh: LockState, roots: [String], wholeWorkspace?: Bool) -> LockState"],"summary":"Publishes fresh workspace metadata and selected resolutions while retaining unrelated external pins. Existing approvals are carried forward here and subsequently filtered against the visible declarations by approvePlugins.","types":["LockState","[String]","Bool"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-lockreusable?","kind":"function","line":237,"name":"lockReusable?","qualifiedName":"Tey.Commands.lockReusable?","signatures":["lockReusable?(state: LockState, manifestFingerprint: String, toolchain: Tey.Toolchain.ToolchainInfo) -> Bool"],"summary":"","types":["LockState","String","Tey.Toolchain.ToolchainInfo","Bool"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-validateupdatename","kind":"function","line":244,"name":"validateUpdateName","qualifiedName":"Tey.Commands.validateUpdateName","signatures":["validateUpdateName(members: [Member], name: String) -> Result<Void, String>"],"summary":"","types":["[Member]","String","Result<Void, String>"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-updatescopemembers","kind":"function","line":253,"name":"updateScopeMembers","qualifiedName":"Tey.Commands.updateScopeMembers","signatures":["updateScopeMembers(context: Context) -> [Member]"],"summary":"","types":["Context","[Member]"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-installtargets","kind":"function","line":270,"name":"installTargets","qualifiedName":"Tey.Commands.installTargets","signatures":["installTargets : Integer"],"summary":"Puts this package's `target(...)` executables where they can be run by name.\n\n`${TEY_HOME}/bin` is a directory Tey already owns and already asks people to put on PATH — it is how the `kex` shim gets there — so a package's programs land beside it rather than needing a second directory and a second instruction.\n\nOnly packages that DECLARE a target are affected. A library has none, so `tey install` in one still means exactly what it meant before: fetch the dependencies.","types":["Integer"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-installtargetsselected","kind":"function","line":302,"name":"installTargetsSelected","qualifiedName":"Tey.Commands.installTargetsSelected","signatures":["installTargetsSelected(context: Context, packageName: String) -> Integer"],"summary":"","types":["Context","String","Integer"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-installmembertargets","kind":"function","line":316,"name":"installMemberTargets","qualifiedName":"Tey.Commands.installMemberTargets","signatures":["installMemberTargets(member: Member) -> Integer"],"summary":"","types":["Member","Integer"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-dependencyroots","kind":"function","line":343,"name":"dependencyRoots","qualifiedName":"Tey.Commands.dependencyRoots","signatures":["dependencyRoots : [String]"],"summary":"`--source-root` for every fetched dependency. Without these a dependency is just bytes in the cache: `using Greet` cannot find it, and the package that declared it does not compile. A dependency the lockfile names but the cache does not have is reported rather than quietly dropped — the answer is `tey install`, and silence would look like a broken `using`.","types":["[String]"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-sourceroots","kind":"function","line":407,"name":"sourceRoots","qualifiedName":"Tey.Commands.sourceRoots","signatures":["sourceRoots : [String]"],"summary":"Every `--source-root` a compile of THIS package needs: its own `src/` first, then each dependency's. Own-first is deliberate — a package that shadows a dependency's module name means its own, the same way `--source-root` order already decides that for dependencies among themselves.","types":["[String]"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-sourcerootsat","kind":"function","line":412,"name":"sourceRootsAt","qualifiedName":"Tey.Commands.sourceRootsAt","signatures":["sourceRootsAt(packageRoot: String) -> [String]"],"summary":"","types":["String","[String]"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-librarysources","kind":"function","line":422,"name":"librarySources","qualifiedName":"Tey.Commands.librarySources","signatures":["librarySources : [String]"],"summary":"A library's compilable units: every `.kex` directly under `src/`. Not a recursive walk — a nested module is reached by the file that declares it, and compiling it twice by name is how you get a duplicate-module error out of a perfectly good package.","types":["[String]"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-librarysourcesat","kind":"function","line":438,"name":"librarySourcesAt","qualifiedName":"Tey.Commands.librarySourcesAt","signatures":["librarySourcesAt(packageRoot: String) -> [String]"],"summary":"Returns units relative to `packageRoot`, not absolute: the compiler double-registers a module's declarations when the entry file it is asked to compile is an absolute path that also falls under an explicit `--source-root` (kexhq/kex#?, surfaced by `tey build`ing Rodolfo — a `private do` function building a record literal of a type carrying earlier `make` methods reported that type's method \"defined twice\"). A relative unit, resolved through the working directory `streamAt`/`runAt` `cd` into, does not collide with the source-root the same way. Callers must invoke the compiler with `packageRoot` as the working directory.","types":["String","[String]"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-backendflags","kind":"function","line":454,"name":"backendFlags","qualifiedName":"Tey.Commands.backendFlags","signatures":["backendFlags(interpret?: Bool) -> [String]"],"summary":"What `tey build` produces is what ships, so what `tey run` and `tey test` exercise has to be the same thing — which is what `kex` does with no backend flag at all: it compiles and runs on the BEAM. `-R` tree-walks the source instead, and processes, `Erlang.*` interop and the String/Char representation differ enough between the two that a green interpreter run says nothing about the built package.\n\n`--interpret` is the way back, for a backend gap or a debugging session.","types":["Bool","[String]"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-runpackage","kind":"function","line":458,"name":"runPackage","qualifiedName":"Tey.Commands.runPackage","signatures":["runPackage(extra: [String], interpret?: Bool, packageName: String = …) -> Integer"],"summary":"","types":["[String]","Bool","String","Integer"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-runcommand","kind":"function","line":493,"name":"runCommand","qualifiedName":"Tey.Commands.runCommand","signatures":["runCommand(command: Command, extra: [String], interpret?: Bool) -> Integer"],"summary":"`tey <name>` for a `command(...)` the manifest declares.\n\nA `.kex` script is run through the SELECTED toolchain with this package's source roots already in place — the same environment `tey run` gives, so a release script can `using` the package it is releasing. Anything else is a shell line: `sh -c` is what makes `command(\"fmt\", run: \"kex --format src\")` behave the way the same line behaves in a terminal, pipes and `&&` included. Trailing arguments are passed as \"$@\" rather than pasted into the string, so `tey fmt --check` cannot be re-split by the shell.\n\nThe `--` before the arguments plays the same role as in runPackage.","types":["Command","[String]","Bool","Integer"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-list","kind":"function","line":519,"name":"list","qualifiedName":"Tey.Commands.list","signatures":["list : Integer"],"summary":"","types":["Integer"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-build","kind":"function","line":530,"name":"build","qualifiedName":"Tey.Commands.build","signatures":["build : Integer"],"summary":"","types":["Integer"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-buildselected","kind":"function","line":542,"name":"buildSelected","qualifiedName":"Tey.Commands.buildSelected","signatures":["buildSelected(packageName: String, workspace?: Bool, requestedJobs: String = …) -> Integer"],"summary":"","types":["String","Bool","Integer"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-buildmember","kind":"function","line":562,"name":"buildMember","qualifiedName":"Tey.Commands.buildMember","signatures":["buildMember(member: Member) -> Integer"],"summary":"","types":["Member","Integer"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-testreportingflags","kind":"function","line":604,"name":"testReportingFlags","qualifiedName":"Tey.Commands.testReportingFlags","signatures":["testReportingFlags(json?: Bool, list?: Bool, only: String) -> [String]"],"summary":"How `tey test` should REPORT, as compiler flags (kexhq/kex#199).\n\n`--json` and `--list` are for a tool reading the run rather than a person watching it: one JSON record per case, carrying the file and line of the `it` and of the failure, and — with `--list` — the cases discovered without any of them being run. `--only <name>` narrows the run to one case or one group.\n\nTey does not interpret any of it: the flags are the compiler's, the records are the compiler's, and this is the mapping from what a person typed to what the compiler is asked. Which is the point — an editor drives `tey test` because Tey knows the package's source roots, not because it wants Tey to reformat the answer (docs/testing.md).","types":["Bool","String","[String]"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-testspecs","kind":"function","line":615,"name":"testSpecs","qualifiedName":"Tey.Commands.testSpecs","signatures":["testSpecs(requested: [String]) -> [String]"],"summary":"The spec files to run: the ones named on the line, or every `spec/*.spec.kex` when none were. Naming one is what an editor's per-file ▶ needs — and what anyone debugging a single suite in a package with thirty of them wants.","types":["[String]"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-test","kind":"function","line":623,"name":"test","qualifiedName":"Tey.Commands.test","signatures":["test(requested: [String], interpret?: Bool, json?: Bool, list?: Bool, only: String) -> Integer"],"summary":"","types":["[String]","Bool","String","Integer"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-testselected","kind":"function","line":629,"name":"testSelected","qualifiedName":"Tey.Commands.testSelected","signatures":["testSelected(requested: [String], packageName: String, workspace?: Bool, interpret?: Bool, json?: Bool, list?: Bool, only: String, requestedJobs: String = …) -> Integer"],"summary":"","types":["[String]","String","Bool","Integer"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-testat","kind":"function","line":651,"name":"testAt","qualifiedName":"Tey.Commands.testAt","signatures":["testAt(packageRoot: String, requested: [String], interpret?: Bool, json?: Bool, list?: Bool, only: String) -> Integer"],"summary":"","types":["String","[String]","Bool","Integer"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-clean","kind":"function","line":690,"name":"clean","qualifiedName":"Tey.Commands.clean","signatures":["clean(all?: Bool) -> Integer"],"summary":"","types":["Bool","Integer"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-setupmergedriver","kind":"function","line":703,"name":"setupMergeDriver","qualifiedName":"Tey.Commands.setupMergeDriver","signatures":["setupMergeDriver(remove?: Bool) -> Integer"],"summary":"","types":["Bool","Integer"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-new","kind":"function","line":719,"name":"new","qualifiedName":"Tey.Commands.new","signatures":["new(directory: String, library: Bool) -> Integer"],"summary":"`tey new <name>` — a package in a directory of its own, which the command creates. The pair with `init` below follows what `git init` and `cargo new` already taught everyone: `new` makes the directory, `init` adopts the one you are standing in.","types":["String","Bool","Integer"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-init","kind":"function","line":745,"name":"init","qualifiedName":"Tey.Commands.init","signatures":["init(name: String, library: Bool) -> Integer"],"summary":"`tey init` — a package in the CURRENT directory, named after it. This is the half that was missing: a repository someone had already made and cloned had no way to become a package except `tey new` in a temp directory and moving the files over by hand.\n\nThe name is overridable because a directory name is not always the package name — `kexhq/greet` checked out as `greet-main` is still `greet`.","types":["String","Bool","Integer"],"urlPath":"tey/commands"},{"anchor":"module-tey-generator","kind":"module","line":1,"name":"Tey.Generator","qualifiedName":"Tey.Generator","signatures":["decode(text: String) -> Result<[Operation], String>","apply(operations: [Operation], workspaceRoot: String, force?: Bool) -> Result<Void, String>","safePath(workspaceRoot: String, path: String) -> Result<String, String>"],"summary":"","types":["String","Result<[Operation], String>","[Operation]","Bool","Result<Void, String>","Result<String, String>"],"urlPath":"tey/generator"},{"anchor":"type-tey-generator-operation","kind":"type","line":5,"name":"Operation","qualifiedName":"Tey.Generator.Operation","signatures":[],"summary":"","types":["String","String","String"],"urlPath":"tey/generator"},{"anchor":"function-tey-generator-decode","kind":"function","line":9,"name":"decode","qualifiedName":"Tey.Generator.decode","signatures":["decode(text: String) -> Result<[Operation], String>"],"summary":"Decodes the child-to-host half of the separately versioned protocol. Plugin stdout is data, never Kex source evaluated in Tey's process.","types":["String","Result<[Operation], String>"],"urlPath":"tey/generator"},{"anchor":"function-tey-generator-apply","kind":"function","line":25,"name":"apply","qualifiedName":"Tey.Generator.apply","signatures":["apply(operations: [Operation], workspaceRoot: String, force?: Bool) -> Result<Void, String>"],"summary":"","types":["[Operation]","String","Bool","Result<Void, String>"],"urlPath":"tey/generator"},{"anchor":"function-tey-generator-safepath","kind":"function","line":52,"name":"safePath","qualifiedName":"Tey.Generator.safePath","signatures":["safePath(workspaceRoot: String, path: String) -> Result<String, String>"],"summary":"","types":["String","Result<String, String>"],"urlPath":"tey/generator"},{"anchor":"module-tey-git","kind":"module","line":1,"name":"Tey.Git","qualifiedName":"Tey.Git","signatures":["execute(args: [String]) -> Result<ProcessResult, String>","pinRef(url: String, selector: String, requested: String) -> Result<(String, String), String>","tags(url: String) -> Result<[String], String>"],"summary":"","types":["[String]","Result<ProcessResult, String>","String","Result<(String, String), String>","Result<[String], String>"],"urlPath":"tey/git"},{"anchor":"function-tey-git-execute","kind":"function","line":3,"name":"execute","qualifiedName":"Tey.Git.execute","signatures":["execute(args: [String]) -> Result<ProcessResult, String>"],"summary":"","types":["[String]","Result<ProcessResult, String>"],"urlPath":"tey/git"},{"anchor":"function-tey-git-pinref","kind":"function","line":10,"name":"pinRef","qualifiedName":"Tey.Git.pinRef","signatures":["pinRef(url: String, selector: String, requested: String) -> Result<(String, String), String>"],"summary":"","types":["String","Result<(String, String), String>"],"urlPath":"tey/git"},{"anchor":"function-tey-git-tags","kind":"function","line":31,"name":"tags","qualifiedName":"Tey.Git.tags","signatures":["tags(url: String) -> Result<[String], String>"],"summary":"Every version-shaped tag a repository publishes, newest first. Used to answer a range requirement, and to list installable Kex toolchains.","types":["String","Result<[String], String>"],"urlPath":"tey/git"},{"anchor":"module-tey-local","kind":"module","line":1,"name":"Tey.Local","qualifiedName":"Tey.Local","signatures":["load(context: Context) -> Result<[Override], String>","set(context: Context, name: String, path: String) -> Result<String, String>","remove(context: Context, name: String) -> Result<String, String>","validateAgainstLock(overrides: [Override], lock: Tey.Lockfile.LockState) -> Result<Void, String>"],"summary":"","types":["String","ManifestPackage","Context","Result<[Override], String>","Result<String, String>","[Override]","Tey.Lockfile.LockState","Result<Void, String>"],"urlPath":"tey/local"},{"anchor":"record-tey-local-override","kind":"record","line":8,"name":"Override","qualifiedName":"Tey.Local.Override","signatures":[],"summary":"","types":["String","ManifestPackage"],"urlPath":"tey/local"},{"anchor":"function-tey-local-load","kind":"function","line":15,"name":"load","qualifiedName":"Tey.Local.load","signatures":["load(context: Context) -> Result<[Override], String>"],"summary":"","types":["Context","Result<[Override], String>"],"urlPath":"tey/local"},{"anchor":"function-tey-local-set","kind":"function","line":21,"name":"set","qualifiedName":"Tey.Local.set","signatures":["set(context: Context, name: String, path: String) -> Result<String, String>"],"summary":"","types":["Context","String","Result<String, String>"],"urlPath":"tey/local"},{"anchor":"function-tey-local-remove","kind":"function","line":51,"name":"remove","qualifiedName":"Tey.Local.remove","signatures":["remove(context: Context, name: String) -> Result<String, String>"],"summary":"","types":["Context","String","Result<String, String>"],"urlPath":"tey/local"},{"anchor":"function-tey-local-validateagainstlock","kind":"function","line":69,"name":"validateAgainstLock","qualifiedName":"Tey.Local.validateAgainstLock","signatures":["validateAgainstLock(overrides: [Override], lock: Tey.Lockfile.LockState) -> Result<Void, String>"],"summary":"","types":["[Override]","Tey.Lockfile.LockState","Result<Void, String>"],"urlPath":"tey/local"},{"anchor":"module-tey-lockfile","kind":"module","line":4,"name":"Tey.Lockfile","qualifiedName":"Tey.Lockfile","signatures":["encode(lock: LockState) -> String","dependencyName(dep: Dependency) -> String","dependencyGit(dep: Dependency) -> String","dependencyCommit(dep: Dependency) -> String","dependencySha256(dep: Dependency) -> String","dependencyGroups(dep: Dependency) -> [String]","dependencyListLine(dep: Dependency) -> String","decode(text: String) -> Result<LockState, String>"],"summary":"Pure, and declared so. Reading and writing `tey.lock` is somebody else's job — this module only turns the text into a LockState and back, which is what makes the whole format testable without a disk (tey/spec/lockfile.spec.kex).","types":["String","[String]","{String: String}","Bool","Integer","[Dependency]","LockState","Dependency","Result<LockState, String>"],"urlPath":"tey/lockfile"},{"anchor":"record-tey-lockfile-dependency","kind":"record","line":8,"name":"Dependency","qualifiedName":"Tey.Lockfile.Dependency","signatures":[],"summary":"","types":["String","[String]","{String: String}","Bool"],"urlPath":"tey/lockfile"},{"anchor":"record-tey-lockfile-lockstate","kind":"record","line":24,"name":"LockState","qualifiedName":"Tey.Lockfile.LockState","signatures":[],"summary":"","types":["String","Integer","{String: String}","[Dependency]"],"urlPath":"tey/lockfile"},{"anchor":"function-tey-lockfile-encode","kind":"function","line":44,"name":"encode","qualifiedName":"Tey.Lockfile.encode","signatures":["encode(lock: LockState) -> String"],"summary":"","types":["LockState","String"],"urlPath":"tey/lockfile"},{"anchor":"function-tey-lockfile-dependencyname","kind":"function","line":73,"name":"dependencyName","qualifiedName":"Tey.Lockfile.dependencyName","signatures":["dependencyName(dep: Dependency) -> String"],"summary":"","types":["Dependency","String"],"urlPath":"tey/lockfile"},{"anchor":"function-tey-lockfile-dependencygit","kind":"function","line":74,"name":"dependencyGit","qualifiedName":"Tey.Lockfile.dependencyGit","signatures":["dependencyGit(dep: Dependency) -> String"],"summary":"","types":["Dependency","String"],"urlPath":"tey/lockfile"},{"anchor":"function-tey-lockfile-dependencycommit","kind":"function","line":75,"name":"dependencyCommit","qualifiedName":"Tey.Lockfile.dependencyCommit","signatures":["dependencyCommit(dep: Dependency) -> String"],"summary":"","types":["Dependency","String"],"urlPath":"tey/lockfile"},{"anchor":"function-tey-lockfile-dependencysha256","kind":"function","line":76,"name":"dependencySha256","qualifiedName":"Tey.Lockfile.dependencySha256","signatures":["dependencySha256(dep: Dependency) -> String"],"summary":"","types":["Dependency","String"],"urlPath":"tey/lockfile"},{"anchor":"function-tey-lockfile-dependencygroups","kind":"function","line":77,"name":"dependencyGroups","qualifiedName":"Tey.Lockfile.dependencyGroups","signatures":["dependencyGroups(dep: Dependency) -> [String]"],"summary":"","types":["Dependency","[String]"],"urlPath":"tey/lockfile"},{"anchor":"function-tey-lockfile-dependencylistline","kind":"function","line":78,"name":"dependencyListLine","qualifiedName":"Tey.Lockfile.dependencyListLine","signatures":["dependencyListLine(dep: Dependency) -> String"],"summary":"","types":["Dependency","String"],"urlPath":"tey/lockfile"},{"anchor":"function-tey-lockfile-decode","kind":"function","line":84,"name":"decode","qualifiedName":"Tey.Lockfile.decode","signatures":["decode(text: String) -> Result<LockState, String>"],"summary":"","types":["String","Result<LockState, String>"],"urlPath":"tey/lockfile"},{"anchor":"module-tey-manifest","kind":"module","line":1,"name":"Tey.Manifest","qualifiedName":"Tey.Manifest","signatures":["read(text: String) -> Result<ManifestPackage, String>","readWorkspace(text: String) -> Result<ManifestWorkspace, String>","readLocal(text: String) -> Result<[LocalOverride], String>"],"summary":"","types":["String","DependencySource","[String]","[PluginOption]","[PluginCapability]","[PluginOperation]","[Dependency]","[Target]","[Command]","Toolchain?","ManifestWorkspace?","[Plugin]","Result<ManifestPackage, String>","Result<ManifestWorkspace, String>","Result<[LocalOverride], String>"],"urlPath":"tey/manifest"},{"anchor":"type-tey-manifest-dependencysource","kind":"type","line":5,"name":"DependencySource","qualifiedName":"Tey.Manifest.DependencySource","signatures":[],"summary":"","types":["String","String","String","String","String"],"urlPath":"tey/manifest"},{"anchor":"record-tey-manifest-dependency","kind":"record","line":10,"name":"Dependency","qualifiedName":"Tey.Manifest.Dependency","signatures":[],"summary":"","types":["String","DependencySource","[String]"],"urlPath":"tey/manifest"},{"anchor":"record-tey-manifest-manifestworkspace","kind":"record","line":16,"name":"ManifestWorkspace","qualifiedName":"Tey.Manifest.ManifestWorkspace","signatures":[],"summary":"","types":["[String]"],"urlPath":"tey/manifest"},{"anchor":"record-tey-manifest-localoverride","kind":"record","line":20,"name":"LocalOverride","qualifiedName":"Tey.Manifest.LocalOverride","signatures":[],"summary":"","types":["String"],"urlPath":"tey/manifest"},{"anchor":"record-tey-manifest-target","kind":"record","line":25,"name":"Target","qualifiedName":"Tey.Manifest.Target","signatures":[],"summary":"","types":["String"],"urlPath":"tey/manifest"},{"anchor":"record-tey-manifest-plugincapability","kind":"record","line":30,"name":"PluginCapability","qualifiedName":"Tey.Manifest.PluginCapability","signatures":[],"summary":"","types":["String","[String]"],"urlPath":"tey/manifest"},{"anchor":"record-tey-manifest-pluginoption","kind":"record","line":35,"name":"PluginOption","qualifiedName":"Tey.Manifest.PluginOption","signatures":[],"summary":"","types":["String"],"urlPath":"tey/manifest"},{"anchor":"record-tey-manifest-pluginoperation","kind":"record","line":40,"name":"PluginOperation","qualifiedName":"Tey.Manifest.PluginOperation","signatures":[],"summary":"","types":["String","[PluginOption]"],"urlPath":"tey/manifest"},{"anchor":"record-tey-manifest-plugin","kind":"record","line":46,"name":"Plugin","qualifiedName":"Tey.Manifest.Plugin","signatures":[],"summary":"","types":["String","[PluginCapability]","[PluginOperation]"],"urlPath":"tey/manifest"},{"anchor":"record-tey-manifest-command","kind":"record","line":60,"name":"Command","qualifiedName":"Tey.Manifest.Command","signatures":[],"summary":"A project-specific command, run as `tey <name>`. Without these every package grows a Makefile or a bin/ script beside package.kex for \"the way you run the linter\", which the manifest — the one file a newcomer reads — says nothing about.\n\nA name is one word, grouped with a colon: `db:migrate`, `assets:build`.","types":["String"],"urlPath":"tey/manifest"},{"anchor":"record-tey-manifest-toolchain","kind":"record","line":81,"name":"Toolchain","qualifiedName":"Tey.Manifest.Toolchain","signatures":[],"summary":"A toolchain package: the compiler executable plus the runtime and standard library it was built with, installed together so the three can never drift apart. Kex's own `package.kex` is the one that declares it — and a reader that did not know the declaration could not run any tey command from the compiler's own checkout, which is where it is most used.\n\nFields are prefixed like Command's: a bare `compiler` would be read as a method on an unpinned receiver before it is read as a field here.","types":["String"],"urlPath":"tey/manifest"},{"anchor":"record-tey-manifest-manifestpackage","kind":"record","line":88,"name":"ManifestPackage","qualifiedName":"Tey.Manifest.ManifestPackage","signatures":[],"summary":"","types":["String","[Dependency]","[Target]","[Command]","Toolchain?","ManifestWorkspace?","[Plugin]"],"urlPath":"tey/manifest"},{"anchor":"constant-tey-manifest-reservedcommands","kind":"constant","line":122,"name":"reservedCommands","qualifiedName":"Tey.Manifest.reservedCommands","signatures":[],"summary":"The command names Tey answers itself. A `command(...)` may not take one of them: `tey test` must mean the same thing in every checkout, so a manifest that tries to redefine it is an error at read time rather than a silent shadow. Kept here because the READER is what enforces it, and Tey.Cli cannot be asked: it is built on this module, so reading the list off its declared commands would be a cycle. The two have to be kept in step by hand — one `.command(...)` in Tey.Cli, one name here (the first word is enough: `kex` covers every `kex ...` subcommand).","types":["[String]"],"urlPath":"tey/manifest"},{"anchor":"function-tey-manifest-read","kind":"function","line":132,"name":"read","qualifiedName":"Tey.Manifest.read","signatures":["read(text: String) -> Result<ManifestPackage, String>"],"summary":"Reads a `package.kex`.\n\nThe compiler parses the manifest. Tey only interprets the resulting Kex AST, so comments, multiline calls, strings, and future grammar fixes cannot drift from the language that actually compiles package.kex.","types":["String","Result<ManifestPackage, String>"],"urlPath":"tey/manifest"},{"anchor":"function-tey-manifest-readworkspace","kind":"function","line":329,"name":"readWorkspace","qualifiedName":"Tey.Manifest.readWorkspace","signatures":["readWorkspace(text: String) -> Result<ManifestWorkspace, String>"],"summary":"Reads a virtual-workspace manifest: a package.kex whose root is `workspace` rather than a publishable package. Package-root workspaces are returned on ManifestPackage.manifestWorkspace by `read` above.","types":["String","Result<ManifestWorkspace, String>"],"urlPath":"tey/manifest"},{"anchor":"function-tey-manifest-readlocal","kind":"function","line":344,"name":"readLocal","qualifiedName":"Tey.Manifest.readLocal","signatures":["readLocal(text: String) -> Result<[LocalOverride], String>"],"summary":"","types":["String","Result<[LocalOverride], String>"],"urlPath":"tey/manifest"},{"anchor":"module-tey-plugin","kind":"module","line":1,"name":"Tey.Plugin","qualifiedName":"Tey.Plugin","signatures":["fingerprint(plugin: Plugin) -> String","fingerprints(plugins: [Plugin]) -> {String: String}","approved?(plugin: Plugin, approvals: {String: String}) -> Bool","missingApprovals(plugins: [Plugin], approvals: {String: String}) -> [Plugin]","validApprovals(plugins: [Plugin], approvals: {String: String}) -> {String: String}","bindingApproved?(binding: Binding, approvals: {String: String}) -> Bool","missingBindingApprovals(bindings: [Binding], approvals: {String: String}) -> [Binding]","validBindingApprovals(bindings: [Binding], approvals: {String: String}) -> {String: String}","validateScopes(globals: [Binding], locals: [Binding]) -> Result<Void, String>","visibleBinding(bindings: [Binding], namespace: String, currentMember: String?) -> Result<Binding, String>","generator(binding: Binding, name: String) -> Result<PluginOperation, String>"],"summary":"","types":["String","Plugin","[Plugin]","{String: String}","Bool","Binding","[Binding]","Result<Void, String>","String?","Result<Binding, String>","Result<PluginOperation, String>"],"urlPath":"tey/plugin"},{"anchor":"record-tey-plugin-binding","kind":"record","line":5,"name":"Binding","qualifiedName":"Tey.Plugin.Binding","signatures":[],"summary":"","types":["String","Plugin"],"urlPath":"tey/plugin"},{"anchor":"function-tey-plugin-fingerprint","kind":"function","line":14,"name":"fingerprint","qualifiedName":"Tey.Plugin.fingerprint","signatures":["fingerprint(plugin: Plugin) -> String"],"summary":"Fingerprints only the declared interface and requested resources. Provider implementation changes do not silently revoke approval; a capability, command schema, generator schema, or supported-Tey change does.","types":["Plugin","String"],"urlPath":"tey/plugin"},{"anchor":"function-tey-plugin-fingerprints","kind":"function","line":18,"name":"fingerprints","qualifiedName":"Tey.Plugin.fingerprints","signatures":["fingerprints(plugins: [Plugin]) -> {String: String}"],"summary":"","types":["[Plugin]","{String: String}"],"urlPath":"tey/plugin"},{"anchor":"function-tey-plugin-approved?","kind":"function","line":25,"name":"approved?","qualifiedName":"Tey.Plugin.approved?","signatures":["approved?(plugin: Plugin, approvals: {String: String}) -> Bool"],"summary":"","types":["Plugin","{String: String}","Bool"],"urlPath":"tey/plugin"},{"anchor":"function-tey-plugin-missingapprovals","kind":"function","line":29,"name":"missingApprovals","qualifiedName":"Tey.Plugin.missingApprovals","signatures":["missingApprovals(plugins: [Plugin], approvals: {String: String}) -> [Plugin]"],"summary":"","types":["[Plugin]","{String: String}"],"urlPath":"tey/plugin"},{"anchor":"function-tey-plugin-validapprovals","kind":"function","line":36,"name":"validApprovals","qualifiedName":"Tey.Plugin.validApprovals","signatures":["validApprovals(plugins: [Plugin], approvals: {String: String}) -> {String: String}"],"summary":"Keeps only approvals still backed by an identical visible declaration. This is used when a lock is refreshed: removed plugins and interfaces whose resources changed cannot inherit an old authorization.","types":["[Plugin]","{String: String}"],"urlPath":"tey/plugin"},{"anchor":"function-tey-plugin-bindingapproved?","kind":"function","line":46,"name":"bindingApproved?","qualifiedName":"Tey.Plugin.bindingApproved?","signatures":["bindingApproved?(binding: Binding, approvals: {String: String}) -> Bool"],"summary":"","types":["Binding","{String: String}","Bool"],"urlPath":"tey/plugin"},{"anchor":"function-tey-plugin-missingbindingapprovals","kind":"function","line":52,"name":"missingBindingApprovals","qualifiedName":"Tey.Plugin.missingBindingApprovals","signatures":["missingBindingApprovals(bindings: [Binding], approvals: {String: String}) -> [Binding]"],"summary":"","types":["[Binding]","{String: String}"],"urlPath":"tey/plugin"},{"anchor":"function-tey-plugin-validbindingapprovals","kind":"function","line":59,"name":"validBindingApprovals","qualifiedName":"Tey.Plugin.validBindingApprovals","signatures":["validBindingApprovals(bindings: [Binding], approvals: {String: String}) -> {String: String}"],"summary":"","types":["[Binding]","{String: String}"],"urlPath":"tey/plugin"},{"anchor":"function-tey-plugin-validatescopes","kind":"function","line":71,"name":"validateScopes","qualifiedName":"Tey.Plugin.validateScopes","signatures":["validateScopes(globals: [Binding], locals: [Binding]) -> Result<Void, String>"],"summary":"","types":["[Binding]","Result<Void, String>"],"urlPath":"tey/plugin"},{"anchor":"function-tey-plugin-visiblebinding","kind":"function","line":95,"name":"visibleBinding","qualifiedName":"Tey.Plugin.visibleBinding","signatures":["visibleBinding(bindings: [Binding], namespace: String, currentMember: String?) -> Result<Binding, String>"],"summary":"","types":["[Binding]","String","String?","Result<Binding, String>"],"urlPath":"tey/plugin"},{"anchor":"function-tey-plugin-generator","kind":"function","line":118,"name":"generator","qualifiedName":"Tey.Plugin.generator","signatures":["generator(binding: Binding, name: String) -> Result<PluginOperation, String>"],"summary":"","types":["Binding","String","Result<PluginOperation, String>"],"urlPath":"tey/plugin"},{"anchor":"module-tey-pluginhost","kind":"module","line":1,"name":"Tey.PluginHost","qualifiedName":"Tey.PluginHost","signatures":["encodeInvocation(invocation: Invocation) -> String","typedOptions(operation: Tey.Manifest.PluginOperation, supplied: {String: String}) -> Result<{String: Any}, String>"],"summary":"","types":["String","String?","{String: String}","[Tey.Lockfile.Dependency]","Tey.Lockfile.LockState","Tey.Toolchain.ToolchainInfo","[String]","{String: Any}","Invocation","Tey.Manifest.PluginOperation","Result<{String: Any}, String>"],"urlPath":"tey/pluginhost"},{"anchor":"record-tey-pluginhost-invocation","kind":"record","line":5,"name":"Invocation","qualifiedName":"Tey.PluginHost.Invocation","signatures":[],"summary":"","types":["String","String?","{String: String}","[Tey.Lockfile.Dependency]","Tey.Lockfile.LockState","Tey.Toolchain.ToolchainInfo","[String]","{String: Any}"],"urlPath":"tey/pluginhost"},{"anchor":"function-tey-pluginhost-encodeinvocation","kind":"function","line":23,"name":"encodeInvocation","qualifiedName":"Tey.PluginHost.encodeInvocation","signatures":["encodeInvocation(invocation: Invocation) -> String"],"summary":"The host-to-child half of protocol version 1. It is deliberately ordinary JSON rather than Kex source: a plugin receives data and cannot make Tey evaluate declarations smuggled into its context.","types":["Invocation","String"],"urlPath":"tey/pluginhost"},{"anchor":"function-tey-pluginhost-typedoptions","kind":"function","line":68,"name":"typedOptions","qualifiedName":"Tey.PluginHost.typedOptions","signatures":["typedOptions(operation: Tey.Manifest.PluginOperation, supplied: {String: String}) -> Result<{String: Any}, String>"],"summary":"","types":["Tey.Manifest.PluginOperation","{String: String}","Result<{String: Any}, String>"],"urlPath":"tey/pluginhost"},{"anchor":"module-tey-resolver","kind":"module","line":1,"name":"Tey.Resolver","qualifiedName":"Tey.Resolver","signatures":["fingerprint(context: Context) -> String","resolveWorkspace(context: Context) -> Result<LockState, String>","resolveWorkspaceWithInfo(context: Context, toolchain: Tey.Toolchain.ToolchainInfo) -> Result<LockState, String>","resolvePackage(manifest: ManifestPackage) -> Result<LockState, String>"],"summary":"","types":["Context","String","Result<LockState, String>","Tey.Toolchain.ToolchainInfo","ManifestPackage"],"urlPath":"tey/resolver"},{"anchor":"function-tey-resolver-fingerprint","kind":"function","line":13,"name":"fingerprint","qualifiedName":"Tey.Resolver.fingerprint","signatures":["fingerprint(context: Context) -> String"],"summary":"","types":["Context","String"],"urlPath":"tey/resolver"},{"anchor":"function-tey-resolver-resolveworkspace","kind":"function","line":17,"name":"resolveWorkspace","qualifiedName":"Tey.Resolver.resolveWorkspace","signatures":["resolveWorkspace(context: Context) -> Result<LockState, String>"],"summary":"","types":["Context","Result<LockState, String>"],"urlPath":"tey/resolver"},{"anchor":"function-tey-resolver-resolveworkspacewithinfo","kind":"function","line":25,"name":"resolveWorkspaceWithInfo","qualifiedName":"Tey.Resolver.resolveWorkspaceWithInfo","signatures":["resolveWorkspaceWithInfo(context: Context, toolchain: Tey.Toolchain.ToolchainInfo) -> Result<LockState, String>"],"summary":"The caller may already have inspected the selected compiler while deciding whether an existing lock is reusable. Passing that result through keeps the `--info` contract to one invocation per install/resolve decision.","types":["Context","Tey.Toolchain.ToolchainInfo","Result<LockState, String>"],"urlPath":"tey/resolver"},{"anchor":"function-tey-resolver-resolvepackage","kind":"function","line":109,"name":"resolvePackage","qualifiedName":"Tey.Resolver.resolvePackage","signatures":["resolvePackage(manifest: ManifestPackage) -> Result<LockState, String>"],"summary":"","types":["ManifestPackage","Result<LockState, String>"],"urlPath":"tey/resolver"},{"anchor":"module-tey-selfupdate","kind":"module","line":1,"name":"Tey.SelfUpdate","qualifiedName":"Tey.SelfUpdate","signatures":["currentPrefix : String?","prefixOf(ebin: String) -> String?","homebrewManaged?(prefix: String) -> Bool","manifestVersion(text: String) -> String?","compareVersions(a: String, b: String) -> Ordering","carryBakedErlText(oldLauncher: String, newLauncher: String) -> String","tagFor(tags: [String], version: String) -> String?","upgradeLatest(includePre: Bool) -> Result<UpgradeOutcome, String>","upgradePinned(version: String) -> Result<UpgradeOutcome, String>"],"summary":"","types":["String","String?","Bool","Ordering","[String]","Result<UpgradeOutcome, String>"],"urlPath":"tey/self_update"},{"anchor":"type-tey-selfupdate-upgradeoutcome","kind":"type","line":17,"name":"UpgradeOutcome","qualifiedName":"Tey.SelfUpdate.UpgradeOutcome","signatures":[],"summary":"Upgrading Tey itself (`tey upgrade`), for installs that came from a release archive rather than a package manager — see `install.sh` at the repository root. A Homebrew-managed Tey is brew's to upgrade and is refused here.\n\nTey has its own version and its own cadence (`tey/package.kex`), so it cannot reuse the Kex tag list directly: the newest Tey is the one the newest Kex release's manifest declares. That manifest is read over plain HTTPS (raw.githubusercontent.com) with the same curl-then-wget idiom `Tey.Toolchain.download` already uses — no GitHub API, no rate limits, no clone. The archive itself is the `tey-<version>.tar.gz` the release workflow publishes beside the Kex archives, under the same tag.\n\nWhat `tey upgrade` found: either the version it installed and where, or why there was nothing to install.","types":["String","String","String","String"],"urlPath":"tey/self_update"},{"anchor":"function-tey-selfupdate-currentprefix","kind":"function","line":26,"name":"currentPrefix","qualifiedName":"Tey.SelfUpdate.currentPrefix","signatures":["currentPrefix : String?"],"summary":"Where this Tey is installed, or None when it cannot be told — outside an installed launcher (a source checkout, `erl` by hand) there is nothing safe to overwrite. `tey/bin/tey` exports TEY_EBIN before invoking the BEAM, so a released install always knows.","types":["String?"],"urlPath":"tey/self_update"},{"anchor":"function-tey-selfupdate-prefixof","kind":"function","line":36,"name":"prefixOf","qualifiedName":"Tey.SelfUpdate.prefixOf","signatures":["prefixOf(ebin: String) -> String?"],"summary":"TEY_EBIN with the trailing `/lib/kex/tey/ebin` stripped. Anything else — unset, empty, a checkout's `tey/ebin` — is None: there is no install prefix to upgrade in place.","types":["String","String?"],"urlPath":"tey/self_update"},{"anchor":"function-tey-selfupdate-homebrewmanaged?","kind":"function","line":45,"name":"homebrewManaged?","qualifiedName":"Tey.SelfUpdate.homebrewManaged?","signatures":["homebrewManaged?(prefix: String) -> Bool"],"summary":"Whether this install belongs to Homebrew, whose keg bookkeeping Tey must not fight: that Tey upgrades with `brew upgrade tey`.","types":["String","Bool"],"urlPath":"tey/self_update"},{"anchor":"function-tey-selfupdate-manifestversion","kind":"function","line":52,"name":"manifestVersion","qualifiedName":"Tey.SelfUpdate.manifestVersion","signatures":["manifestVersion(text: String) -> String?"],"summary":"The `version(\"...\")` line of a `package.kex` manifest, read as plain text. The manifest reader cannot be used here: it parses a LOCAL package through the selected compiler, and this text was just downloaded, not installed.","types":["String","String?"],"urlPath":"tey/self_update"},{"anchor":"function-tey-selfupdate-compareversions","kind":"function","line":71,"name":"compareVersions","qualifiedName":"Tey.SelfUpdate.compareVersions","signatures":["compareVersions(a: String, b: String) -> Ordering"],"summary":"Ordering for two version strings, for the already-newest guard. Something unparsable compares as older: a hand-edited development version must never read as \"newer than every release\" and refuse its own upgrade.\n\nWritten over `newer?` rather than `compare` on purpose: a trait method from another module's `make ..., implement: Comparable` does not dispatch to a custom record from outside that module on the BEAM backend, while a plain `let` like `newer?` calls anywhere.","types":["String","Ordering"],"urlPath":"tey/self_update"},{"anchor":"function-tey-selfupdate-carrybakederltext","kind":"function","line":82,"name":"carryBakedErlText","qualifiedName":"Tey.SelfUpdate.carryBakedErlText","signatures":["carryBakedErlText(oldLauncher: String, newLauncher: String) -> String"],"summary":"A source install (`make -C tey install`) bakes an absolute `erl` into `bin/tey`; release archives bake a bare `erl` resolved from PATH. Upgrading must not silently move the former onto the latter, so the old absolute path is carried into the new launcher. Anything else (no line, a relative `erl`, the dev placeholder) leaves the new launcher exactly as published.","types":["String"],"urlPath":"tey/self_update"},{"anchor":"function-tey-selfupdate-tagfor","kind":"function","line":100,"name":"tagFor","qualifiedName":"Tey.SelfUpdate.tagFor","signatures":["tagFor(tags: [String], version: String) -> String?"],"summary":"The tag naming a Kex version, resolved against a tag list read once — `Tey.Toolchain.releaseTag` answers the same question but re-lists the tags on every call, which a pinned-version scan cannot afford.","types":["[String]","String","String?"],"urlPath":"tey/self_update"},{"anchor":"function-tey-selfupdate-upgradelatest","kind":"function","line":109,"name":"upgradeLatest","qualifiedName":"Tey.SelfUpdate.upgradeLatest","signatures":["upgradeLatest(includePre: Bool) -> Result<UpgradeOutcome, String>"],"summary":"`tey upgrade` — the newest released Tey: the one the newest Kex release's manifest declares. Stable Kex releases unless `includePre` (`--pre`), which is how a pre-release Tey is reached without knowing its number.","types":["Bool","Result<UpgradeOutcome, String>"],"urlPath":"tey/self_update"},{"anchor":"function-tey-selfupdate-upgradepinned","kind":"function","line":131,"name":"upgradePinned","qualifiedName":"Tey.SelfUpdate.upgradePinned","signatures":["upgradePinned(version: String) -> Result<UpgradeOutcome, String>"],"summary":"`tey upgrade <version>` — exactly that Tey, from the newest release (stable first, then pre-releases) whose manifest declares it. An older version is allowed: pinning is explicit, and it is the way back from a bad release.","types":["String","Result<UpgradeOutcome, String>"],"urlPath":"tey/self_update"},{"anchor":"module-tey-semver","kind":"module","line":1,"name":"Tey.Semver","qualifiedName":"Tey.Semver","signatures":["compare(other: SemanticVersion) -> Ordering","parseVersion(text: String) -> SemanticVersion?","release(text: String) -> String","stable?(text: String) -> Bool","satisfies(versionText: String, requirement: String) -> Bool","intersect(a: String, b: String) -> String","intersectAll(requirements: [String]) -> String","versionOf(ref: String) -> String","channelRank(channel: String) -> Integer","range?(requested: String) -> Bool","newer?(a: String, b: String) -> Bool","newestFirst(versions: [String]) -> [String]","highest(tags: [String], requirement: String) -> String?"],"summary":"","types":["Integer","String","SemanticVersion","Ordering","SemanticVersion?","Bool","[String]","String?"],"urlPath":"tey/semver"},{"anchor":"record-tey-semver-semanticversion","kind":"record","line":3,"name":"SemanticVersion","qualifiedName":"Tey.Semver.SemanticVersion","signatures":[],"summary":"","types":["Integer","String"],"urlPath":"tey/semver"},{"anchor":"make-semanticversion","kind":"make","line":15,"name":"SemanticVersion","qualifiedName":"SemanticVersion","signatures":["compare(other: SemanticVersion) -> Ordering"],"summary":"SemanticVersion is Comparable, so `a.compare(b)` answers Less/Equal/Greater like every other ordered type in the stdlib, and ordering reads as an ordering rather than as sign arithmetic on -1/0/1.","types":["SemanticVersion","Ordering"],"urlPath":"tey/semver"},{"anchor":"semanticversion-compare","kind":"function","line":16,"name":"compare","qualifiedName":"SemanticVersion.compare","signatures":["compare(other: SemanticVersion) -> Ordering"],"summary":"","types":["SemanticVersion","Ordering"],"urlPath":"tey/semver"},{"anchor":"function-tey-semver-parseversion","kind":"function","line":31,"name":"parseVersion","qualifiedName":"Tey.Semver.parseVersion","signatures":["parseVersion(text: String) -> SemanticVersion?"],"summary":"","types":["String","SemanticVersion?"],"urlPath":"tey/semver"},{"anchor":"function-tey-semver-release","kind":"function","line":50,"name":"release","qualifiedName":"Tey.Semver.release","signatures":["release(text: String) -> String"],"summary":"The release a version belongs to: `0.4.0-rc.1` → `0.4.0`. Used where a pre-release should count as its eventual release.","types":["String"],"urlPath":"tey/semver"},{"anchor":"function-tey-semver-stable?","kind":"function","line":59,"name":"stable?","qualifiedName":"Tey.Semver.stable?","signatures":["stable?(text: String) -> Bool"],"summary":"Whether a version is a full release rather than a pre-release. This is the question a download page asks: \"what is the current stable Kex?\".","types":["String","Bool"],"urlPath":"tey/semver"},{"anchor":"function-tey-semver-satisfies","kind":"function","line":66,"name":"satisfies","qualifiedName":"Tey.Semver.satisfies","signatures":["satisfies(versionText: String, requirement: String) -> Bool"],"summary":"","types":["String","Bool"],"urlPath":"tey/semver"},{"anchor":"function-tey-semver-intersect","kind":"function","line":103,"name":"intersect","qualifiedName":"Tey.Semver.intersect","signatures":["intersect(a: String, b: String) -> String"],"summary":"The requirement satisfied only by versions satisfying BOTH, for when two packages in one graph each ask for the same dependency.\n\nConcatenation, because `satisfies` already reads a requirement as a list of space-separated clauses that must ALL hold: `~> 0.1` and `>= 0.1.5` intersect to `~> 0.1 >= 0.1.5`, which is exactly the question \"satisfies both\". No interval arithmetic, no second implementation of the operators to keep in step with the first.\n\nAn empty intersection is not detected here, and deliberately: `~> 0.1 ~> 0.2` is perfectly well formed and simply matches nothing. Emptiness is a fact about the versions a repository actually publishes, so it is discovered where the tags are (`highest`), where the error can also say what WAS available.","types":["String"],"urlPath":"tey/semver"},{"anchor":"function-tey-semver-intersectall","kind":"function","line":114,"name":"intersectAll","qualifiedName":"Tey.Semver.intersectAll","signatures":["intersectAll(requirements: [String]) -> String"],"summary":"Every constraint at once. `[]` and `[\"\"]` both mean \"no opinion\", which is what a package with no version requirement expresses.","types":["[String]","String"],"urlPath":"tey/semver"},{"anchor":"function-tey-semver-versionof","kind":"function","line":123,"name":"versionOf","qualifiedName":"Tey.Semver.versionOf","signatures":["versionOf(ref: String) -> String"],"summary":"The version inside a resolved ref: `refs/tags/v0.1.1` and `v0.1.1` both give `0.1.1`. A ref that carries no version (a branch name, a bare commit) gives \"\", which satisfies nothing and so never claims to meet a range.","types":["String"],"urlPath":"tey/semver"},{"anchor":"function-tey-semver-channelrank","kind":"function","line":133,"name":"channelRank","qualifiedName":"Tey.Semver.channelRank","signatures":["channelRank(channel: String) -> Integer"],"summary":"Channel precedence, lowest first: prealpha < alpha < beta < rc < release. Plain semver would order these alphabetically — putting `beta` BEFORE `prealpha` — which is not what the words mean, so the ranking is explicit.","types":["String","Integer"],"urlPath":"tey/semver"},{"anchor":"function-tey-semver-range?","kind":"function","line":144,"name":"range?","qualifiedName":"Tey.Semver.range?","signatures":["range?(requested: String) -> Bool"],"summary":"Whether a requested tag is a RANGE rather than one exact tag. `v1.2.0` is a name to look up; `~> 1.2` is a question to answer against everything the repository has.","types":["String","Bool"],"urlPath":"tey/semver"},{"anchor":"function-tey-semver-newer?","kind":"function","line":153,"name":"newer?","qualifiedName":"Tey.Semver.newer?","signatures":["newer?(a: String, b: String) -> Bool"],"summary":"Descending semantic order, for picking the newest of anything. A tag that is not a version sorts after every tag that is, so a stray `nightly` can never displace a release.","types":["String","Bool"],"urlPath":"tey/semver"},{"anchor":"function-tey-semver-newestfirst","kind":"function","line":162,"name":"newestFirst","qualifiedName":"Tey.Semver.newestFirst","signatures":["newestFirst(versions: [String]) -> [String]"],"summary":"","types":["[String]"],"urlPath":"tey/semver"},{"anchor":"function-tey-semver-highest","kind":"function","line":170,"name":"highest","qualifiedName":"Tey.Semver.highest","signatures":["highest(tags: [String], requirement: String) -> String?"],"summary":"The highest tag that satisfies the requirement — the whole point of writing a range instead of a version. None when nothing does.","types":["[String]","String","String?"],"urlPath":"tey/semver"},{"anchor":"module-tey-snapshot","kind":"module","line":1,"name":"Tey.Snapshot","qualifiedName":"Tey.Snapshot","signatures":["create(name: String, declaredPath: String, declaringRoot: String) -> Result<Tey.Lockfile.Dependency, String>","cachedPath(dependency: Tey.Lockfile.Dependency) -> String","verify(dependency: Tey.Lockfile.Dependency) -> Result<String, String>"],"summary":"","types":["String","Result<Tey.Lockfile.Dependency, String>","Tey.Lockfile.Dependency","Result<String, String>"],"urlPath":"tey/snapshot"},{"anchor":"function-tey-snapshot-create","kind":"function","line":9,"name":"create","qualifiedName":"Tey.Snapshot.create","signatures":["create(name: String, declaredPath: String, declaringRoot: String) -> Result<Tey.Lockfile.Dependency, String>"],"summary":"Turns a path dependency into an immutable, content-addressed cache entry. The declared path remains in the lockfile for explanation; builds use the snapshot identified by `sha256`, never the live directory.","types":["String","Result<Tey.Lockfile.Dependency, String>"],"urlPath":"tey/snapshot"},{"anchor":"function-tey-snapshot-cachedpath","kind":"function","line":47,"name":"cachedPath","qualifiedName":"Tey.Snapshot.cachedPath","signatures":["cachedPath(dependency: Tey.Lockfile.Dependency) -> String"],"summary":"","types":["Tey.Lockfile.Dependency","String"],"urlPath":"tey/snapshot"},{"anchor":"function-tey-snapshot-verify","kind":"function","line":51,"name":"verify","qualifiedName":"Tey.Snapshot.verify","signatures":["verify(dependency: Tey.Lockfile.Dependency) -> Result<String, String>"],"summary":"","types":["Tey.Lockfile.Dependency","Result<String, String>"],"urlPath":"tey/snapshot"},{"anchor":"module-tey-toolchain","kind":"module","line":1,"name":"Tey.Toolchain","qualifiedName":"Tey.Toolchain","signatures":["home : String","repository : String","binDirectory : String","shimPath : String","selected : String?","installedVersions : [String]","binaryOf(version: String) -> String","installed?(version: String) -> Bool","availableVersions : Result<[String], String>","newestFirst(versions: [String]) -> [String]","latestStable : Result<String, String>","latestIncludingPreReleases : Result<String, String>","installedKex : String?","bundled : String?","bundledVersion : String?","selectableToolchains : [Toolchain]","selectableVersions : [String]","resolveSelector(selector: String) -> String?","kex : String","activeInfo : Result<ToolchainInfo, String>","runtimeOtpFloor : Integer?","runningOtpRelease : Integer?","erl : String","resolved : String?","installBundled : Result<String, String>","selectionHealthy? : Bool","installRelease(version: String) -> Result<String, String>","releaseBase : String","releaseTarget : Result<String, String>","installSource(source: String, version: String) -> Result<String, String>","uninstall(version: String) -> Result<String, String>","use(version: String) -> Bool","download(url: String, path: String) -> Result<Void, String>","verifyArchive(archive: String, checksumUrl: String) -> Result<Void, String>","checksumOf(path: String) -> Result<String, String>","releaseTag(version: String) -> Result<String, String>","versionOf(tag: String) -> String?","publish(staging: String, prefix: String) -> Result<String, String>"],"summary":"","types":["String","Integer?","String?","[String]","Bool","Result<[String], String>","Result<String, String>","[Toolchain]","Result<ToolchainInfo, String>","Result<Void, String>"],"urlPath":"tey/toolchain"},{"anchor":"record-tey-toolchain-toolchaininfo","kind":"record","line":10,"name":"ToolchainInfo","qualifiedName":"Tey.Toolchain.ToolchainInfo","signatures":[],"summary":"Facts reported by the compiler Tey selected for this project. This is deliberately not Kex.Kernel.VERSION: that names the compiler which built Tey itself, and a package may select a newer (or older) compiler to build its own sources.","types":["String","Integer?"],"urlPath":"tey/toolchain"},{"anchor":"function-tey-toolchain-home","kind":"function","line":15,"name":"home","qualifiedName":"Tey.Toolchain.home","signatures":["home : String"],"summary":"","types":["String"],"urlPath":"tey/toolchain"},{"anchor":"function-tey-toolchain-repository","kind":"function","line":22,"name":"repository","qualifiedName":"Tey.Toolchain.repository","signatures":["repository : String"],"summary":"Where `tey kex list` looks for releases. Overridable so a fork or a mirror can be used without patching Tey.","types":["String"],"urlPath":"tey/toolchain"},{"anchor":"function-tey-toolchain-bindirectory","kind":"function","line":29,"name":"binDirectory","qualifiedName":"Tey.Toolchain.binDirectory","signatures":["binDirectory : String"],"summary":"The directory holding the `kex` shim. It is what a user puts on PATH once; selecting a version repoints the shim rather than asking them to edit PATH again.","types":["String"],"urlPath":"tey/toolchain"},{"anchor":"function-tey-toolchain-shimpath","kind":"function","line":33,"name":"shimPath","qualifiedName":"Tey.Toolchain.shimPath","signatures":["shimPath : String"],"summary":"","types":["String"],"urlPath":"tey/toolchain"},{"anchor":"function-tey-toolchain-selected","kind":"function","line":38,"name":"selected","qualifiedName":"Tey.Toolchain.selected","signatures":["selected : String?"],"summary":"The version `tey kex use` last selected, if any.","types":["String?"],"urlPath":"tey/toolchain"},{"anchor":"function-tey-toolchain-installedversions","kind":"function","line":51,"name":"installedVersions","qualifiedName":"Tey.Toolchain.installedVersions","signatures":["installedVersions : [String]"],"summary":"Versions installed under this Tey home, newest first. Staging leftovers are not installations, and neither is a directory whose `bin/kex` is gone — a half-removed toolchain must not be offered as one somebody can run.","types":["[String]"],"urlPath":"tey/toolchain"},{"anchor":"function-tey-toolchain-binaryof","kind":"function","line":61,"name":"binaryOf","qualifiedName":"Tey.Toolchain.binaryOf","signatures":["binaryOf(version: String) -> String"],"summary":"The `bin/kex` naming an installed version — the toolchain layout every consumer (the shim, `resolved`, the listings) agrees on, in one place.","types":["String"],"urlPath":"tey/toolchain"},{"anchor":"function-tey-toolchain-installed?","kind":"function","line":65,"name":"installed?","qualifiedName":"Tey.Toolchain.installed?","signatures":["installed?(version: String) -> Bool"],"summary":"","types":["String","Bool"],"urlPath":"tey/toolchain"},{"anchor":"function-tey-toolchain-availableversions","kind":"function","line":71,"name":"availableVersions","qualifiedName":"Tey.Toolchain.availableVersions","signatures":["availableVersions : Result<[String], String>"],"summary":"Released versions, newest first, read from the repository's tags. Tags that are not versions are skipped rather than reported as junk.","types":["Result<[String], String>"],"urlPath":"tey/toolchain"},{"anchor":"function-tey-toolchain-newestfirst","kind":"function","line":83,"name":"newestFirst","qualifiedName":"Tey.Toolchain.newestFirst","signatures":["newestFirst(versions: [String]) -> [String]"],"summary":"","types":["[String]"],"urlPath":"tey/toolchain"},{"anchor":"function-tey-toolchain-lateststable","kind":"function","line":90,"name":"latestStable","qualifiedName":"Tey.Toolchain.latestStable","signatures":["latestStable : Result<String, String>"],"summary":"The newest RELEASED version — what `tey kex install` picks when asked for no version in particular, and what a download page means by \"the current Kex\". Pre-releases are opt-in by name.","types":["Result<String, String>"],"urlPath":"tey/toolchain"},{"anchor":"function-tey-toolchain-latestincludingprereleases","kind":"function","line":101,"name":"latestIncludingPreReleases","qualifiedName":"Tey.Toolchain.latestIncludingPreReleases","signatures":["latestIncludingPreReleases : Result<String, String>"],"summary":"The newest version of ANY channel — what `tey kex install --pre` picks. This is how you get onto a beta or an rc without knowing its number: during a pre-stability run there may be nothing else published at all.","types":["Result<String, String>"],"urlPath":"tey/toolchain"},{"anchor":"function-tey-toolchain-installedkex","kind":"function","line":109,"name":"installedKex","qualifiedName":"Tey.Toolchain.installedKex","signatures":["installedKex : String?"],"summary":"","types":["String?"],"urlPath":"tey/toolchain"},{"anchor":"function-tey-toolchain-bundled","kind":"function","line":127,"name":"bundled","qualifiedName":"Tey.Toolchain.bundled","signatures":["bundled : String?"],"summary":"The Kex bundled beside Tey — what a package manager lays down so the first `tey` command has a compiler without a ten-minute build. It is a SEED, not an installation: `kex` below adopts it into the Tey home on first use, and from then on Tey manages that copy like any other version. Nothing outside the Tey home is ever put on PATH, which is the whole point — two `kex` binaries under two managers drift apart.","types":["String?"],"urlPath":"tey/toolchain"},{"anchor":"function-tey-toolchain-bundledversion","kind":"function","line":137,"name":"bundledVersion","qualifiedName":"Tey.Toolchain.bundledVersion","signatures":["bundledVersion : String?"],"summary":"Which version the bundled Kex is. Answering means RUNNING it, so this is not something to ask inside a loop — but it is the only way to know: the seed is a plain install tree with no version recorded beside it.","types":["String?"],"urlPath":"tey/toolchain"},{"anchor":"record-tey-toolchain-toolchain","kind":"record","line":152,"name":"Toolchain","qualifiedName":"Tey.Toolchain.Toolchain","signatures":[],"summary":"One selectable Kex: the version `tey kex use` names it by, the binary that runs it, and whether it is the bundled seed lying beside Tey rather than an installation in the Tey home.","types":["String","Bool"],"urlPath":"tey/toolchain"},{"anchor":"function-tey-toolchain-selectabletoolchains","kind":"function","line":167,"name":"selectableToolchains","qualifiedName":"Tey.Toolchain.selectableToolchains","signatures":["selectableToolchains : [Toolchain]"],"summary":"Every version `tey kex use` can select, newest first: the ones in the Tey home, plus the bundled one — each carrying the binary that runs it, which is what a listing meant for tools (`kex list --installed --json`) needs.\n\nThe seed belongs here even though it is not installed. It is a real compiler already on the disk, and on a fresh keg it is the one a bare `kex` runs — so leaving it out made `tey kex use <that version>` refuse a version the user had just watched run, with no way back to it short of downloading a second copy of what was already there.","types":["[Toolchain]"],"urlPath":"tey/toolchain"},{"anchor":"function-tey-toolchain-selectableversions","kind":"function","line":182,"name":"selectableVersions","qualifiedName":"Tey.Toolchain.selectableVersions","signatures":["selectableVersions : [String]"],"summary":"Every version `tey kex use` can select, newest first.","types":["[String]"],"urlPath":"tey/toolchain"},{"anchor":"function-tey-toolchain-resolveselector","kind":"function","line":193,"name":"resolveSelector","qualifiedName":"Tey.Toolchain.resolveSelector","signatures":["resolveSelector(selector: String) -> String?"],"summary":"Turns what someone typed after `tey kex use` into a version number.\n\n`latest` means the newest Kex this machine can select — NOT the newest released one. `use` selects among what is already here; reaching for something unreleased-and-undownloaded is what `tey kex install` is for, and quietly downloading from a command that reads like \"switch to\" would be a surprise.","types":["String","String?"],"urlPath":"tey/toolchain"},{"anchor":"function-tey-toolchain-kex","kind":"function","line":205,"name":"kex","qualifiedName":"Tey.Toolchain.kex","signatures":["kex : String"],"summary":"The compiler every Tey command shells out to.\n\nIn order: an explicit TEY_KEX, the selected toolchain, the bundled seed (adopted on the spot), and only then a bare `kex` from PATH. That last one is a fallback for a source checkout, not a supported installation — a `kex` somebody else installed is a `kex` Tey cannot update, and it silently becomes a different version from the one `tey kex list` reports.","types":["String"],"urlPath":"tey/toolchain"},{"anchor":"function-tey-toolchain-activeinfo","kind":"function","line":212,"name":"activeInfo","qualifiedName":"Tey.Toolchain.activeInfo","signatures":["activeInfo : Result<ToolchainInfo, String>"],"summary":"Read the machine contract from the selected compiler. Keeping this in one call prevents dependency resolution and OTP validation from accidentally observing two different binaries if selection changes between them.","types":["Result<ToolchainInfo, String>"],"urlPath":"tey/toolchain"},{"anchor":"function-tey-toolchain-runtimeotpfloor","kind":"function","line":253,"name":"runtimeOtpFloor","qualifiedName":"Tey.Toolchain.runtimeOtpFloor","signatures":["runtimeOtpFloor : Integer?"],"summary":"The OTP release that compiled the selected toolchain's runtime beams — the oldest Erlang that can load them, since a `.beam` cannot be read by a runtime older than the `erlc` that produced it.\n\nRead from `kex --info` rather than guessed: the number is a build-time constant inside the binary (KEX_RUNTIME_OTP_FLOOR) and Tey has no other way to see it. `--version` is prose and may be reworded; `--info` is the contract (tests/info_cli_test.cxx pins it).\n\n`None` when the toolchain is too old to have `--info`, when the field is absent, or when it is `null` because the compiler was built without erlc. All three mean the same thing to a caller — \"this toolchain does not say\" — and none of them is an error worth stopping a build for.","types":["Integer?"],"urlPath":"tey/toolchain"},{"anchor":"function-tey-toolchain-runningotprelease","kind":"function","line":261,"name":"runningOtpRelease","qualifiedName":"Tey.Toolchain.runningOtpRelease","signatures":["runningOtpRelease : Integer?"],"summary":"The OTP actually about to run, asked of `erl` itself.","types":["Integer?"],"urlPath":"tey/toolchain"},{"anchor":"function-tey-toolchain-erl","kind":"function","line":277,"name":"erl","qualifiedName":"Tey.Toolchain.erl","signatures":["erl : String"],"summary":"The `erl` Tey and Kex will spawn. KEX_ERL mirrors what the compiler itself honours, so overriding it moves both rather than half of the pair.","types":["String"],"urlPath":"tey/toolchain"},{"anchor":"function-tey-toolchain-resolved","kind":"function","line":294,"name":"resolved","qualifiedName":"Tey.Toolchain.resolved","signatures":["resolved : String?"],"summary":"The compiler Tey would run, or None when there is none to run.\n\nThe bundled Kex is used WHERE IT LIES rather than copied into the Tey home first. Copying is an install, and an install is not something to do behind someone's back on their first command — it is also impossible where it would be most useful, since Homebrew's post-install sandbox cannot write to the user's home at all. So a fresh Homebrew keg is runnable immediately, nothing is written until `tey kex install` is typed, and a selected version always wins over the bundled one.\n\nWithout the last-resort fallback to a bare `kex` from PATH that `kex` above keeps: `kex` on PATH is Tey's own dispatcher, and answering it with its own name would send it round in a circle.","types":["String?"],"urlPath":"tey/toolchain"},{"anchor":"function-tey-toolchain-installbundled","kind":"function","line":305,"name":"installBundled","qualifiedName":"Tey.Toolchain.installBundled","signatures":["installBundled : Result<String, String>"],"summary":"Takes the bundled Kex into the Tey home so Tey manages it like any other version: `tey kex list` shows it, `tey kex use` can come back to it, and uninstalling whatever replaces it leaves something behind. Only ever done when asked — see `resolved`.","types":["Result<String, String>"],"urlPath":"tey/toolchain"},{"anchor":"function-tey-toolchain-selectionhealthy?","kind":"function","line":315,"name":"selectionHealthy?","qualifiedName":"Tey.Toolchain.selectionHealthy?","signatures":["selectionHealthy? : Bool"],"summary":"Whether the selected toolchain is actually there. A `current` naming a version somebody deleted leaves every command failing on a path that does not exist, which reads like a broken Tey rather than a missing Kex.","types":["Bool"],"urlPath":"tey/toolchain"},{"anchor":"function-tey-toolchain-installrelease","kind":"function","line":330,"name":"installRelease","qualifiedName":"Tey.Toolchain.installRelease","signatures":["installRelease(version: String) -> Result<String, String>"],"summary":"Installs a released version by name. The published archive for this machine is the fast path — unpacking one takes seconds where building takes minutes, and it needs no compiler, which is the point: whatever installs Tey should not also have to be able to build Kex.\n\nFalling back to a source build rather than failing keeps the platforms without a published archive working, and covers a release whose upload is incomplete.","types":["String","Result<String, String>"],"urlPath":"tey/toolchain"},{"anchor":"type-tey-toolchain-archivefailure","kind":"type","line":349,"name":"ArchiveFailure","qualifiedName":"Tey.Toolchain.ArchiveFailure","signatures":[],"summary":"Why a published archive could not be installed. The distinction is the point: one of these is routine and one of them is not.","types":["String","String"],"urlPath":"tey/toolchain"},{"anchor":"function-tey-toolchain-releasebase","kind":"function","line":355,"name":"releaseBase","qualifiedName":"Tey.Toolchain.releaseBase","signatures":["releaseBase : String"],"summary":"Where the release archives live. Derived from the repository so a fork only has to set TEY_KEX_REPO, and overridable on its own for a mirror.","types":["String"],"urlPath":"tey/toolchain"},{"anchor":"function-tey-toolchain-releasetarget","kind":"function","line":368,"name":"releaseTarget","qualifiedName":"Tey.Toolchain.releaseTarget","signatures":["releaseTarget : Result<String, String>"],"summary":"The archive naming this machine, matching what the release workflow builds: `kex-0.4.0-macos-arm64.tar.gz`.","types":["Result<String, String>"],"urlPath":"tey/toolchain"},{"anchor":"function-tey-toolchain-installsource","kind":"function","line":379,"name":"installSource","qualifiedName":"Tey.Toolchain.installSource","signatures":["installSource(source: String, version: String) -> Result<String, String>"],"summary":"Installs compiler, runtime BEAM modules and stdlib sources together. The source tree's CMake install layout is the toolchain ABI Tey manages.","types":["String","Result<String, String>"],"urlPath":"tey/toolchain"},{"anchor":"function-tey-toolchain-uninstall","kind":"function","line":421,"name":"uninstall","qualifiedName":"Tey.Toolchain.uninstall","signatures":["uninstall(version: String) -> Result<String, String>"],"summary":"Removes an installed toolchain. Refuses to leave the shim pointing at nothing: removing the SELECTED version also clears the selection, and the caller is told to pick another.","types":["String","Result<String, String>"],"urlPath":"tey/toolchain"},{"anchor":"function-tey-toolchain-use","kind":"function","line":432,"name":"use","qualifiedName":"Tey.Toolchain.use","signatures":["use(version: String) -> Bool"],"summary":"","types":["String","Bool"],"urlPath":"tey/toolchain"},{"anchor":"function-tey-toolchain-download","kind":"function","line":464,"name":"download","qualifiedName":"Tey.Toolchain.download","signatures":["download(url: String, path: String) -> Result<Void, String>"],"summary":"The archive download/verify/hash/tag/publish helpers below are public because `Tey.SelfUpdate` (`tey upgrade`) reuses the exact same release mechanics for Tey's own archives that Kex toolchains already trust — same URLs, same checksums, same staged swaps. No behavior change; only visibility.\n\ncurl, then wget: one of the two is on essentially every machine that can reach a release, and this way Tey needs neither an HTTP library nor a compiler to fetch one.","types":["String","Result<Void, String>"],"urlPath":"tey/toolchain"},{"anchor":"function-tey-toolchain-verifyarchive","kind":"function","line":483,"name":"verifyArchive","qualifiedName":"Tey.Toolchain.verifyArchive","signatures":["verifyArchive(archive: String, checksumUrl: String) -> Result<Void, String>"],"summary":"The published `.sha256` is `<hash>  <filename>`, the format both sha256sum and shasum write and read.","types":["String","Result<Void, String>"],"urlPath":"tey/toolchain"},{"anchor":"function-tey-toolchain-checksumof","kind":"function","line":498,"name":"checksumOf","qualifiedName":"Tey.Toolchain.checksumOf","signatures":["checksumOf(path: String) -> Result<String, String>"],"summary":"Hashed with an external tool rather than read in: the archive is tens of megabytes of binary, and this keeps all of it out of the process.","types":["String","Result<String, String>"],"urlPath":"tey/toolchain"},{"anchor":"function-tey-toolchain-releasetag","kind":"function","line":513,"name":"releaseTag","qualifiedName":"Tey.Toolchain.releaseTag","signatures":["releaseTag(version: String) -> Result<String, String>"],"summary":"The tag naming this version in the repository — `0.3.0` or `v0.3.0`.","types":["String","Result<String, String>"],"urlPath":"tey/toolchain"},{"anchor":"function-tey-toolchain-versionof","kind":"function","line":522,"name":"versionOf","qualifiedName":"Tey.Toolchain.versionOf","signatures":["versionOf(tag: String) -> String?"],"summary":"`v0.3.0` → Just(\"0.3.0\"). A tag that is not a version is None, which `collect` drops: a toolchain is named by its version, not by a label.","types":["String","String?"],"urlPath":"tey/toolchain"},{"anchor":"function-tey-toolchain-publish","kind":"function","line":531,"name":"publish","qualifiedName":"Tey.Toolchain.publish","signatures":["publish(staging: String, prefix: String) -> Result<String, String>"],"summary":"Swaps a finished staging tree in for `prefix`. A reinstall keeps the old tree until the new one is in place and puts it back if the move fails, so a failed upgrade leaves the previous toolchain working rather than none.","types":["String","Result<String, String>"],"urlPath":"tey/toolchain"},{"anchor":"module-tey-workspace","kind":"module","line":1,"name":"Tey.Workspace","qualifiedName":"Tey.Workspace","signatures":["discover(start: String) -> Result<Context, String>","select(context: Context, packageName: String, workspace?: Bool) -> Result<[Member], String>","dependencyLayers(members: [Member]) -> [[Member]]","memberName(member: Member) -> String","memberDependencies(member: Member) -> [String]"],"summary":"","types":["String","ManifestPackage","[Member]","Member?","[String]","Result<Context, String>","Context","Bool","Result<[Member], String>","[[Member]]","Member"],"urlPath":"tey/workspace"},{"anchor":"record-tey-workspace-member","kind":"record","line":5,"name":"Member","qualifiedName":"Tey.Workspace.Member","signatures":[],"summary":"","types":["String","ManifestPackage"],"urlPath":"tey/workspace"},{"anchor":"record-tey-workspace-context","kind":"record","line":10,"name":"Context","qualifiedName":"Tey.Workspace.Context","signatures":[],"summary":"","types":["String","[Member]","Member?","[String]"],"urlPath":"tey/workspace"},{"anchor":"function-tey-workspace-discover","kind":"function","line":20,"name":"discover","qualifiedName":"Tey.Workspace.discover","signatures":["discover(start: String) -> Result<Context, String>"],"summary":"Discovers the outermost workspace containing `start`. Without a workspace, the nearest package is a one-member context. Paths are lexical and absolute; discovery never changes the process working directory.","types":["String","Result<Context, String>"],"urlPath":"tey/workspace"},{"anchor":"function-tey-workspace-select","kind":"function","line":54,"name":"select","qualifiedName":"Tey.Workspace.select","signatures":["select(context: Context, packageName: String, workspace?: Bool) -> Result<[Member], String>"],"summary":"Selects the members a workspace-aware command should operate on. An explicit package always wins; otherwise commands at a member stay local, while commands at the workspace root (or another non-member directory) use every member. `--workspace` broadens the implicit member selection.","types":["Context","String","Bool","Result<[Member], String>"],"urlPath":"tey/workspace"},{"anchor":"function-tey-workspace-dependencylayers","kind":"function","line":79,"name":"dependencyLayers","qualifiedName":"Tey.Workspace.dependencyLayers","signatures":["dependencyLayers(members: [Member]) -> [[Member]]"],"summary":"Dependency-ready layers for workspace-wide commands. Cyclic leftovers form one final layer so callers can continue, while discovery reports the cycle.","types":["[Member]","[[Member]]"],"urlPath":"tey/workspace"},{"anchor":"function-tey-workspace-membername","kind":"function","line":83,"name":"memberName","qualifiedName":"Tey.Workspace.memberName","signatures":["memberName(member: Member) -> String"],"summary":"","types":["Member","String"],"urlPath":"tey/workspace"},{"anchor":"function-tey-workspace-memberdependencies","kind":"function","line":88,"name":"memberDependencies","qualifiedName":"Tey.Workspace.memberDependencies","signatures":["memberDependencies(member: Member) -> [String]"],"summary":"","types":["Member","[String]"],"urlPath":"tey/workspace"},{"anchor":"module-tey-docgen-assets","kind":"module","line":7,"name":"Tey.Docgen.Assets","qualifiedName":"Tey.Docgen.Assets","signatures":["siteJs : String"],"summary":"","types":["String"],"urlPath":"tey/docgen/assets"},{"anchor":"function-tey-docgen-assets-sitejs","kind":"function","line":8,"name":"siteJs","qualifiedName":"Tey.Docgen.Assets.siteJs","signatures":["siteJs : String"],"summary":"","types":["String"],"urlPath":"tey/docgen/assets"},{"anchor":"module-tey-docgen-cli","kind":"module","line":17,"name":"Tey.Docgen.Cli","qualifiedName":"Tey.Docgen.Cli","signatures":["options : OptionParser.OptionConfig","dispatch(args: [String]) -> Integer","runCommand(parsed: OptionParser.ParsedOptions) -> Integer","printUsage : Integer"],"summary":"","types":["OptionParser.OptionConfig","[String]","Integer","OptionParser.ParsedOptions"],"urlPath":"tey/docgen/cli"},{"anchor":"function-tey-docgen-cli-options","kind":"function","line":21,"name":"options","qualifiedName":"Tey.Docgen.Cli.options","signatures":["options : OptionParser.OptionConfig"],"summary":"A function rather than a module-level constant: on BEAM, calling a make-method (`.parse`, `.help`) on a module-level constant fails with \"Undefined function\" — the dispatcher doesn't resolve the constant.","types":["OptionParser.OptionConfig"],"urlPath":"tey/docgen/cli"},{"anchor":"function-tey-docgen-cli-dispatch","kind":"function","line":35,"name":"dispatch","qualifiedName":"Tey.Docgen.Cli.dispatch","signatures":["dispatch(args: [String]) -> Integer"],"summary":"","types":["[String]","Integer"],"urlPath":"tey/docgen/cli"},{"anchor":"function-tey-docgen-cli-runcommand","kind":"function","line":46,"name":"runCommand","qualifiedName":"Tey.Docgen.Cli.runCommand","signatures":["runCommand(parsed: OptionParser.ParsedOptions) -> Integer"],"summary":"","types":["OptionParser.ParsedOptions","Integer"],"urlPath":"tey/docgen/cli"},{"anchor":"function-tey-docgen-cli-printusage","kind":"function","line":60,"name":"printUsage","qualifiedName":"Tey.Docgen.Cli.printUsage","signatures":["printUsage : Integer"],"summary":"","types":["Integer"],"urlPath":"tey/docgen/cli"},{"anchor":"module-tey-docgen-css","kind":"module","line":10,"name":"Tey.Docgen.Css","qualifiedName":"Tey.Docgen.Css","signatures":["siteCss : String"],"summary":"","types":["String"],"urlPath":"tey/docgen/css"},{"anchor":"function-tey-docgen-css-sitecss","kind":"function","line":11,"name":"siteCss","qualifiedName":"Tey.Docgen.Css.siteCss","signatures":["siteCss : String"],"summary":"","types":["String"],"urlPath":"tey/docgen/css"},{"anchor":"module-tey-docgen-extract","kind":"module","line":10,"name":"Tey.Docgen.Extract","qualifiedName":"Tey.Docgen.Extract","signatures":["fileEntities(items: [Kex.AST.Node]) -> [Entity]","pageFor(source: String, items: [Kex.AST.Node]) -> SourcePage","pageTitle(source: String, entities: [Entity]) -> String","baseSpelling(name: String) -> String","moduleTitle(entry: ModuleEntry, stem: String) -> String","lastSegmentMatches?(qualifiedName: String, stem: String) -> Bool","nestedModuleNamed(children: [Entity], stem: String) -> String?","fileStem(path: String) -> String","entitiesIn(body: [Kex.AST.Node], prefix: String) -> [Entity]","bodyEntities(body: [Kex.AST.Node], prefix: String, accum: [Pending]) -> [Pending]","finalize(accum: [Pending]) -> [Entity]","finalizeOne(p: Pending) -> Entity","typeEntity(info: Kex.AST.TypeInfo, prefix: String) -> Entity","variantEntry(v: Kex.AST.VariantInfo) -> VariantEntry","recordEntity(info: Kex.AST.RecordInfo, prefix: String) -> Entity","traitEntity(info: Kex.AST.TraitInfo, prefix: String) -> Entity","makeEntity(info: Kex.AST.MakeInfo) -> Entity","moduleEntity(info: Kex.AST.ModuleInfo, prefix: String) -> Entity","constantEntity(info: Kex.AST.ConstantInfo, prefix: String) -> Entity","functionEntries(body: [Kex.AST.Node], prefix: String) -> [FunctionEntry]","noteAnnotation(accum: [Pending], info: Kex.AST.AnnotationInfo, prefix: String) -> [Pending]","addAnnotation(p: Pending, info: Kex.AST.AnnotationInfo) -> Pending","noteFunction(accum: [Pending], info: Kex.AST.FunctionInfo, prefix: String) -> [Pending]","isConstantBinding(info: Kex.AST.FunctionInfo) -> Bool","noteConstant(accum: [Pending], info: Kex.AST.FunctionInfo, prefix: String) -> [Pending]","constantFromPending(p: Pending, info: Kex.AST.FunctionInfo, prefix: String) -> Pending","returnTypeText(info: Kex.AST.FunctionInfo) -> String","addClause(p: Pending, info: Kex.AST.FunctionInfo, paramNames: [String]) -> Pending","findPending(accum: [Pending], name: String) -> Integer?","indexedFind(accum: [Pending], name: String, index: Integer) -> Integer?","finalizeFunction(fn: PendingFunction) -> FunctionEntry","functionTypes(annotations: [Kex.AST.AnnotationInfo], paramLists: [[String]]) -> [String]","annotationTypes(info: Kex.AST.AnnotationInfo, paramLists: [[String]]) -> [String]","signatureTexts(fn: PendingFunction) -> [String]","renderSignature(info: Kex.AST.AnnotationInfo, paramLists: [[String]]) -> String","signatureTypeText(ref: Kex.AST.TypeRef) -> String","signatureParamText(p: Kex.AST.TypeRef) -> String","annotationRef(info: Kex.AST.AnnotationInfo) -> Kex.AST.TypeRef","matchingParamList(ref: Kex.AST.TypeRef, paramLists: [[String]]) -> [String]?","paramsMatch(ref: Kex.AST.TypeRef, names: [String]) -> Bool","flattenToArity(ref: Kex.AST.TypeRef, arity: Integer) -> Kex.AST.TypeRef","clauseParamNames(clause: Kex.AST.ClauseInfo?) -> [String]","paramName(p: Kex.AST.ParamInfo) -> String","annotationTypeOf(info: Kex.AST.ConstantInfo) -> String","fieldTypeName(f: Kex.AST.FieldInfo) -> String","typeText(ref: Kex.AST.TypeRef) -> String","typeTextOpt(ref: Kex.AST.TypeRef?) -> String","qualify(prefix: String, name: String) -> String","stripExt(name: String) -> String","titleCase(s: String) -> String"],"summary":"","types":["[Kex.AST.Node]","[Entity]","String","SourcePage","ModuleEntry","Bool","String?","Entity","PendingFunction","[Kex.AST.AnnotationInfo]","[[String]]","Integer","Doc","[Pending]","Pending","Kex.AST.TypeInfo","Kex.AST.VariantInfo","VariantEntry","Kex.AST.RecordInfo","Kex.AST.TraitInfo","Kex.AST.MakeInfo","Kex.AST.ModuleInfo","Kex.AST.ConstantInfo","[FunctionEntry]","Kex.AST.AnnotationInfo","Kex.AST.FunctionInfo","[String]","Integer?","FunctionEntry","Kex.AST.TypeRef","[String]?","Kex.AST.ClauseInfo?","Kex.AST.ParamInfo","Kex.AST.FieldInfo","Kex.AST.TypeRef?"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-fileentities","kind":"function","line":13,"name":"fileEntities","qualifiedName":"Tey.Docgen.Extract.fileEntities","signatures":["fileEntities(items: [Kex.AST.Node]) -> [Entity]"],"summary":"","types":["[Kex.AST.Node]","[Entity]"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-pagefor","kind":"function","line":17,"name":"pageFor","qualifiedName":"Tey.Docgen.Extract.pageFor","signatures":["pageFor(source: String, items: [Kex.AST.Node]) -> SourcePage"],"summary":"","types":["String","[Kex.AST.Node]","SourcePage"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-pagetitle","kind":"function","line":31,"name":"pageTitle","qualifiedName":"Tey.Docgen.Extract.pageTitle","signatures":["pageTitle(source: String, entities: [Entity]) -> String"],"summary":"A page's title is the declaration it is really about — \"OptionParser\", not the file name's \"Optionparser\", and \"FileHandle\", not \"Filehandle\". Preference order: a single top-level module, then a single top-level type/record/trait, then the file name title-cased.","types":["String","[Entity]"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-basespelling","kind":"function","line":67,"name":"baseSpelling","qualifiedName":"Tey.Docgen.Extract.baseSpelling","signatures":["baseSpelling(name: String) -> String"],"summary":"\"FileHandle<CanRead, W>\" -> \"FileHandle\", \"FS.Path\" -> \"Path\": what the file could plausibly be named after.","types":["String"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-moduletitle","kind":"function","line":79,"name":"moduleTitle","qualifiedName":"Tey.Docgen.Extract.moduleTitle","signatures":["moduleTitle(entry: ModuleEntry, stem: String) -> String"],"summary":"The title of a file with one top-level module. The file's stem has a say when the module is shared across several files: data/queue.kex declares `module Data` around `module Queue`, and so do set.kex and stack.kex — without the stem, every one of those pages is titled \"Data\" and the sidebar shows indistinguishable entries. A module whose last segment matches the stem is the page (\"dns.kex\" -> Net.DNS); else a nested module matching it is (\"queue.kex\" -> Data.Queue); else the top module stands (\"mock.kex\" -> Mock, a file about the family).","types":["ModuleEntry","String"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-lastsegmentmatches?","kind":"function","line":87,"name":"lastSegmentMatches?","qualifiedName":"Tey.Docgen.Extract.lastSegmentMatches?","signatures":["lastSegmentMatches?(qualifiedName: String, stem: String) -> Bool"],"summary":"","types":["String","Bool"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-nestedmodulenamed","kind":"function","line":91,"name":"nestedModuleNamed","qualifiedName":"Tey.Docgen.Extract.nestedModuleNamed","signatures":["nestedModuleNamed(children: [Entity], stem: String) -> String?"],"summary":"","types":["[Entity]","String","String?"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-filestem","kind":"function","line":99,"name":"fileStem","qualifiedName":"Tey.Docgen.Extract.fileStem","signatures":["fileStem(path: String) -> String"],"summary":"\"kex/ast\" -> \"ast\".","types":["String"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-entitiesin","kind":"function","line":103,"name":"entitiesIn","qualifiedName":"Tey.Docgen.Extract.entitiesIn","signatures":["entitiesIn(body: [Kex.AST.Node], prefix: String) -> [Entity]"],"summary":"","types":["[Kex.AST.Node]","String","[Entity]"],"urlPath":"tey/docgen/extract"},{"anchor":"type-tey-docgen-extract-pending","kind":"type","line":108,"name":"Pending","qualifiedName":"Tey.Docgen.Extract.Pending","signatures":[],"summary":"Accumulator entries: finished entities or functions still collecting.","types":["Entity","PendingFunction"],"urlPath":"tey/docgen/extract"},{"anchor":"record-tey-docgen-extract-pendingfunction","kind":"record","line":112,"name":"PendingFunction","qualifiedName":"Tey.Docgen.Extract.PendingFunction","signatures":[],"summary":"","types":["String","[Kex.AST.AnnotationInfo]","[[String]]","Integer","Doc"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-bodyentities","kind":"function","line":122,"name":"bodyEntities","qualifiedName":"Tey.Docgen.Extract.bodyEntities","signatures":["bodyEntities(body: [Kex.AST.Node], prefix: String, accum: [Pending]) -> [Pending]"],"summary":"","types":["[Kex.AST.Node]","String","[Pending]"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-finalize","kind":"function","line":140,"name":"finalize","qualifiedName":"Tey.Docgen.Extract.finalize","signatures":["finalize(accum: [Pending]) -> [Entity]"],"summary":"","types":["[Pending]","[Entity]"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-finalizeone","kind":"function","line":144,"name":"finalizeOne","qualifiedName":"Tey.Docgen.Extract.finalizeOne","signatures":["finalizeOne(p: Pending) -> Entity"],"summary":"","types":["Pending","Entity"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-typeentity","kind":"function","line":151,"name":"typeEntity","qualifiedName":"Tey.Docgen.Extract.typeEntity","signatures":["typeEntity(info: Kex.AST.TypeInfo, prefix: String) -> Entity"],"summary":"","types":["Kex.AST.TypeInfo","String","Entity"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-variantentry","kind":"function","line":169,"name":"variantEntry","qualifiedName":"Tey.Docgen.Extract.variantEntry","signatures":["variantEntry(v: Kex.AST.VariantInfo) -> VariantEntry"],"summary":"A named helper (rather than an inline lambda) so the element type of `v.fields` comes from VariantInfo, not from VariantEntry's [String].","types":["Kex.AST.VariantInfo","VariantEntry"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-recordentity","kind":"function","line":173,"name":"recordEntity","qualifiedName":"Tey.Docgen.Extract.recordEntity","signatures":["recordEntity(info: Kex.AST.RecordInfo, prefix: String) -> Entity"],"summary":"","types":["Kex.AST.RecordInfo","String","Entity"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-traitentity","kind":"function","line":186,"name":"traitEntity","qualifiedName":"Tey.Docgen.Extract.traitEntity","signatures":["traitEntity(info: Kex.AST.TraitInfo, prefix: String) -> Entity"],"summary":"","types":["Kex.AST.TraitInfo","String","Entity"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-makeentity","kind":"function","line":197,"name":"makeEntity","qualifiedName":"Tey.Docgen.Extract.makeEntity","signatures":["makeEntity(info: Kex.AST.MakeInfo) -> Entity"],"summary":"","types":["Kex.AST.MakeInfo","Entity"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-moduleentity","kind":"function","line":208,"name":"moduleEntity","qualifiedName":"Tey.Docgen.Extract.moduleEntity","signatures":["moduleEntity(info: Kex.AST.ModuleInfo, prefix: String) -> Entity"],"summary":"","types":["Kex.AST.ModuleInfo","String","Entity"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-constantentity","kind":"function","line":219,"name":"constantEntity","qualifiedName":"Tey.Docgen.Extract.constantEntity","signatures":["constantEntity(info: Kex.AST.ConstantInfo, prefix: String) -> Entity"],"summary":"","types":["Kex.AST.ConstantInfo","String","Entity"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-functionentries","kind":"function","line":229,"name":"functionEntries","qualifiedName":"Tey.Docgen.Extract.functionEntries","signatures":["functionEntries(body: [Kex.AST.Node], prefix: String) -> [FunctionEntry]"],"summary":"","types":["[Kex.AST.Node]","String","[FunctionEntry]"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-noteannotation","kind":"function","line":240,"name":"noteAnnotation","qualifiedName":"Tey.Docgen.Extract.noteAnnotation","signatures":["noteAnnotation(accum: [Pending], info: Kex.AST.AnnotationInfo, prefix: String) -> [Pending]"],"summary":"","types":["[Pending]","Kex.AST.AnnotationInfo","String"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-addannotation","kind":"function","line":255,"name":"addAnnotation","qualifiedName":"Tey.Docgen.Extract.addAnnotation","signatures":["addAnnotation(p: Pending, info: Kex.AST.AnnotationInfo) -> Pending"],"summary":"","types":["Pending","Kex.AST.AnnotationInfo"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-notefunction","kind":"function","line":280,"name":"noteFunction","qualifiedName":"Tey.Docgen.Extract.noteFunction","signatures":["noteFunction(accum: [Pending], info: Kex.AST.FunctionInfo, prefix: String) -> [Pending]"],"summary":"","types":["[Pending]","Kex.AST.FunctionInfo","String"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-isconstantbinding","kind":"function","line":308,"name":"isConstantBinding","qualifiedName":"Tey.Docgen.Extract.isConstantBinding","signatures":["isConstantBinding(info: Kex.AST.FunctionInfo) -> Bool"],"summary":"A binding with no parameter list is a constant — unless it is `foul`, in which case it is a zero-argument FUNCTION that Kex auto-calls. `IO.out` is a handle that is always the same one; `IO.getLine` reads a new line every time it is named, and calling that a constant is a lie about both what it does and when it happens.","types":["Kex.AST.FunctionInfo","Bool"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-noteconstant","kind":"function","line":318,"name":"noteConstant","qualifiedName":"Tey.Docgen.Extract.noteConstant","signatures":["noteConstant(accum: [Pending], info: Kex.AST.FunctionInfo, prefix: String) -> [Pending]"],"summary":"","types":["[Pending]","Kex.AST.FunctionInfo","String"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-constantfrompending","kind":"function","line":333,"name":"constantFromPending","qualifiedName":"Tey.Docgen.Extract.constantFromPending","signatures":["constantFromPending(p: Pending, info: Kex.AST.FunctionInfo, prefix: String) -> Pending"],"summary":"The annotation arrived first and created a PendingFunction; the binding now replaces it with the constant entry, keeping name/doc/line.","types":["Pending","Kex.AST.FunctionInfo","String"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-returntypetext","kind":"function","line":375,"name":"returnTypeText","qualifiedName":"Tey.Docgen.Extract.returnTypeText","signatures":["returnTypeText(info: Kex.AST.FunctionInfo) -> String"],"summary":"","types":["Kex.AST.FunctionInfo","String"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-addclause","kind":"function","line":382,"name":"addClause","qualifiedName":"Tey.Docgen.Extract.addClause","signatures":["addClause(p: Pending, info: Kex.AST.FunctionInfo, paramNames: [String]) -> Pending"],"summary":"","types":["Pending","Kex.AST.FunctionInfo","[String]"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-findpending","kind":"function","line":407,"name":"findPending","qualifiedName":"Tey.Docgen.Extract.findPending","signatures":["findPending(accum: [Pending], name: String) -> Integer?"],"summary":"","types":["[Pending]","String","Integer?"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-indexedfind","kind":"function","line":411,"name":"indexedFind","qualifiedName":"Tey.Docgen.Extract.indexedFind","signatures":["indexedFind(accum: [Pending], name: String, index: Integer) -> Integer?"],"summary":"","types":["[Pending]","String","Integer","Integer?"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-finalizefunction","kind":"function","line":422,"name":"finalizeFunction","qualifiedName":"Tey.Docgen.Extract.finalizeFunction","signatures":["finalizeFunction(fn: PendingFunction) -> FunctionEntry"],"summary":"","types":["PendingFunction","FunctionEntry"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-functiontypes","kind":"function","line":437,"name":"functionTypes","qualifiedName":"Tey.Docgen.Extract.functionTypes","signatures":["functionTypes(annotations: [Kex.AST.AnnotationInfo], paramLists: [[String]]) -> [String]"],"summary":"The type names a function is about — every parameter type plus the result type of each annotation, deduplicated. This is what lets search answer \"what touches Integer\" rather than just \"what is called Integer\".","types":["[Kex.AST.AnnotationInfo]","[[String]]","[String]"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-annotationtypes","kind":"function","line":442,"name":"annotationTypes","qualifiedName":"Tey.Docgen.Extract.annotationTypes","signatures":["annotationTypes(info: Kex.AST.AnnotationInfo, paramLists: [[String]]) -> [String]"],"summary":"","types":["Kex.AST.AnnotationInfo","[[String]]","[String]"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-signaturetexts","kind":"function","line":464,"name":"signatureTexts","qualifiedName":"Tey.Docgen.Extract.signatureTexts","signatures":["signatureTexts(fn: PendingFunction) -> [String]"],"summary":"A function's signature is its EXACT Kex type — `Integer -> Integer -> Integer`, written the way Kex reads it (curried, right-associative) — rather than the flattened clause form. The parameter NAMES ride along before the colon (`and(a, b) : Integer -> Integer -> Integer`) so the names stay visible without flattening the type; an abstract method has no clause, so it shows only `name : Type`. Without an annotation there is no type to show, and the names stand alone.","types":["PendingFunction","[String]"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-rendersignature","kind":"function","line":474,"name":"renderSignature","qualifiedName":"Tey.Docgen.Extract.renderSignature","signatures":["renderSignature(info: Kex.AST.AnnotationInfo, paramLists: [[String]]) -> String"],"summary":"","types":["Kex.AST.AnnotationInfo","[[String]]","String"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-signaturetypetext","kind":"function","line":485,"name":"signatureTypeText","qualifiedName":"Tey.Docgen.Extract.signatureTypeText","signatures":["signatureTypeText(ref: Kex.AST.TypeRef) -> String"],"summary":"Source-style type text: function arrows chain to the right without the redundant parentheses typeRefText adds, and a function-typed parameter is parenthesized so `(X -> Y) -> Z` stays distinct from `X -> Y -> Z`.","types":["Kex.AST.TypeRef","String"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-signatureparamtext","kind":"function","line":493,"name":"signatureParamText","qualifiedName":"Tey.Docgen.Extract.signatureParamText","signatures":["signatureParamText(p: Kex.AST.TypeRef) -> String"],"summary":"","types":["Kex.AST.TypeRef","String"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-annotationref","kind":"function","line":500,"name":"annotationRef","qualifiedName":"Tey.Docgen.Extract.annotationRef","signatures":["annotationRef(info: Kex.AST.AnnotationInfo) -> Kex.AST.TypeRef"],"summary":"","types":["Kex.AST.AnnotationInfo","Kex.AST.TypeRef"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-matchingparamlist","kind":"function","line":506,"name":"matchingParamList","qualifiedName":"Tey.Docgen.Extract.matchingParamList","signatures":["matchingParamList(ref: Kex.AST.TypeRef, paramLists: [[String]]) -> [String]?"],"summary":"","types":["Kex.AST.TypeRef","[[String]]","[String]?"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-paramsmatch","kind":"function","line":510,"name":"paramsMatch","qualifiedName":"Tey.Docgen.Extract.paramsMatch","signatures":["paramsMatch(ref: Kex.AST.TypeRef, names: [String]) -> Bool"],"summary":"","types":["Kex.AST.TypeRef","[String]","Bool"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-flattentoarity","kind":"function","line":520,"name":"flattenToArity","qualifiedName":"Tey.Docgen.Extract.flattenToArity","signatures":["flattenToArity(ref: Kex.AST.TypeRef, arity: Integer) -> Kex.AST.TypeRef"],"summary":"Absorbs single-parameter curried layers while more than one argument remains. `(FilePath) -> (Read) -> R` with arity 2 becomes `(FilePath, Read) -> R`.","types":["Kex.AST.TypeRef","Integer"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-clauseparamnames","kind":"function","line":537,"name":"clauseParamNames","qualifiedName":"Tey.Docgen.Extract.clauseParamNames","signatures":["clauseParamNames(clause: Kex.AST.ClauseInfo?) -> [String]"],"summary":"`type` is a keyword after `.`, so typed-record access goes through pattern matching instead.","types":["Kex.AST.ClauseInfo?","[String]"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-paramname","kind":"function","line":544,"name":"paramName","qualifiedName":"Tey.Docgen.Extract.paramName","signatures":["paramName(p: Kex.AST.ParamInfo) -> String"],"summary":"","types":["Kex.AST.ParamInfo","String"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-annotationtypeof","kind":"function","line":552,"name":"annotationTypeOf","qualifiedName":"Tey.Docgen.Extract.annotationTypeOf","signatures":["annotationTypeOf(info: Kex.AST.ConstantInfo) -> String"],"summary":"","types":["Kex.AST.ConstantInfo","String"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-fieldtypename","kind":"function","line":559,"name":"fieldTypeName","qualifiedName":"Tey.Docgen.Extract.fieldTypeName","signatures":["fieldTypeName(f: Kex.AST.FieldInfo) -> String"],"summary":"","types":["Kex.AST.FieldInfo","String"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-typetext","kind":"function","line":565,"name":"typeText","qualifiedName":"Tey.Docgen.Extract.typeText","signatures":["typeText(ref: Kex.AST.TypeRef) -> String"],"summary":"","types":["Kex.AST.TypeRef","String"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-typetextopt","kind":"function","line":569,"name":"typeTextOpt","qualifiedName":"Tey.Docgen.Extract.typeTextOpt","signatures":["typeTextOpt(ref: Kex.AST.TypeRef?) -> String"],"summary":"","types":["Kex.AST.TypeRef?","String"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-qualify","kind":"function","line":579,"name":"qualify","qualifiedName":"Tey.Docgen.Extract.qualify","signatures":["qualify(prefix: String, name: String) -> String"],"summary":"Modules may be written fully qualified (`module FS.File do` inside `module FS do`), so a dotted name already carries its prefix — never prepend twice. A short name gets the parent's prefix as usual.","types":["String"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-stripext","kind":"function","line":586,"name":"stripExt","qualifiedName":"Tey.Docgen.Extract.stripExt","signatures":["stripExt(name: String) -> String"],"summary":"","types":["String"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-titlecase","kind":"function","line":591,"name":"titleCase","qualifiedName":"Tey.Docgen.Extract.titleCase","signatures":["titleCase(s: String) -> String"],"summary":"","types":["String"],"urlPath":"tey/docgen/extract"},{"anchor":"module-tey-docgen-highlight","kind":"module","line":10,"name":"Tey.Docgen.Highlight","qualifiedName":"Tey.Docgen.Highlight","signatures":["highlight(source: String) -> String","lexAll(cs: [Char], out: [Tok]) -> [Tok]","nextToken(cs: [Char], out: [Tok]) -> ([Tok], [Char])","lexString(cs: [Char], acc: [Tok]) -> ([Tok], [Char])","takeStringText(cs: [Char], acc: [Char]) -> (String, [Char])","balancedBraces(cs: [Char], depth: Integer, acc: [Char]) -> ([Char], [Char])","skipString(cs: [Char]) -> ([Char], [Char])","skipStringBody(cs: [Char], acc: [Char]) -> ([Char], [Char])","lexNumber(cs: [Char]) -> ([Tok], [Char])","exponentLength(cs: [Char]) -> Integer","hexDigit?(c: Char) -> Bool","lexIdentifier(cs: [Char], out: [Tok]) -> ([Tok], [Char])","classifyWord(word: String, prevDot: Bool, nextCh: Char) -> String","previousIsDot(out: [Tok]) -> Bool","identChar?(c: Char) -> Bool","lexOperator(cs: [Char]) -> ([Tok], [Char])","twoCharOp(cs: [Char]) -> String","keywords : [String]","constants : [String]","typeNames : [String]","renderTokens(toks: [Tok]) -> String","renderTok(t: Tok) -> String","esc(s: String) -> String","textOf(cs: [Char]) -> String","startsWithChars(cs: [Char], s: String) -> Bool"],"summary":"","types":["String","[Char]","[Tok]","([Tok], [Char])","(String, [Char])","Integer","([Char], [Char])","Char","Bool","[String]","Tok"],"urlPath":"tey/docgen/highlight"},{"anchor":"record-tey-docgen-highlight-tok","kind":"record","line":11,"name":"Tok","qualifiedName":"Tey.Docgen.Highlight.Tok","signatures":[],"summary":"","types":["String"],"urlPath":"tey/docgen/highlight"},{"anchor":"function-tey-docgen-highlight-highlight","kind":"function","line":16,"name":"highlight","qualifiedName":"Tey.Docgen.Highlight.highlight","signatures":["highlight(source: String) -> String"],"summary":"","types":["String"],"urlPath":"tey/docgen/highlight"},{"anchor":"function-tey-docgen-highlight-lexall","kind":"function","line":21,"name":"lexAll","qualifiedName":"Tey.Docgen.Highlight.lexAll","signatures":["lexAll(cs: [Char], out: [Tok]) -> [Tok]"],"summary":"out accumulates newest-first; the final reverse restores source order.","types":["[Char]","[Tok]"],"urlPath":"tey/docgen/highlight"},{"anchor":"function-tey-docgen-highlight-nexttoken","kind":"function","line":29,"name":"nextToken","qualifiedName":"Tey.Docgen.Highlight.nextToken","signatures":["nextToken(cs: [Char], out: [Tok]) -> ([Tok], [Char])"],"summary":"","types":["[Char]","[Tok]","([Tok], [Char])"],"urlPath":"tey/docgen/highlight"},{"anchor":"function-tey-docgen-highlight-lexstring","kind":"function","line":60,"name":"lexString","qualifiedName":"Tey.Docgen.Highlight.lexString","signatures":["lexString(cs: [Char], acc: [Tok]) -> ([Tok], [Char])"],"summary":"cs starts after the opening quote; acc is newest-first tokens so far.","types":["[Char]","[Tok]","([Tok], [Char])"],"urlPath":"tey/docgen/highlight"},{"anchor":"function-tey-docgen-highlight-takestringtext","kind":"function","line":85,"name":"takeStringText","qualifiedName":"Tey.Docgen.Highlight.takeStringText","signatures":["takeStringText(cs: [Char], acc: [Char]) -> (String, [Char])"],"summary":"Collect literal string text up to (not including) the closing quote, an interpolation opener, or the end of input. Backslash escapes are opaque.","types":["[Char]","(String, [Char])"],"urlPath":"tey/docgen/highlight"},{"anchor":"function-tey-docgen-highlight-balancedbraces","kind":"function","line":103,"name":"balancedBraces","qualifiedName":"Tey.Docgen.Highlight.balancedBraces","signatures":["balancedBraces(cs: [Char], depth: Integer, acc: [Char]) -> ([Char], [Char])"],"summary":"From just after \"${\", collect the interpolation body up to its matching \"}\" (which is consumed but not collected). Embedded \"...\" strings are skipped whole so braces inside them do not count.","types":["[Char]","Integer","([Char], [Char])"],"urlPath":"tey/docgen/highlight"},{"anchor":"function-tey-docgen-highlight-skipstring","kind":"function","line":126,"name":"skipString","qualifiedName":"Tey.Docgen.Highlight.skipString","signatures":["skipString(cs: [Char]) -> ([Char], [Char])"],"summary":"Consume a whole \"...\" literal starting at the opening quote; returns the consumed characters (both quotes included) and the remainder.","types":["[Char]","([Char], [Char])"],"urlPath":"tey/docgen/highlight"},{"anchor":"function-tey-docgen-highlight-skipstringbody","kind":"function","line":130,"name":"skipStringBody","qualifiedName":"Tey.Docgen.Highlight.skipStringBody","signatures":["skipStringBody(cs: [Char], acc: [Char]) -> ([Char], [Char])"],"summary":"","types":["[Char]","([Char], [Char])"],"urlPath":"tey/docgen/highlight"},{"anchor":"function-tey-docgen-highlight-lexnumber","kind":"function","line":145,"name":"lexNumber","qualifiedName":"Tey.Docgen.Highlight.lexNumber","signatures":["lexNumber(cs: [Char]) -> ([Tok], [Char])"],"summary":"","types":["[Char]","([Tok], [Char])"],"urlPath":"tey/docgen/highlight"},{"anchor":"function-tey-docgen-highlight-exponentlength","kind":"function","line":165,"name":"exponentLength","qualifiedName":"Tey.Docgen.Highlight.exponentLength","signatures":["exponentLength(cs: [Char]) -> Integer"],"summary":"","types":["[Char]","Integer"],"urlPath":"tey/docgen/highlight"},{"anchor":"function-tey-docgen-highlight-hexdigit?","kind":"function","line":179,"name":"hexDigit?","qualifiedName":"Tey.Docgen.Highlight.hexDigit?","signatures":["hexDigit?(c: Char) -> Bool"],"summary":"","types":["Char","Bool"],"urlPath":"tey/docgen/highlight"},{"anchor":"function-tey-docgen-highlight-lexidentifier","kind":"function","line":183,"name":"lexIdentifier","qualifiedName":"Tey.Docgen.Highlight.lexIdentifier","signatures":["lexIdentifier(cs: [Char], out: [Tok]) -> ([Tok], [Char])"],"summary":"","types":["[Char]","[Tok]","([Tok], [Char])"],"urlPath":"tey/docgen/highlight"},{"anchor":"function-tey-docgen-highlight-classifyword","kind":"function","line":193,"name":"classifyWord","qualifiedName":"Tey.Docgen.Highlight.classifyWord","signatures":["classifyWord(word: String, prevDot: Bool, nextCh: Char) -> String"],"summary":"","types":["String","Bool","Char"],"urlPath":"tey/docgen/highlight"},{"anchor":"function-tey-docgen-highlight-previousisdot","kind":"function","line":217,"name":"previousIsDot","qualifiedName":"Tey.Docgen.Highlight.previousIsDot","signatures":["previousIsDot(out: [Tok]) -> Bool"],"summary":"The most recent token that is not whitespace: out is newest-first, so a plain find walks backwards in time.","types":["[Tok]","Bool"],"urlPath":"tey/docgen/highlight"},{"anchor":"function-tey-docgen-highlight-identchar?","kind":"function","line":224,"name":"identChar?","qualifiedName":"Tey.Docgen.Highlight.identChar?","signatures":["identChar?(c: Char) -> Bool"],"summary":"","types":["Char","Bool"],"urlPath":"tey/docgen/highlight"},{"anchor":"function-tey-docgen-highlight-lexoperator","kind":"function","line":228,"name":"lexOperator","qualifiedName":"Tey.Docgen.Highlight.lexOperator","signatures":["lexOperator(cs: [Char]) -> ([Tok], [Char])"],"summary":"","types":["[Char]","([Tok], [Char])"],"urlPath":"tey/docgen/highlight"},{"anchor":"function-tey-docgen-highlight-twocharop","kind":"function","line":246,"name":"twoCharOp","qualifiedName":"Tey.Docgen.Highlight.twoCharOp","signatures":["twoCharOp(cs: [Char]) -> String"],"summary":"","types":["[Char]","String"],"urlPath":"tey/docgen/highlight"},{"anchor":"function-tey-docgen-highlight-keywords","kind":"function","line":257,"name":"keywords","qualifiedName":"Tey.Docgen.Highlight.keywords","signatures":["keywords : [String]"],"summary":"Functions rather than module constants: on BEAM, method calls on a module-level constant fail to dispatch.","types":["[String]"],"urlPath":"tey/docgen/highlight"},{"anchor":"function-tey-docgen-highlight-constants","kind":"function","line":265,"name":"constants","qualifiedName":"Tey.Docgen.Highlight.constants","signatures":["constants : [String]"],"summary":"","types":["[String]"],"urlPath":"tey/docgen/highlight"},{"anchor":"function-tey-docgen-highlight-typenames","kind":"function","line":270,"name":"typeNames","qualifiedName":"Tey.Docgen.Highlight.typeNames","signatures":["typeNames : [String]"],"summary":"","types":["[String]"],"urlPath":"tey/docgen/highlight"},{"anchor":"function-tey-docgen-highlight-rendertokens","kind":"function","line":276,"name":"renderTokens","qualifiedName":"Tey.Docgen.Highlight.renderTokens","signatures":["renderTokens(toks: [Tok]) -> String"],"summary":"","types":["[Tok]","String"],"urlPath":"tey/docgen/highlight"},{"anchor":"function-tey-docgen-highlight-rendertok","kind":"function","line":280,"name":"renderTok","qualifiedName":"Tey.Docgen.Highlight.renderTok","signatures":["renderTok(t: Tok) -> String"],"summary":"","types":["Tok","String"],"urlPath":"tey/docgen/highlight"},{"anchor":"function-tey-docgen-highlight-esc","kind":"function","line":289,"name":"esc","qualifiedName":"Tey.Docgen.Highlight.esc","signatures":["esc(s: String) -> String"],"summary":"Local copy of Tey.Docgen.Html.esc — duplicating four replaces keeps the modules acyclic (Html calls Highlight for code blocks).","types":["String"],"urlPath":"tey/docgen/highlight"},{"anchor":"function-tey-docgen-highlight-textof","kind":"function","line":293,"name":"textOf","qualifiedName":"Tey.Docgen.Highlight.textOf","signatures":["textOf(cs: [Char]) -> String"],"summary":"","types":["[Char]","String"],"urlPath":"tey/docgen/highlight"},{"anchor":"function-tey-docgen-highlight-startswithchars","kind":"function","line":297,"name":"startsWithChars","qualifiedName":"Tey.Docgen.Highlight.startsWithChars","signatures":["startsWithChars(cs: [Char], s: String) -> Bool"],"summary":"","types":["[Char]","String","Bool"],"urlPath":"tey/docgen/highlight"},{"anchor":"module-tey-docgen-html","kind":"module","line":9,"name":"Tey.Docgen.Html","qualifiedName":"Tey.Docgen.Html","signatures":["pageHtml(page: SourcePage, model: PackageModel) -> String","submodulesHtml(page: SourcePage, model: PackageModel) -> String","submoduleItem(child: SourcePage, page: SourcePage, model: PackageModel) -> String","preludePage?(page: SourcePage, model: PackageModel) -> Bool","preludePageHtml(page: SourcePage, model: PackageModel) -> String","preludeItem(model: PackageModel, fromPath: String, name: String) -> String","preludeLink(model: PackageModel, fromPath: String, name: String) -> String","pageNamed(model: PackageModel, name: String) -> SourcePage?","pageStem(urlPath: String) -> String","moduleSummary(model: PackageModel, name: String) -> String","versionIndexHtml(model: PackageModel) -> String","indexSections(model: PackageModel, top: [String]) -> String","preludePaths(model: PackageModel) -> [String]","preludePath(model: PackageModel, name: String) -> [String]","cardGrid(modules: [Tey.Docgen.Model.ModuleIndexEntry], top: [String]) -> String","packageVersionsHtml(packageName: String, versions: [VersionEntry]) -> String","versionCard(v: VersionEntry) -> String","searchPageHtml(model: PackageModel) -> String","rootIndexHtml(versions: [VersionEntry]) -> String","packageNames(versions: [VersionEntry]) -> [String]","packageCard(name: String, versions: [VersionEntry]) -> String","layout(title: String, current: String, bodyContent: String, model: PackageModel) -> String","sidebar(model: PackageModel, current: String) -> String","sidebarEntry(page: SourcePage, current: String, vpre: String, pages: [SourcePage]) -> String","preludeTag(inPrelude: Bool) -> String","firstModulesOfPages(pages: [SourcePage]) -> [String]","moduleCard(m: Tey.Docgen.Model.ModuleIndexEntry, top: Bool) -> String","entitySection(e: Entity, page: SourcePage, model: PackageModel) -> String","linker(page: SourcePage, model: PackageModel) -> String -> String","typeSection(e: TypeEntry, page: SourcePage, model: PackageModel) -> String","variantsHtml(variants: [VariantEntry]?) -> String","variantItem(v: VariantEntry) -> String","recordSection(e: RecordEntry, page: SourcePage, model: PackageModel) -> String","fieldRow(f: Tey.Docgen.Model.FieldEntry, link: (String -> String)) -> String","linkTypeText(link: (String -> String), text: String) -> String","linkType(links: [LinkEntry], fromPath: String, name: String) -> String","traitSection(e: TraitEntry, page: SourcePage, model: PackageModel) -> String","makeSection(e: MakeEntry, page: SourcePage, model: PackageModel) -> String","moduleSection(e: ModuleEntry, page: SourcePage, model: PackageModel) -> String","functionSection(e: FunctionEntry, page: SourcePage, model: PackageModel) -> String","constantSection(e: ConstantEntry) -> String","functionsHtml(functions: [FunctionEntry], link: (String -> String)) -> String","functionDetail(f: FunctionEntry, link: (String -> String)) -> String","signaturesHtml(f: FunctionEntry) -> String","docHtml(doc: Doc) -> String","summaryParagraphs(summary: String) -> [String]","groupParagraphs(lines: [String], current: [String], accum: [String], fenced: Bool) -> [String]","paragraphHtml(p: String) -> String","inlineCode(text: String) -> String","paramsHtml(doc: Doc, link: (String -> String)) -> String","returnsHtml(doc: Doc, link: (String -> String)) -> String","examplesHtml(doc: Doc) -> String","deprecatedHtml(doc: Doc) -> String","esc(s: String) -> String","labelOf(model: PackageModel) -> String","pageTarget(current: String) -> String","markdownLink(current: String) -> String","slug(name: String) -> String","typeParamSuffix(typeParams: [String]) -> String","versionPrefix(urlPath: String) -> String","rootPrefix(urlPath: String) -> String","ups(n: Integer) -> String"],"summary":"","types":["SourcePage","PackageModel","String","Bool","SourcePage?","[String]","[Tey.Docgen.Model.ModuleIndexEntry]","[VersionEntry]","VersionEntry","[SourcePage]","Tey.Docgen.Model.ModuleIndexEntry","Entity","String -> String","TypeEntry","[VariantEntry]?","VariantEntry","RecordEntry","Tey.Docgen.Model.FieldEntry","(String -> String)","[LinkEntry]","TraitEntry","MakeEntry","ModuleEntry","FunctionEntry","ConstantEntry","[FunctionEntry]","Doc","Integer"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-pagehtml","kind":"function","line":12,"name":"pageHtml","qualifiedName":"Tey.Docgen.Html.pageHtml","signatures":["pageHtml(page: SourcePage, model: PackageModel) -> String"],"summary":"","types":["SourcePage","PackageModel","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-submoduleshtml","kind":"function","line":27,"name":"submodulesHtml","qualifiedName":"Tey.Docgen.Html.submodulesHtml","signatures":["submodulesHtml(page: SourcePage, model: PackageModel) -> String"],"summary":"A module family spread over several files (\"Net\" + net/dns.kex, net/http.kex, ...) gets one page per file, and the parent page says nothing about the rest — a reader on \"Net\" has no reason to believe Net.DNS or Net.Socket are documented at all. This section is the signpost: every descendant page, with the summary its module declares.","types":["SourcePage","PackageModel","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-submoduleitem","kind":"function","line":34,"name":"submoduleItem","qualifiedName":"Tey.Docgen.Html.submoduleItem","signatures":["submoduleItem(child: SourcePage, page: SourcePage, model: PackageModel) -> String"],"summary":"","types":["SourcePage","PackageModel","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-preludepage?","kind":"function","line":41,"name":"preludePage?","qualifiedName":"Tey.Docgen.Html.preludePage?","signatures":["preludePage?(page: SourcePage, model: PackageModel) -> Bool"],"summary":"","types":["SourcePage","PackageModel","Bool"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-preludepagehtml","kind":"function","line":49,"name":"preludePageHtml","qualifiedName":"Tey.Docgen.Html.preludePageHtml","signatures":["preludePageHtml(page: SourcePage, model: PackageModel) -> String"],"summary":"The prelude declares nothing, so the generic page renderer leaves it blank. What it HAS is a list of imports and a comment explaining them — which is exactly the page a reader wants: what am I given for free, and where does each of those live.","types":["SourcePage","PackageModel","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-preludeitem","kind":"function","line":62,"name":"preludeItem","qualifiedName":"Tey.Docgen.Html.preludeItem","signatures":["preludeItem(model: PackageModel, fromPath: String, name: String) -> String"],"summary":"","types":["PackageModel","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-preludelink","kind":"function","line":75,"name":"preludeLink","qualifiedName":"Tey.Docgen.Html.preludeLink","signatures":["preludeLink(model: PackageModel, fromPath: String, name: String) -> String"],"summary":"A `using X` in prelude.kex names a sibling SOURCE FILE, so the page for that file is the exact target. Going through the link index instead would lose half the list: `Map`, `Set` and `Range` are ambiguous as bare names — a module and a type both claim them — and resolve to nothing.\n\nThe file is what matches, not the title: `using Test` is test.kex, whose page is titled \"Assert\", and `using Env` is env.kex, titled \"ENV\".","types":["PackageModel","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-pagenamed","kind":"function","line":85,"name":"pageNamed","qualifiedName":"Tey.Docgen.Html.pageNamed","signatures":["pageNamed(model: PackageModel, name: String) -> SourcePage?"],"summary":"","types":["PackageModel","String","SourcePage?"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-pagestem","kind":"function","line":92,"name":"pageStem","qualifiedName":"Tey.Docgen.Html.pageStem","signatures":["pageStem(urlPath: String) -> String"],"summary":"","types":["String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-modulesummary","kind":"function","line":96,"name":"moduleSummary","qualifiedName":"Tey.Docgen.Html.moduleSummary","signatures":["moduleSummary(model: PackageModel, name: String) -> String"],"summary":"","types":["PackageModel","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-versionindexhtml","kind":"function","line":107,"name":"versionIndexHtml","qualifiedName":"Tey.Docgen.Html.versionIndexHtml","signatures":["versionIndexHtml(model: PackageModel) -> String"],"summary":"Landing page for <pkg>/<version>/index.html: every module as a card. When the package has a prelude, the cards are split by how a reader REACHES them — visible everywhere, or one `using` away — because that is the first question anyone has about a standard library.","types":["PackageModel","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-indexsections","kind":"function","line":115,"name":"indexSections","qualifiedName":"Tey.Docgen.Html.indexSections","signatures":["indexSections(model: PackageModel, top: [String]) -> String"],"summary":"","types":["PackageModel","[String]","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-preludepaths","kind":"function","line":135,"name":"preludePaths","qualifiedName":"Tey.Docgen.Html.preludePaths","signatures":["preludePaths(model: PackageModel) -> [String]"],"summary":"The prelude imports FILES, and everything a listed file declares comes with it: `using Time` is what puts `Date`, `Duration` and `Time.Period` in scope, none of which prelude.kex names. So the split is by page, not by module name.","types":["PackageModel","[String]"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-preludepath","kind":"function","line":139,"name":"preludePath","qualifiedName":"Tey.Docgen.Html.preludePath","signatures":["preludePath(model: PackageModel, name: String) -> [String]"],"summary":"","types":["PackageModel","String","[String]"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-cardgrid","kind":"function","line":146,"name":"cardGrid","qualifiedName":"Tey.Docgen.Html.cardGrid","signatures":["cardGrid(modules: [Tey.Docgen.Model.ModuleIndexEntry], top: [String]) -> String"],"summary":"","types":["[Tey.Docgen.Model.ModuleIndexEntry]","[String]","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-packageversionshtml","kind":"function","line":155,"name":"packageVersionsHtml","qualifiedName":"Tey.Docgen.Html.packageVersionsHtml","signatures":["packageVersionsHtml(packageName: String, versions: [VersionEntry]) -> String"],"summary":"<pkg>/index.html: the versions of one package, newest first — the page a reader lands on when they want a different release of what they are reading. What the ids MEAN is the package's own story: a library's own releases, the stdlib's Kex releases. The page does not need to know.","types":["String","[VersionEntry]"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-versioncard","kind":"function","line":194,"name":"versionCard","qualifiedName":"Tey.Docgen.Html.versionCard","signatures":["versionCard(v: VersionEntry) -> String"],"summary":"","types":["VersionEntry","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-searchpagehtml","kind":"function","line":201,"name":"searchPageHtml","qualifiedName":"Tey.Docgen.Html.searchPageHtml","signatures":["searchPageHtml(model: PackageModel) -> String"],"summary":"<pkg>/<version>/search.html: the shareable full-page search. The modal on every page links here with ?q=<term>, so a results page is a URL rather than a state — the page reads the term back from the query string.","types":["PackageModel","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-rootindexhtml","kind":"function","line":349,"name":"rootIndexHtml","qualifiedName":"Tey.Docgen.Html.rootIndexHtml","signatures":["rootIndexHtml(versions: [VersionEntry]) -> String"],"summary":"Site root index.html: one card per PACKAGE (its newest build), not per build — a reader arrives at \"the docs\" for a thing, and the thing is a package; its versions are one click down. Built from the accumulated versions.json entries, not just this build's model.","types":["[VersionEntry]","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-packagenames","kind":"function","line":391,"name":"packageNames","qualifiedName":"Tey.Docgen.Html.packageNames","signatures":["packageNames(versions: [VersionEntry]) -> [String]"],"summary":"Package names in first-seen order of their newest entry: versions arrive newest-first from accumulateVersions, so the first entry of each package is that package's newest build.","types":["[VersionEntry]","[String]"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-packagecard","kind":"function","line":396,"name":"packageCard","qualifiedName":"Tey.Docgen.Html.packageCard","signatures":["packageCard(name: String, versions: [VersionEntry]) -> String"],"summary":"","types":["String","[VersionEntry]"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-layout","kind":"function","line":405,"name":"layout","qualifiedName":"Tey.Docgen.Html.layout","signatures":["layout(title: String, current: String, bodyContent: String, model: PackageModel) -> String"],"summary":"","types":["String","PackageModel"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-sidebar","kind":"function","line":465,"name":"sidebar","qualifiedName":"Tey.Docgen.Html.sidebar","signatures":["sidebar(model: PackageModel, current: String) -> String"],"summary":"The sidebar lists one entry per source FILE, nested by module family: a page whose title is a dotted child of another page's title nests under it (\"Net.DNS\" under \"Net\", \"Net.HTTP.WebSocket\" under \"Net.HTTP\"), so a multi-file module reads as one branch instead of trailing the list in directory-walk order. The active file expands to its top-level declarations so a reader can jump straight to one. The label is the page's title (the module it declares), not the raw file name. The heading is a link: it is the package's name, and the obvious thing to want from it is the list of what the package contains — which is the version index, where the prelude split lives.","types":["PackageModel","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-sidebarentry","kind":"function","line":474,"name":"sidebarEntry","qualifiedName":"Tey.Docgen.Html.sidebarEntry","signatures":["sidebarEntry(page: SourcePage, current: String, vpre: String, pages: [SourcePage]) -> String"],"summary":"","types":["SourcePage","String","[SourcePage]"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-preludetag","kind":"function","line":495,"name":"preludeTag","qualifiedName":"Tey.Docgen.Html.preludeTag","signatures":["preludeTag(inPrelude: Bool) -> String"],"summary":"The page's own heading carries it — the sidebar is a list to scan, and a chip on 32 of 41 rows is noise rather than an answer.","types":["Bool","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-firstmodulesofpages","kind":"function","line":503,"name":"firstModulesOfPages","qualifiedName":"Tey.Docgen.Html.firstModulesOfPages","signatures":["firstModulesOfPages(pages: [SourcePage]) -> [String]"],"summary":"The modules that OPEN a page — their section sits at the very top, so a card for one links to the page itself rather than to an anchor that lands where the page already starts. A page whose first declaration is a type or record has no such module.","types":["[SourcePage]","[String]"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-modulecard","kind":"function","line":512,"name":"moduleCard","qualifiedName":"Tey.Docgen.Html.moduleCard","signatures":["moduleCard(m: Tey.Docgen.Model.ModuleIndexEntry, top: Bool) -> String"],"summary":"","types":["Tey.Docgen.Model.ModuleIndexEntry","Bool","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-entitysection","kind":"function","line":526,"name":"entitySection","qualifiedName":"Tey.Docgen.Html.entitySection","signatures":["entitySection(e: Entity, page: SourcePage, model: PackageModel) -> String"],"summary":"","types":["Entity","SourcePage","PackageModel","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-linker","kind":"function","line":540,"name":"linker","qualifiedName":"Tey.Docgen.Html.linker","signatures":["linker(page: SourcePage, model: PackageModel) -> String -> String"],"summary":"A reference resolver scoped to one page: links resolve against the whole package index, but the href is relative to the page doing the referring.","types":["SourcePage","PackageModel","String -> String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-typesection","kind":"function","line":544,"name":"typeSection","qualifiedName":"Tey.Docgen.Html.typeSection","signatures":["typeSection(e: TypeEntry, page: SourcePage, model: PackageModel) -> String"],"summary":"","types":["TypeEntry","SourcePage","PackageModel","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-variantshtml","kind":"function","line":554,"name":"variantsHtml","qualifiedName":"Tey.Docgen.Html.variantsHtml","signatures":["variantsHtml(variants: [VariantEntry]?) -> String"],"summary":"","types":["[VariantEntry]?","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-variantitem","kind":"function","line":564,"name":"variantItem","qualifiedName":"Tey.Docgen.Html.variantItem","signatures":["variantItem(v: VariantEntry) -> String"],"summary":"","types":["VariantEntry","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-recordsection","kind":"function","line":574,"name":"recordSection","qualifiedName":"Tey.Docgen.Html.recordSection","signatures":["recordSection(e: RecordEntry, page: SourcePage, model: PackageModel) -> String"],"summary":"","types":["RecordEntry","SourcePage","PackageModel","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-fieldrow","kind":"function","line":580,"name":"fieldRow","qualifiedName":"Tey.Docgen.Html.fieldRow","signatures":["fieldRow(f: Tey.Docgen.Model.FieldEntry, link: (String -> String)) -> String"],"summary":"","types":["Tey.Docgen.Model.FieldEntry","(String -> String)","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-linktypetext","kind":"function","line":587,"name":"linkTypeText","qualifiedName":"Tey.Docgen.Html.linkTypeText","signatures":["linkTypeText(link: (String -> String), text: String) -> String"],"summary":"A type text is code with links inside it: split into identifier and punctuation segments, link the identifiers that resolve, escape the rest.","types":["(String -> String)","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-linktype","kind":"function","line":599,"name":"linkType","qualifiedName":"Tey.Docgen.Html.linkType","signatures":["linkType(links: [LinkEntry], fromPath: String, name: String) -> String"],"summary":"The whole-package resolution one segment goes through: an exact name hit links (display text escaped); anything else is plain escaped code.","types":["[LinkEntry]","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-traitsection","kind":"function","line":609,"name":"traitSection","qualifiedName":"Tey.Docgen.Html.traitSection","signatures":["traitSection(e: TraitEntry, page: SourcePage, model: PackageModel) -> String"],"summary":"","types":["TraitEntry","SourcePage","PackageModel","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-makesection","kind":"function","line":614,"name":"makeSection","qualifiedName":"Tey.Docgen.Html.makeSection","signatures":["makeSection(e: MakeEntry, page: SourcePage, model: PackageModel) -> String"],"summary":"","types":["MakeEntry","SourcePage","PackageModel","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-modulesection","kind":"function","line":624,"name":"moduleSection","qualifiedName":"Tey.Docgen.Html.moduleSection","signatures":["moduleSection(e: ModuleEntry, page: SourcePage, model: PackageModel) -> String"],"summary":"","types":["ModuleEntry","SourcePage","PackageModel","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-functionsection","kind":"function","line":629,"name":"functionSection","qualifiedName":"Tey.Docgen.Html.functionSection","signatures":["functionSection(e: FunctionEntry, page: SourcePage, model: PackageModel) -> String"],"summary":"","types":["FunctionEntry","SourcePage","PackageModel","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-constantsection","kind":"function","line":634,"name":"constantSection","qualifiedName":"Tey.Docgen.Html.constantSection","signatures":["constantSection(e: ConstantEntry) -> String"],"summary":"","types":["ConstantEntry","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-functionshtml","kind":"function","line":643,"name":"functionsHtml","qualifiedName":"Tey.Docgen.Html.functionsHtml","signatures":["functionsHtml(functions: [FunctionEntry], link: (String -> String)) -> String"],"summary":"","types":["[FunctionEntry]","(String -> String)","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-functiondetail","kind":"function","line":651,"name":"functionDetail","qualifiedName":"Tey.Docgen.Html.functionDetail","signatures":["functionDetail(f: FunctionEntry, link: (String -> String)) -> String"],"summary":"","types":["FunctionEntry","(String -> String)","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-signatureshtml","kind":"function","line":655,"name":"signaturesHtml","qualifiedName":"Tey.Docgen.Html.signaturesHtml","signatures":["signaturesHtml(f: FunctionEntry) -> String"],"summary":"","types":["FunctionEntry","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-dochtml","kind":"function","line":662,"name":"docHtml","qualifiedName":"Tey.Docgen.Html.docHtml","signatures":["docHtml(doc: Doc) -> String"],"summary":"","types":["Doc","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-summaryparagraphs","kind":"function","line":672,"name":"summaryParagraphs","qualifiedName":"Tey.Docgen.Html.summaryParagraphs","signatures":["summaryParagraphs(summary: String) -> [String]"],"summary":"Paragraphs break on blank lines — except inside a fenced block, where a blank line is part of the code rather than the end of a paragraph.","types":["String","[String]"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-groupparagraphs","kind":"function","line":676,"name":"groupParagraphs","qualifiedName":"Tey.Docgen.Html.groupParagraphs","signatures":["groupParagraphs(lines: [String], current: [String], accum: [String], fenced: Bool) -> [String]"],"summary":"","types":["[String]","Bool"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-paragraphhtml","kind":"function","line":700,"name":"paragraphHtml","qualifiedName":"Tey.Docgen.Html.paragraphHtml","signatures":["paragraphHtml(p: String) -> String"],"summary":"A summary paragraph is either prose or a fenced block that Rdoc produced from an indented (verbatim) block — the latter is highlighted code, not text to reflow.","types":["String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-inlinecode","kind":"function","line":712,"name":"inlineCode","qualifiedName":"Tey.Docgen.Html.inlineCode","signatures":["inlineCode(text: String) -> String"],"summary":"Minimal inline Markdown for doc prose: `code` spans. Splitting on the backtick alternates plain/code segments; an unmatched trailing backtick degrades to literal text rather than swallowing the rest of the page.","types":["String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-paramshtml","kind":"function","line":729,"name":"paramsHtml","qualifiedName":"Tey.Docgen.Html.paramsHtml","signatures":["paramsHtml(doc: Doc, link: (String -> String)) -> String"],"summary":"","types":["Doc","(String -> String)","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-returnshtml","kind":"function","line":740,"name":"returnsHtml","qualifiedName":"Tey.Docgen.Html.returnsHtml","signatures":["returnsHtml(doc: Doc, link: (String -> String)) -> String"],"summary":"","types":["Doc","(String -> String)","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-exampleshtml","kind":"function","line":753,"name":"examplesHtml","qualifiedName":"Tey.Docgen.Html.examplesHtml","signatures":["examplesHtml(doc: Doc) -> String"],"summary":"","types":["Doc","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-deprecatedhtml","kind":"function","line":764,"name":"deprecatedHtml","qualifiedName":"Tey.Docgen.Html.deprecatedHtml","signatures":["deprecatedHtml(doc: Doc) -> String"],"summary":"","types":["Doc","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-esc","kind":"function","line":772,"name":"esc","qualifiedName":"Tey.Docgen.Html.esc","signatures":["esc(s: String) -> String"],"summary":"Escape text for HTML (content and double-quoted attributes).","types":["String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-labelof","kind":"function","line":776,"name":"labelOf","qualifiedName":"Tey.Docgen.Html.labelOf","signatures":["labelOf(model: PackageModel) -> String"],"summary":"","types":["PackageModel","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-pagetarget","kind":"function","line":784,"name":"pageTarget","qualifiedName":"Tey.Docgen.Html.pageTarget","signatures":["pageTarget(current: String) -> String"],"summary":"The page the version switcher tries first in the target version.","types":["String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-markdownlink","kind":"function","line":795,"name":"markdownLink","qualifiedName":"Tey.Docgen.Html.markdownLink","signatures":["markdownLink(current: String) -> String"],"summary":"Every page's raw Markdown, next to its HTML: the footer link humans see, and the address llms.txt tells models about. Index pages have none. The target is a bare sibling filename — the page already stands in the directory its `.md` was written to, so no prefix climbing is wanted.","types":["String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-slug","kind":"function","line":803,"name":"slug","qualifiedName":"Tey.Docgen.Html.slug","signatures":["slug(name: String) -> String"],"summary":"","types":["String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-typeparamsuffix","kind":"function","line":807,"name":"typeParamSuffix","qualifiedName":"Tey.Docgen.Html.typeParamSuffix","signatures":["typeParamSuffix(typeParams: [String]) -> String"],"summary":"","types":["[String]","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-versionprefix","kind":"function","line":816,"name":"versionPrefix","qualifiedName":"Tey.Docgen.Html.versionPrefix","signatures":["versionPrefix(urlPath: String) -> String"],"summary":"Relative path from a page's urlPath back to the version directory: \"string\" → \"\" (sibling), \"kex/ast\" → \"../\".","types":["String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-rootprefix","kind":"function","line":824,"name":"rootPrefix","qualifiedName":"Tey.Docgen.Html.rootPrefix","signatures":["rootPrefix(urlPath: String) -> String"],"summary":"From the page to the site root: version dir is <pkg>/<version>/.","types":["String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-ups","kind":"function","line":828,"name":"ups","qualifiedName":"Tey.Docgen.Html.ups","signatures":["ups(n: Integer) -> String"],"summary":"","types":["Integer","String"],"urlPath":"tey/docgen/html"},{"anchor":"module-tey-docgen-index","kind":"module","line":5,"name":"Tey.Docgen.Index","qualifiedName":"Tey.Docgen.Index","signatures":["buildCommand(parsed: OptionParser.ParsedOptions) -> Integer","optString(value: String?) -> String","preludeInfo(source: String) -> (String, [String], String)","leadingComment(lines: [String]) -> String","commentBody(line: String) -> String","usingName(line: String) -> String","defaultSource(given: String) -> String","defaultPackage(given: String) -> String","defaultVersion(given: String) -> String","manifestVersion : (String, String)?","buildPages(files: [String], sourceDir: String) -> [SourcePage]","buildPagesLoop(files: [String], sourceDir: String, pages: [SourcePage]) -> [SourcePage]","writePages(pages: [SourcePage], versionDir: String, model: PackageModel) -> Integer","writeHtml(pages: [SourcePage], versionDir: String, out: String, model: PackageModel) -> ()","dirNameOf(urlPath: String) -> String","ensureDirectory(path: String) -> ()","writeIndexFiles(pages: [SourcePage], model: PackageModel, out: String) -> ()","versionManifestJson(pages: [SourcePage], model: PackageModel) -> String","manifestJson(pages: [SourcePage]) -> String","accumulateVersions(out: String, model: PackageModel) -> [VersionEntry]","upsertVersion(current: VersionEntry, existing: [VersionEntry]) -> [VersionEntry]","readVersionEntries(out: String) -> [VersionEntry]","parseVersionEntry(v: Any) -> VersionEntry","jsonText(value: Any?) -> String","labelOrPackage(model: PackageModel) -> String","versionsJson(entries: [VersionEntry]) -> String","versionEntryValue(e: VersionEntry) -> Any","llmsTxt(pages: [SourcePage], model: PackageModel) -> String","llmsFullTxt(pages: [SourcePage], model: PackageModel) -> String","robotsTxt(baseUrl: String) -> String","sitemapXml(pages: [SourcePage], model: PackageModel) -> String","normalizeBaseUrl(url: String) -> String"],"summary":"","types":["OptionParser.ParsedOptions","Integer","String?","String","(String, [String], String)","[String]","(String, String)?","[SourcePage]","PackageModel","()","[VersionEntry]","VersionEntry","Any","Any?"],"urlPath":"tey/docgen/index"},{"anchor":"function-tey-docgen-index-buildcommand","kind":"function","line":8,"name":"buildCommand","qualifiedName":"Tey.Docgen.Index.buildCommand","signatures":["buildCommand(parsed: OptionParser.ParsedOptions) -> Integer"],"summary":"","types":["OptionParser.ParsedOptions","Integer"],"urlPath":"tey/docgen/index"},{"anchor":"function-tey-docgen-index-optstring","kind":"function","line":72,"name":"optString","qualifiedName":"Tey.Docgen.Index.optString","signatures":["optString(value: String?) -> String"],"summary":"","types":["String?","String"],"urlPath":"tey/docgen/index"},{"anchor":"function-tey-docgen-index-preludeinfo","kind":"function","line":83,"name":"preludeInfo","qualifiedName":"Tey.Docgen.Index.preludeInfo","signatures":["preludeInfo(source: String) -> (String, [String], String)"],"summary":"A source tree with a `prelude.kex` has a subset that is visible without an import, and the reader wants to know which. The file is declarative by convention — an opening comment, then one bare `using <Module>` per line — so reading it is enough. A package without one gets empties, and nothing in the output mentions a prelude at all.\n\nReturns (the file, the modules it makes visible, its opening comment).","types":["String","(String, [String], String)"],"urlPath":"tey/docgen/index"},{"anchor":"function-tey-docgen-index-leadingcomment","kind":"function","line":95,"name":"leadingComment","qualifiedName":"Tey.Docgen.Index.leadingComment","signatures":["leadingComment(lines: [String]) -> String"],"summary":"The file's opening comment block, `#` markers stripped, ready for the same Rdoc parse every other doc comment goes through.","types":["[String]","String"],"urlPath":"tey/docgen/index"},{"anchor":"function-tey-docgen-index-commentbody","kind":"function","line":99,"name":"commentBody","qualifiedName":"Tey.Docgen.Index.commentBody","signatures":["commentBody(line: String) -> String"],"summary":"","types":["String"],"urlPath":"tey/docgen/index"},{"anchor":"function-tey-docgen-index-usingname","kind":"function","line":106,"name":"usingName","qualifiedName":"Tey.Docgen.Index.usingName","signatures":["usingName(line: String) -> String"],"summary":"\"using List\" -> \"List\"; anything else (a comment, a blank line, an `only:` list) -> \"\".","types":["String"],"urlPath":"tey/docgen/index"},{"anchor":"function-tey-docgen-index-defaultsource","kind":"function","line":113,"name":"defaultSource","qualifiedName":"Tey.Docgen.Index.defaultSource","signatures":["defaultSource(given: String) -> String"],"summary":"`src/` when it is standing there, else the flag as given (an empty one is reported by the scan: \"no .kex files found in\").","types":["String"],"urlPath":"tey/docgen/index"},{"anchor":"function-tey-docgen-index-defaultpackage","kind":"function","line":125,"name":"defaultPackage","qualifiedName":"Tey.Docgen.Index.defaultPackage","signatures":["defaultPackage(given: String) -> String"],"summary":"The manifest's name when the CWD is a package — the identity docgen should not have to be told. Outside one, \"\": the caller has to say, and buildCommand refuses rather than inventing a name. Docgen used to answer \"prelude\" here, which meant a build with a swallowed or forgotten --package filed its pages under whatever the CWD's package.kex said (the stdlib was published as \"kex\" for exactly that reason, kexhq/kex#287).","types":["String"],"urlPath":"tey/docgen/index"},{"anchor":"function-tey-docgen-index-defaultversion","kind":"function","line":140,"name":"defaultVersion","qualifiedName":"Tey.Docgen.Index.defaultVersion","signatures":["defaultVersion(given: String) -> String"],"summary":"The version of the thing being documented: a package's own release when standing in one. What a package's versions ARE differs per package — a library's own releases, the stdlib's Kex releases — so outside a package this is the caller's to state (--release) rather than docgen's to guess.","types":["String"],"urlPath":"tey/docgen/index"},{"anchor":"function-tey-docgen-index-manifestversion","kind":"function","line":153,"name":"manifestVersion","qualifiedName":"Tey.Docgen.Index.manifestVersion","signatures":["manifestVersion : (String, String)?"],"summary":"(name, version) of the package.kex in the CWD, if there is a readable one. Both defaults read it; one read, one parse.","types":["(String, String)?"],"urlPath":"tey/docgen/index"},{"anchor":"function-tey-docgen-index-buildpages","kind":"function","line":163,"name":"buildPages","qualifiedName":"Tey.Docgen.Index.buildPages","signatures":["buildPages(files: [String], sourceDir: String) -> [SourcePage]"],"summary":"","types":["[String]","String","[SourcePage]"],"urlPath":"tey/docgen/index"},{"anchor":"function-tey-docgen-index-buildpagesloop","kind":"function","line":167,"name":"buildPagesLoop","qualifiedName":"Tey.Docgen.Index.buildPagesLoop","signatures":["buildPagesLoop(files: [String], sourceDir: String, pages: [SourcePage]) -> [SourcePage]"],"summary":"","types":["[String]","String","[SourcePage]"],"urlPath":"tey/docgen/index"},{"anchor":"function-tey-docgen-index-writepages","kind":"function","line":187,"name":"writePages","qualifiedName":"Tey.Docgen.Index.writePages","signatures":["writePages(pages: [SourcePage], versionDir: String, model: PackageModel) -> Integer"],"summary":"","types":["[SourcePage]","String","PackageModel","Integer"],"urlPath":"tey/docgen/index"},{"anchor":"function-tey-docgen-index-writehtml","kind":"function","line":199,"name":"writeHtml","qualifiedName":"Tey.Docgen.Index.writeHtml","signatures":["writeHtml(pages: [SourcePage], versionDir: String, out: String, model: PackageModel) -> ()"],"summary":"HTML mirrors the Markdown layout: one page per source file, plus the version landing page, the site-root redirect and the shared stylesheet.","types":["[SourcePage]","String","PackageModel","()"],"urlPath":"tey/docgen/index"},{"anchor":"function-tey-docgen-index-dirnameof","kind":"function","line":216,"name":"dirNameOf","qualifiedName":"Tey.Docgen.Index.dirNameOf","signatures":["dirNameOf(urlPath: String) -> String"],"summary":"\"kex/ast\" → \"kex\"; \"fs\" → \"\" (already inside versionDir).","types":["String"],"urlPath":"tey/docgen/index"},{"anchor":"function-tey-docgen-index-ensuredirectory","kind":"function","line":224,"name":"ensureDirectory","qualifiedName":"Tey.Docgen.Index.ensureDirectory","signatures":["ensureDirectory(path: String) -> ()"],"summary":"","types":["String","()"],"urlPath":"tey/docgen/index"},{"anchor":"function-tey-docgen-index-writeindexfiles","kind":"function","line":230,"name":"writeIndexFiles","qualifiedName":"Tey.Docgen.Index.writeIndexFiles","signatures":["writeIndexFiles(pages: [SourcePage], model: PackageModel, out: String) -> ()"],"summary":"","types":["[SourcePage]","PackageModel","String","()"],"urlPath":"tey/docgen/index"},{"anchor":"function-tey-docgen-index-versionmanifestjson","kind":"function","line":263,"name":"versionManifestJson","qualifiedName":"Tey.Docgen.Index.versionManifestJson","signatures":["versionManifestJson(pages: [SourcePage], model: PackageModel) -> String"],"summary":"One version's pages, with the package and version they belong to, so a reader of the file needs nothing but the file. Page paths stay relative to the version directory — the URL prefix is `<package>/<version>/`, and whoever assembles the site is the one that knows the site root.","types":["[SourcePage]","PackageModel","String"],"urlPath":"tey/docgen/index"},{"anchor":"function-tey-docgen-index-manifestjson","kind":"function","line":273,"name":"manifestJson","qualifiedName":"Tey.Docgen.Index.manifestJson","signatures":["manifestJson(pages: [SourcePage]) -> String"],"summary":"","types":["[SourcePage]","String"],"urlPath":"tey/docgen/index"},{"anchor":"function-tey-docgen-index-accumulateversions","kind":"function","line":287,"name":"accumulateVersions","qualifiedName":"Tey.Docgen.Index.accumulateVersions","signatures":["accumulateVersions(out: String, model: PackageModel) -> [VersionEntry]"],"summary":"The output directory is the published site, so a build must not clobber the versions other builds published: read what is there, upsert this (package, version), write the union back, newest first.","types":["String","PackageModel","[VersionEntry]"],"urlPath":"tey/docgen/index"},{"anchor":"function-tey-docgen-index-upsertversion","kind":"function","line":299,"name":"upsertVersion","qualifiedName":"Tey.Docgen.Index.upsertVersion","signatures":["upsertVersion(current: VersionEntry, existing: [VersionEntry]) -> [VersionEntry]"],"summary":"This build's entry first, the other packages' and versions' kept: the pure half of accumulate, so the upsert rule itself can be spec'd.","types":["VersionEntry","[VersionEntry]"],"urlPath":"tey/docgen/index"},{"anchor":"function-tey-docgen-index-readversionentries","kind":"function","line":306,"name":"readVersionEntries","qualifiedName":"Tey.Docgen.Index.readVersionEntries","signatures":["readVersionEntries(out: String) -> [VersionEntry]"],"summary":"","types":["String","[VersionEntry]"],"urlPath":"tey/docgen/index"},{"anchor":"function-tey-docgen-index-parseversionentry","kind":"function","line":323,"name":"parseVersionEntry","qualifiedName":"Tey.Docgen.Index.parseVersionEntry","signatures":["parseVersionEntry(v: Any) -> VersionEntry"],"summary":"","types":["Any","VersionEntry"],"urlPath":"tey/docgen/index"},{"anchor":"function-tey-docgen-index-jsontext","kind":"function","line":332,"name":"jsonText","qualifiedName":"Tey.Docgen.Index.jsonText","signatures":["jsonText(value: Any?) -> String"],"summary":"","types":["Any?","String"],"urlPath":"tey/docgen/index"},{"anchor":"function-tey-docgen-index-labelorpackage","kind":"function","line":339,"name":"labelOrPackage","qualifiedName":"Tey.Docgen.Index.labelOrPackage","signatures":["labelOrPackage(model: PackageModel) -> String"],"summary":"","types":["PackageModel","String"],"urlPath":"tey/docgen/index"},{"anchor":"function-tey-docgen-index-versionsjson","kind":"function","line":346,"name":"versionsJson","qualifiedName":"Tey.Docgen.Index.versionsJson","signatures":["versionsJson(entries: [VersionEntry]) -> String"],"summary":"","types":["[VersionEntry]","String"],"urlPath":"tey/docgen/index"},{"anchor":"function-tey-docgen-index-versionentryvalue","kind":"function","line":350,"name":"versionEntryValue","qualifiedName":"Tey.Docgen.Index.versionEntryValue","signatures":["versionEntryValue(e: VersionEntry) -> Any"],"summary":"","types":["VersionEntry","Any"],"urlPath":"tey/docgen/index"},{"anchor":"function-tey-docgen-index-llmstxt","kind":"function","line":355,"name":"llmsTxt","qualifiedName":"Tey.Docgen.Index.llmsTxt","signatures":["llmsTxt(pages: [SourcePage], model: PackageModel) -> String"],"summary":"","types":["[SourcePage]","PackageModel","String"],"urlPath":"tey/docgen/index"},{"anchor":"function-tey-docgen-index-llmsfulltxt","kind":"function","line":379,"name":"llmsFullTxt","qualifiedName":"Tey.Docgen.Index.llmsFullTxt","signatures":["llmsFullTxt(pages: [SourcePage], model: PackageModel) -> String"],"summary":"","types":["[SourcePage]","PackageModel","String"],"urlPath":"tey/docgen/index"},{"anchor":"function-tey-docgen-index-robotstxt","kind":"function","line":384,"name":"robotsTxt","qualifiedName":"Tey.Docgen.Index.robotsTxt","signatures":["robotsTxt(baseUrl: String) -> String"],"summary":"","types":["String"],"urlPath":"tey/docgen/index"},{"anchor":"function-tey-docgen-index-sitemapxml","kind":"function","line":391,"name":"sitemapXml","qualifiedName":"Tey.Docgen.Index.sitemapXml","signatures":["sitemapXml(pages: [SourcePage], model: PackageModel) -> String"],"summary":"","types":["[SourcePage]","PackageModel","String"],"urlPath":"tey/docgen/index"},{"anchor":"function-tey-docgen-index-normalizebaseurl","kind":"function","line":404,"name":"normalizeBaseUrl","qualifiedName":"Tey.Docgen.Index.normalizeBaseUrl","signatures":["normalizeBaseUrl(url: String) -> String"],"summary":"","types":["String"],"urlPath":"tey/docgen/index"},{"anchor":"module-tey-docgen-json","kind":"module","line":6,"name":"Tey.Docgen.Json","qualifiedName":"Tey.Docgen.Json","signatures":["modelJson(model: PackageModel) -> String","moduleIndexValue(m: Tey.Docgen.Model.ModuleIndexEntry) -> Any","linkValue(l: Tey.Docgen.Model.LinkEntry) -> Any","labelOrPackage(model: PackageModel) -> String","pageValue(page: SourcePage) -> Any","entityValue(e: Entity) -> Any","variantsValue(variants: [VariantEntry]?) -> Any","fieldValue(f: FieldEntry) -> Any","fieldValues(fields: [FieldEntry]) -> Any","functionValue(f: FunctionEntry) -> Any","docValue(doc: Doc) -> Any","returnsValue(doc: Doc) -> Any","searchJson(model: PackageModel) -> String","searchEntries(model: PackageModel) -> [SearchEntry]","pageSearchEntries(page: SourcePage) -> [SearchEntry]","entitySearchEntries(e: Entity, page: SourcePage) -> [SearchEntry]","entityTypes(e: Entity) -> [String]","variantFieldTypes(variants: [VariantEntry]?) -> [String]","childSearchEntries(e: Entity, page: SourcePage) -> [SearchEntry]","functionSearchEntry(f: FunctionEntry, page: SourcePage) -> SearchEntry","searchValue(entry: SearchEntry) -> Any","entitySignatures(e: Entity) -> [String]","entitySummary(e: Entity) -> String"],"summary":"","types":["PackageModel","String","Tey.Docgen.Model.ModuleIndexEntry","Any","Tey.Docgen.Model.LinkEntry","SourcePage","Entity","[VariantEntry]?","FieldEntry","[FieldEntry]","FunctionEntry","Doc","[SearchEntry]","[String]","SearchEntry"],"urlPath":"tey/docgen/json"},{"anchor":"function-tey-docgen-json-modeljson","kind":"function","line":9,"name":"modelJson","qualifiedName":"Tey.Docgen.Json.modelJson","signatures":["modelJson(model: PackageModel) -> String"],"summary":"","types":["PackageModel","String"],"urlPath":"tey/docgen/json"},{"anchor":"function-tey-docgen-json-moduleindexvalue","kind":"function","line":22,"name":"moduleIndexValue","qualifiedName":"Tey.Docgen.Json.moduleIndexValue","signatures":["moduleIndexValue(m: Tey.Docgen.Model.ModuleIndexEntry) -> Any"],"summary":"","types":["Tey.Docgen.Model.ModuleIndexEntry","Any"],"urlPath":"tey/docgen/json"},{"anchor":"function-tey-docgen-json-linkvalue","kind":"function","line":31,"name":"linkValue","qualifiedName":"Tey.Docgen.Json.linkValue","signatures":["linkValue(l: Tey.Docgen.Model.LinkEntry) -> Any"],"summary":"","types":["Tey.Docgen.Model.LinkEntry","Any"],"urlPath":"tey/docgen/json"},{"anchor":"function-tey-docgen-json-labelorpackage","kind":"function","line":35,"name":"labelOrPackage","qualifiedName":"Tey.Docgen.Json.labelOrPackage","signatures":["labelOrPackage(model: PackageModel) -> String"],"summary":"","types":["PackageModel","String"],"urlPath":"tey/docgen/json"},{"anchor":"function-tey-docgen-json-pagevalue","kind":"function","line":42,"name":"pageValue","qualifiedName":"Tey.Docgen.Json.pageValue","signatures":["pageValue(page: SourcePage) -> Any"],"summary":"","types":["SourcePage","Any"],"urlPath":"tey/docgen/json"},{"anchor":"function-tey-docgen-json-entityvalue","kind":"function","line":51,"name":"entityValue","qualifiedName":"Tey.Docgen.Json.entityValue","signatures":["entityValue(e: Entity) -> Any"],"summary":"","types":["Entity","Any"],"urlPath":"tey/docgen/json"},{"anchor":"function-tey-docgen-json-variantsvalue","kind":"function","line":116,"name":"variantsValue","qualifiedName":"Tey.Docgen.Json.variantsValue","signatures":["variantsValue(variants: [VariantEntry]?) -> Any"],"summary":"","types":["[VariantEntry]?","Any"],"urlPath":"tey/docgen/json"},{"anchor":"function-tey-docgen-json-fieldvalue","kind":"function","line":120,"name":"fieldValue","qualifiedName":"Tey.Docgen.Json.fieldValue","signatures":["fieldValue(f: FieldEntry) -> Any"],"summary":"","types":["FieldEntry","Any"],"urlPath":"tey/docgen/json"},{"anchor":"function-tey-docgen-json-fieldvalues","kind":"function","line":126,"name":"fieldValues","qualifiedName":"Tey.Docgen.Json.fieldValues","signatures":["fieldValues(fields: [FieldEntry]) -> Any"],"summary":"A named helper so the lambda's element type comes from the [FieldEntry] parameter, not from the surrounding map literal's value type.","types":["[FieldEntry]","Any"],"urlPath":"tey/docgen/json"},{"anchor":"function-tey-docgen-json-functionvalue","kind":"function","line":130,"name":"functionValue","qualifiedName":"Tey.Docgen.Json.functionValue","signatures":["functionValue(f: FunctionEntry) -> Any"],"summary":"","types":["FunctionEntry","Any"],"urlPath":"tey/docgen/json"},{"anchor":"function-tey-docgen-json-docvalue","kind":"function","line":142,"name":"docValue","qualifiedName":"Tey.Docgen.Json.docValue","signatures":["docValue(doc: Doc) -> Any"],"summary":"","types":["Doc","Any"],"urlPath":"tey/docgen/json"},{"anchor":"function-tey-docgen-json-returnsvalue","kind":"function","line":152,"name":"returnsValue","qualifiedName":"Tey.Docgen.Json.returnsValue","signatures":["returnsValue(doc: Doc) -> Any"],"summary":"","types":["Doc","Any"],"urlPath":"tey/docgen/json"},{"anchor":"function-tey-docgen-json-searchjson","kind":"function","line":165,"name":"searchJson","qualifiedName":"Tey.Docgen.Json.searchJson","signatures":["searchJson(model: PackageModel) -> String"],"summary":"","types":["PackageModel","String"],"urlPath":"tey/docgen/json"},{"anchor":"function-tey-docgen-json-searchentries","kind":"function","line":174,"name":"searchEntries","qualifiedName":"Tey.Docgen.Json.searchEntries","signatures":["searchEntries(model: PackageModel) -> [SearchEntry]"],"summary":"","types":["PackageModel","[SearchEntry]"],"urlPath":"tey/docgen/json"},{"anchor":"function-tey-docgen-json-pagesearchentries","kind":"function","line":179,"name":"pageSearchEntries","qualifiedName":"Tey.Docgen.Json.pageSearchEntries","signatures":["pageSearchEntries(page: SourcePage) -> [SearchEntry]"],"summary":"","types":["SourcePage","[SearchEntry]"],"urlPath":"tey/docgen/json"},{"anchor":"function-tey-docgen-json-entitysearchentries","kind":"function","line":184,"name":"entitySearchEntries","qualifiedName":"Tey.Docgen.Json.entitySearchEntries","signatures":["entitySearchEntries(e: Entity, page: SourcePage) -> [SearchEntry]"],"summary":"","types":["Entity","SourcePage","[SearchEntry]"],"urlPath":"tey/docgen/json"},{"anchor":"function-tey-docgen-json-entitytypes","kind":"function","line":203,"name":"entityTypes","qualifiedName":"Tey.Docgen.Json.entityTypes","signatures":["entityTypes(e: Entity) -> [String]"],"summary":"The type names an entity is \"about\" — the search-by-type dimension. For a function that is its signature's types; for a record its field types; for a type its parents and variant fields; for a trait/make the types its methods mention; for a module the union of its children.","types":["Entity","[String]"],"urlPath":"tey/docgen/json"},{"anchor":"function-tey-docgen-json-variantfieldtypes","kind":"function","line":215,"name":"variantFieldTypes","qualifiedName":"Tey.Docgen.Json.variantFieldTypes","signatures":["variantFieldTypes(variants: [VariantEntry]?) -> [String]"],"summary":"","types":["[VariantEntry]?","[String]"],"urlPath":"tey/docgen/json"},{"anchor":"function-tey-docgen-json-childsearchentries","kind":"function","line":222,"name":"childSearchEntries","qualifiedName":"Tey.Docgen.Json.childSearchEntries","signatures":["childSearchEntries(e: Entity, page: SourcePage) -> [SearchEntry]"],"summary":"","types":["Entity","SourcePage","[SearchEntry]"],"urlPath":"tey/docgen/json"},{"anchor":"function-tey-docgen-json-functionsearchentry","kind":"function","line":235,"name":"functionSearchEntry","qualifiedName":"Tey.Docgen.Json.functionSearchEntry","signatures":["functionSearchEntry(f: FunctionEntry, page: SourcePage) -> SearchEntry"],"summary":"","types":["FunctionEntry","SourcePage","SearchEntry"],"urlPath":"tey/docgen/json"},{"anchor":"function-tey-docgen-json-searchvalue","kind":"function","line":249,"name":"searchValue","qualifiedName":"Tey.Docgen.Json.searchValue","signatures":["searchValue(entry: SearchEntry) -> Any"],"summary":"","types":["SearchEntry","Any"],"urlPath":"tey/docgen/json"},{"anchor":"function-tey-docgen-json-entitysignatures","kind":"function","line":263,"name":"entitySignatures","qualifiedName":"Tey.Docgen.Json.entitySignatures","signatures":["entitySignatures(e: Entity) -> [String]"],"summary":"","types":["Entity","[String]"],"urlPath":"tey/docgen/json"},{"anchor":"function-tey-docgen-json-entitysummary","kind":"function","line":273,"name":"entitySummary","qualifiedName":"Tey.Docgen.Json.entitySummary","signatures":["entitySummary(e: Entity) -> String"],"summary":"","types":["Entity","String"],"urlPath":"tey/docgen/json"},{"anchor":"module-tey-docgen-markdown","kind":"module","line":4,"name":"Tey.Docgen.Markdown","qualifiedName":"Tey.Docgen.Markdown","signatures":["pageMarkdown(page: SourcePage, model: PackageModel) -> String","pageFrontmatter(page: SourcePage, model: PackageModel) -> String","entityFrontmatterLine(e: Entity) -> String","pageBody(page: SourcePage, model: PackageModel) -> String","entitySection(e: Entity, page: SourcePage, model: PackageModel) -> String","linkMd(model: PackageModel, fromPath: String, name: String) -> String","linkTypeMd(model: PackageModel, fromPath: String, text: String) -> String","typeSection(e: TypeEntry, page: SourcePage, model: PackageModel) -> String","variantBullet(name: String, fields: [String]) -> String","recordSection(e: RecordEntry, page: SourcePage, model: PackageModel) -> String","traitSection(e: TraitEntry) -> String","makeSection(e: MakeEntry, page: SourcePage, model: PackageModel) -> String","moduleSection(e: ModuleEntry, page: SourcePage, model: PackageModel) -> String","functionSection(e: FunctionEntry) -> String","signatureBlock(f: FunctionEntry) -> String","constantSection(e: ConstantEntry) -> String","renderFunctions(functions: [FunctionEntry]) -> String","functionBlock(f: FunctionEntry) -> String","signatureParts(parts: [String], f: FunctionEntry) -> [String]","returnParts(parts: [String], doc: Doc) -> [String]","returnLine(r: Return) -> String","exampleParts(parts: [String], doc: Doc) -> [String]","exampleBlocks(examples: [Example]) -> [String]","exampleBlock(ex: Example) -> [String]","docBlock(doc: Doc) -> String","typeParamSuffix(typeParams: [String]) -> String"],"summary":"","types":["SourcePage","PackageModel","String","Entity","TypeEntry","[String]","RecordEntry","TraitEntry","MakeEntry","ModuleEntry","FunctionEntry","ConstantEntry","[FunctionEntry]","Doc","Return","[Example]","Example"],"urlPath":"tey/docgen/markdown"},{"anchor":"function-tey-docgen-markdown-pagemarkdown","kind":"function","line":7,"name":"pageMarkdown","qualifiedName":"Tey.Docgen.Markdown.pageMarkdown","signatures":["pageMarkdown(page: SourcePage, model: PackageModel) -> String"],"summary":"","types":["SourcePage","PackageModel","String"],"urlPath":"tey/docgen/markdown"},{"anchor":"function-tey-docgen-markdown-pagefrontmatter","kind":"function","line":13,"name":"pageFrontmatter","qualifiedName":"Tey.Docgen.Markdown.pageFrontmatter","signatures":["pageFrontmatter(page: SourcePage, model: PackageModel) -> String"],"summary":"","types":["SourcePage","PackageModel","String"],"urlPath":"tey/docgen/markdown"},{"anchor":"function-tey-docgen-markdown-entityfrontmatterline","kind":"function","line":27,"name":"entityFrontmatterLine","qualifiedName":"Tey.Docgen.Markdown.entityFrontmatterLine","signatures":["entityFrontmatterLine(e: Entity) -> String"],"summary":"","types":["Entity","String"],"urlPath":"tey/docgen/markdown"},{"anchor":"function-tey-docgen-markdown-pagebody","kind":"function","line":32,"name":"pageBody","qualifiedName":"Tey.Docgen.Markdown.pageBody","signatures":["pageBody(page: SourcePage, model: PackageModel) -> String"],"summary":"","types":["SourcePage","PackageModel","String"],"urlPath":"tey/docgen/markdown"},{"anchor":"function-tey-docgen-markdown-entitysection","kind":"function","line":37,"name":"entitySection","qualifiedName":"Tey.Docgen.Markdown.entitySection","signatures":["entitySection(e: Entity, page: SourcePage, model: PackageModel) -> String"],"summary":"","types":["Entity","SourcePage","PackageModel","String"],"urlPath":"tey/docgen/markdown"},{"anchor":"function-tey-docgen-markdown-linkmd","kind":"function","line":52,"name":"linkMd","qualifiedName":"Tey.Docgen.Markdown.linkMd","signatures":["linkMd(model: PackageModel, fromPath: String, name: String) -> String"],"summary":"Cross-links in Markdown resolve against the same package index the HTML renderer uses — one resolution rule, two renderings. Targets are the .md siblings of this page.","types":["PackageModel","String"],"urlPath":"tey/docgen/markdown"},{"anchor":"function-tey-docgen-markdown-linktypemd","kind":"function","line":65,"name":"linkTypeMd","qualifiedName":"Tey.Docgen.Markdown.linkTypeMd","signatures":["linkTypeMd(model: PackageModel, fromPath: String, text: String) -> String"],"summary":"","types":["PackageModel","String"],"urlPath":"tey/docgen/markdown"},{"anchor":"function-tey-docgen-markdown-typesection","kind":"function","line":75,"name":"typeSection","qualifiedName":"Tey.Docgen.Markdown.typeSection","signatures":["typeSection(e: TypeEntry, page: SourcePage, model: PackageModel) -> String"],"summary":"","types":["TypeEntry","SourcePage","PackageModel","String"],"urlPath":"tey/docgen/markdown"},{"anchor":"function-tey-docgen-markdown-variantbullet","kind":"function","line":92,"name":"variantBullet","qualifiedName":"Tey.Docgen.Markdown.variantBullet","signatures":["variantBullet(name: String, fields: [String]) -> String"],"summary":"","types":["String","[String]"],"urlPath":"tey/docgen/markdown"},{"anchor":"function-tey-docgen-markdown-recordsection","kind":"function","line":102,"name":"recordSection","qualifiedName":"Tey.Docgen.Markdown.recordSection","signatures":["recordSection(e: RecordEntry, page: SourcePage, model: PackageModel) -> String"],"summary":"","types":["RecordEntry","SourcePage","PackageModel","String"],"urlPath":"tey/docgen/markdown"},{"anchor":"function-tey-docgen-markdown-traitsection","kind":"function","line":112,"name":"traitSection","qualifiedName":"Tey.Docgen.Markdown.traitSection","signatures":["traitSection(e: TraitEntry) -> String"],"summary":"","types":["TraitEntry","String"],"urlPath":"tey/docgen/markdown"},{"anchor":"function-tey-docgen-markdown-makesection","kind":"function","line":118,"name":"makeSection","qualifiedName":"Tey.Docgen.Markdown.makeSection","signatures":["makeSection(e: MakeEntry, page: SourcePage, model: PackageModel) -> String"],"summary":"","types":["MakeEntry","SourcePage","PackageModel","String"],"urlPath":"tey/docgen/markdown"},{"anchor":"function-tey-docgen-markdown-modulesection","kind":"function","line":128,"name":"moduleSection","qualifiedName":"Tey.Docgen.Markdown.moduleSection","signatures":["moduleSection(e: ModuleEntry, page: SourcePage, model: PackageModel) -> String"],"summary":"","types":["ModuleEntry","SourcePage","PackageModel","String"],"urlPath":"tey/docgen/markdown"},{"anchor":"function-tey-docgen-markdown-functionsection","kind":"function","line":133,"name":"functionSection","qualifiedName":"Tey.Docgen.Markdown.functionSection","signatures":["functionSection(e: FunctionEntry) -> String"],"summary":"","types":["FunctionEntry","String"],"urlPath":"tey/docgen/markdown"},{"anchor":"function-tey-docgen-markdown-signatureblock","kind":"function","line":137,"name":"signatureBlock","qualifiedName":"Tey.Docgen.Markdown.signatureBlock","signatures":["signatureBlock(f: FunctionEntry) -> String"],"summary":"","types":["FunctionEntry","String"],"urlPath":"tey/docgen/markdown"},{"anchor":"function-tey-docgen-markdown-constantsection","kind":"function","line":144,"name":"constantSection","qualifiedName":"Tey.Docgen.Markdown.constantSection","signatures":["constantSection(e: ConstantEntry) -> String"],"summary":"","types":["ConstantEntry","String"],"urlPath":"tey/docgen/markdown"},{"anchor":"function-tey-docgen-markdown-renderfunctions","kind":"function","line":148,"name":"renderFunctions","qualifiedName":"Tey.Docgen.Markdown.renderFunctions","signatures":["renderFunctions(functions: [FunctionEntry]) -> String"],"summary":"","types":["[FunctionEntry]","String"],"urlPath":"tey/docgen/markdown"},{"anchor":"function-tey-docgen-markdown-functionblock","kind":"function","line":156,"name":"functionBlock","qualifiedName":"Tey.Docgen.Markdown.functionBlock","signatures":["functionBlock(f: FunctionEntry) -> String"],"summary":"","types":["FunctionEntry","String"],"urlPath":"tey/docgen/markdown"},{"anchor":"function-tey-docgen-markdown-signatureparts","kind":"function","line":169,"name":"signatureParts","qualifiedName":"Tey.Docgen.Markdown.signatureParts","signatures":["signatureParts(parts: [String], f: FunctionEntry) -> [String]"],"summary":"","types":["[String]","FunctionEntry"],"urlPath":"tey/docgen/markdown"},{"anchor":"function-tey-docgen-markdown-returnparts","kind":"function","line":176,"name":"returnParts","qualifiedName":"Tey.Docgen.Markdown.returnParts","signatures":["returnParts(parts: [String], doc: Doc) -> [String]"],"summary":"","types":["[String]","Doc"],"urlPath":"tey/docgen/markdown"},{"anchor":"function-tey-docgen-markdown-returnline","kind":"function","line":189,"name":"returnLine","qualifiedName":"Tey.Docgen.Markdown.returnLine","signatures":["returnLine(r: Return) -> String"],"summary":"","types":["Return","String"],"urlPath":"tey/docgen/markdown"},{"anchor":"function-tey-docgen-markdown-exampleparts","kind":"function","line":199,"name":"exampleParts","qualifiedName":"Tey.Docgen.Markdown.exampleParts","signatures":["exampleParts(parts: [String], doc: Doc) -> [String]"],"summary":"","types":["[String]","Doc"],"urlPath":"tey/docgen/markdown"},{"anchor":"function-tey-docgen-markdown-exampleblocks","kind":"function","line":206,"name":"exampleBlocks","qualifiedName":"Tey.Docgen.Markdown.exampleBlocks","signatures":["exampleBlocks(examples: [Example]) -> [String]"],"summary":"","types":["[Example]","[String]"],"urlPath":"tey/docgen/markdown"},{"anchor":"function-tey-docgen-markdown-exampleblock","kind":"function","line":210,"name":"exampleBlock","qualifiedName":"Tey.Docgen.Markdown.exampleBlock","signatures":["exampleBlock(ex: Example) -> [String]"],"summary":"","types":["Example","[String]"],"urlPath":"tey/docgen/markdown"},{"anchor":"function-tey-docgen-markdown-docblock","kind":"function","line":219,"name":"docBlock","qualifiedName":"Tey.Docgen.Markdown.docBlock","signatures":["docBlock(doc: Doc) -> String"],"summary":"","types":["Doc","String"],"urlPath":"tey/docgen/markdown"},{"anchor":"function-tey-docgen-markdown-typeparamsuffix","kind":"function","line":226,"name":"typeParamSuffix","qualifiedName":"Tey.Docgen.Markdown.typeParamSuffix","signatures":["typeParamSuffix(typeParams: [String]) -> String"],"summary":"","types":["[String]","String"],"urlPath":"tey/docgen/markdown"},{"anchor":"module-tey-docgen-md","kind":"module","line":18,"name":"Tey.Docgen.Md","qualifiedName":"Tey.Docgen.Md","signatures":["parseDocument(text: String) -> Document","toHtml(text: String) -> String","splitFrontmatter(lines: [String]) -> (Frontmatter, [String])","closingFence(lines: [String], index: Integer) -> Integer?","frontmatterOf(lines: [String], accum: Frontmatter) -> Frontmatter","assign(front: Frontmatter, key: String, value: String) -> Frontmatter","unquote(value: String) -> String","trimEnds(value: String) -> String","quoted?(value: String, mark: String) -> Bool","parseBlocks(lines: [String]) -> [MdBlock]","blockLoop(lines: [String], accum: [MdBlock]) -> [MdBlock]","fence?(line: String) -> Bool","rule?(line: String) -> Bool","ruleOf?(text: String, mark: String) -> Bool","headingLevel(line: String) -> Integer","countHashes(text: String, seen: Integer) -> Integer","takeCode(lines: [String]) -> (MdBlock, [String])","closingCodeFence(lines: [String], index: Integer) -> Integer","takeQuote(lines: [String]) -> (MdBlock, [String])","quoteLine?(line: String) -> Bool","stripQuote(line: String) -> String","takeList(lines: [String]) -> (MdBlock, [String])","listLine?(line: String) -> Bool","listItems(lines: [String], indent: Integer, current: [String], accum: [ListItem]) -> [ListItem]","flushItem(current: [String], accum: [ListItem]) -> [ListItem]","dropTrailingBlanks(lines: [String]) -> [String]","dedent(lines: [String]) -> [String]","indentOf(line: String) -> Integer","itemMarker(line: String) -> String","bulletMarker(line: String) -> String","numberMarker(line: String) -> String","tableStart?(lines: [String]) -> Bool","delimiterRow?(line: String) -> Bool","delimiterChar?(c: String) -> Bool","takeTable(lines: [String]) -> (MdBlock, [String])","cellsOf(line: String) -> [String]","takeParagraph(lines: [String]) -> (MdBlock, [String])","paragraphLine?(line: String) -> Bool","render(items: [MdBlock]) -> String","renderBlock(block: MdBlock) -> String","renderCode(language: String, body: String) -> String","renderItems(items: [ListItem]) -> String","renderItem(item: ListItem) -> String","renderTable(header: [String], rows: [[String]]) -> String","renderRow(row: [String]) -> String","anchor(text: String) -> String","trimDashes(text: String) -> String","anchorChar(c: Char) -> String","squeezeDashes(text: String, accum: String) -> String","stripInline(text: String) -> String","inline(text: String) -> String","inlineLoop(text: String, accum: String) -> String","emphasis(text: String) -> String","links(text: String, accum: String) -> String","linkParts(rest: String) -> (String, String, String)?","marks(text: String) -> String","wrap(text: String, strongMark: String, strongTag: String, emMark: String, emTag: String) -> String","pairs(text: String, mark: String, tag: String, accum: String) -> String","indexOfText(haystack: String, needle: String, at: Integer) -> Integer?","esc(s: String) -> String"],"summary":"","types":["String","Integer","[MdBlock]","[ListItem]","[String]","[[String]]","Frontmatter","Document","(Frontmatter, [String])","Integer?","Bool","(MdBlock, [String])","MdBlock","ListItem","Char","(String, String, String)?"],"urlPath":"tey/docgen/md"},{"anchor":"record-tey-docgen-md-frontmatter","kind":"record","line":23,"name":"Frontmatter","qualifiedName":"Tey.Docgen.Md.Frontmatter","signatures":[],"summary":"A document's frontmatter: the keys the prose pipeline reads. Unknown keys are parsed and ignored rather than rejected, so a page can carry metadata a later renderer will use.","types":["String","Integer"],"urlPath":"tey/docgen/md"},{"anchor":"record-tey-docgen-md-listitem","kind":"record","line":30,"name":"ListItem","qualifiedName":"Tey.Docgen.Md.ListItem","signatures":[],"summary":"One item of a list: its own inline text, plus any blocks nested under it.","types":["String","[MdBlock]"],"urlPath":"tey/docgen/md"},{"anchor":"type-tey-docgen-md-mdblock","kind":"type","line":35,"name":"MdBlock","qualifiedName":"Tey.Docgen.Md.MdBlock","signatures":[],"summary":"","types":["Integer","String","String","String","String","[MdBlock]","[ListItem]","[ListItem]","[String]","[[String]]"],"urlPath":"tey/docgen/md"},{"anchor":"record-tey-docgen-md-document","kind":"record","line":45,"name":"Document","qualifiedName":"Tey.Docgen.Md.Document","signatures":[],"summary":"","types":["Frontmatter","[MdBlock]"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-parsedocument","kind":"function","line":51,"name":"parseDocument","qualifiedName":"Tey.Docgen.Md.parseDocument","signatures":["parseDocument(text: String) -> Document"],"summary":"The whole job: text in, document out.","types":["String","Document"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-tohtml","kind":"function","line":58,"name":"toHtml","qualifiedName":"Tey.Docgen.Md.toHtml","signatures":["toHtml(text: String) -> String"],"summary":"Text in, HTML out — `parse` then `render`, which is all a caller wanting a page body needs.","types":["String"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-splitfrontmatter","kind":"function","line":66,"name":"splitFrontmatter","qualifiedName":"Tey.Docgen.Md.splitFrontmatter","signatures":["splitFrontmatter(lines: [String]) -> (Frontmatter, [String])"],"summary":"--- frontmatter -------------------------------------------------------\n\nA leading `---` fence delimits frontmatter. Without one the document is all body, and every field takes its default.","types":["[String]","(Frontmatter, [String])"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-closingfence","kind":"function","line":80,"name":"closingFence","qualifiedName":"Tey.Docgen.Md.closingFence","signatures":["closingFence(lines: [String], index: Integer) -> Integer?"],"summary":"","types":["[String]","Integer","Integer?"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-frontmatterof","kind":"function","line":86,"name":"frontmatterOf","qualifiedName":"Tey.Docgen.Md.frontmatterOf","signatures":["frontmatterOf(lines: [String], accum: Frontmatter) -> Frontmatter"],"summary":"","types":["[String]","Frontmatter"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-assign","kind":"function","line":102,"name":"assign","qualifiedName":"Tey.Docgen.Md.assign","signatures":["assign(front: Frontmatter, key: String, value: String) -> Frontmatter"],"summary":"","types":["Frontmatter","String"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-unquote","kind":"function","line":109,"name":"unquote","qualifiedName":"Tey.Docgen.Md.unquote","signatures":["unquote(value: String) -> String"],"summary":"","types":["String"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-trimends","kind":"function","line":116,"name":"trimEnds","qualifiedName":"Tey.Docgen.Md.trimEnds","signatures":["trimEnds(value: String) -> String"],"summary":"Drops the first and last character — the quotes `quoted?` just matched.","types":["String"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-quoted?","kind":"function","line":120,"name":"quoted?","qualifiedName":"Tey.Docgen.Md.quoted?","signatures":["quoted?(value: String, mark: String) -> Bool"],"summary":"","types":["String","Bool"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-parseblocks","kind":"function","line":126,"name":"parseBlocks","qualifiedName":"Tey.Docgen.Md.parseBlocks","signatures":["parseBlocks(lines: [String]) -> [MdBlock]"],"summary":"--- block structure ---------------------------------------------------","types":["[String]","[MdBlock]"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-blockloop","kind":"function","line":132,"name":"blockLoop","qualifiedName":"Tey.Docgen.Md.blockLoop","signatures":["blockLoop(lines: [String], accum: [MdBlock]) -> [MdBlock]"],"summary":"One pass over the lines, each branch consuming the whole construct it recognises and returning the lines it did not take.","types":["[String]","[MdBlock]"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-fence?","kind":"function","line":167,"name":"fence?","qualifiedName":"Tey.Docgen.Md.fence?","signatures":["fence?(line: String) -> Bool"],"summary":"","types":["String","Bool"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-rule?","kind":"function","line":173,"name":"rule?","qualifiedName":"Tey.Docgen.Md.rule?","signatures":["rule?(line: String) -> Bool"],"summary":"`---`, `***` or `___`, three or more, nothing else on the line. Checked after frontmatter is gone, so a stray `---` here really is a break.","types":["String","Bool"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-ruleof?","kind":"function","line":179,"name":"ruleOf?","qualifiedName":"Tey.Docgen.Md.ruleOf?","signatures":["ruleOf?(text: String, mark: String) -> Bool"],"summary":"","types":["String","Bool"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-headinglevel","kind":"function","line":184,"name":"headingLevel","qualifiedName":"Tey.Docgen.Md.headingLevel","signatures":["headingLevel(line: String) -> Integer"],"summary":"`##` → 2. Zero when the line is not a heading; `#hashtag` is not one.","types":["String","Integer"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-counthashes","kind":"function","line":192,"name":"countHashes","qualifiedName":"Tey.Docgen.Md.countHashes","signatures":["countHashes(text: String, seen: Integer) -> Integer"],"summary":"","types":["String","Integer"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-takecode","kind":"function","line":201,"name":"takeCode","qualifiedName":"Tey.Docgen.Md.takeCode","signatures":["takeCode(lines: [String]) -> (MdBlock, [String])"],"summary":"--- fenced code -------------------------------------------------------\n\nThe info string is the language. An unterminated fence runs to the end of the document rather than failing — a truncated page still renders.","types":["[String]","(MdBlock, [String])"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-closingcodefence","kind":"function","line":209,"name":"closingCodeFence","qualifiedName":"Tey.Docgen.Md.closingCodeFence","signatures":["closingCodeFence(lines: [String], index: Integer) -> Integer"],"summary":"","types":["[String]","Integer"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-takequote","kind":"function","line":219,"name":"takeQuote","qualifiedName":"Tey.Docgen.Md.takeQuote","signatures":["takeQuote(lines: [String]) -> (MdBlock, [String])"],"summary":"--- blockquotes -------------------------------------------------------\n\n`>` is stripped from each line and what remains is parsed as blocks, so a quote can hold anything a document can, nesting included.","types":["[String]","(MdBlock, [String])"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-quoteline?","kind":"function","line":225,"name":"quoteLine?","qualifiedName":"Tey.Docgen.Md.quoteLine?","signatures":["quoteLine?(line: String) -> Bool"],"summary":"","types":["String","Bool"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-stripquote","kind":"function","line":230,"name":"stripQuote","qualifiedName":"Tey.Docgen.Md.stripQuote","signatures":["stripQuote(line: String) -> String"],"summary":"","types":["String"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-takelist","kind":"function","line":241,"name":"takeList","qualifiedName":"Tey.Docgen.Md.takeList","signatures":["takeList(lines: [String]) -> (MdBlock, [String])"],"summary":"--- lists -------------------------------------------------------------\n\nNesting is by indentation: a line indented past the first item's marker belongs to that item and is parsed as blocks in its own right, so a list can hold paragraphs, code and deeper lists.","types":["[String]","(MdBlock, [String])"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-listline?","kind":"function","line":251,"name":"listLine?","qualifiedName":"Tey.Docgen.Md.listLine?","signatures":["listLine?(line: String) -> Bool"],"summary":"A list continues through its own items, indented continuation lines, and blank lines — but a blank line followed by unindented text ends it, which is why the run is cut at the first line that is neither.","types":["String","Bool"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-listitems","kind":"function","line":257,"name":"listItems","qualifiedName":"Tey.Docgen.Md.listItems","signatures":["listItems(lines: [String], indent: Integer, current: [String], accum: [ListItem]) -> [ListItem]"],"summary":"","types":["[String]","Integer","[ListItem]"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-flushitem","kind":"function","line":274,"name":"flushItem","qualifiedName":"Tey.Docgen.Md.flushItem","signatures":["flushItem(current: [String], accum: [ListItem]) -> [ListItem]"],"summary":"The first line is the item's own text; anything below it is nested content, dedented so it parses as a document of its own.","types":["[String]","[ListItem]"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-droptrailingblanks","kind":"function","line":284,"name":"dropTrailingBlanks","qualifiedName":"Tey.Docgen.Md.dropTrailingBlanks","signatures":["dropTrailingBlanks(lines: [String]) -> [String]"],"summary":"","types":["[String]"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-dedent","kind":"function","line":291,"name":"dedent","qualifiedName":"Tey.Docgen.Md.dedent","signatures":["dedent(lines: [String]) -> [String]"],"summary":"Removes the common indent, so nested content is parsed at column zero.","types":["[String]"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-indentof","kind":"function","line":298,"name":"indentOf","qualifiedName":"Tey.Docgen.Md.indentOf","signatures":["indentOf(line: String) -> Integer"],"summary":"","types":["String","Integer"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-itemmarker","kind":"function","line":302,"name":"itemMarker","qualifiedName":"Tey.Docgen.Md.itemMarker","signatures":["itemMarker(line: String) -> String"],"summary":"","types":["String"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-bulletmarker","kind":"function","line":308,"name":"bulletMarker","qualifiedName":"Tey.Docgen.Md.bulletMarker","signatures":["bulletMarker(line: String) -> String"],"summary":"","types":["String"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-numbermarker","kind":"function","line":317,"name":"numberMarker","qualifiedName":"Tey.Docgen.Md.numberMarker","signatures":["numberMarker(line: String) -> String"],"summary":"\"12. \" → \"12.\" ; anything else → \"\".","types":["String"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-tablestart?","kind":"function","line":329,"name":"tableStart?","qualifiedName":"Tey.Docgen.Md.tableStart?","signatures":["tableStart?(lines: [String]) -> Bool"],"summary":"--- tables ------------------------------------------------------------\n\nA GFM table is a header row and a delimiter row of dashes; without the delimiter the lines are ordinary paragraphs.","types":["[String]","Bool"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-delimiterrow?","kind":"function","line":335,"name":"delimiterRow?","qualifiedName":"Tey.Docgen.Md.delimiterRow?","signatures":["delimiterRow?(line: String) -> Bool"],"summary":"","types":["String","Bool"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-delimiterchar?","kind":"function","line":341,"name":"delimiterChar?","qualifiedName":"Tey.Docgen.Md.delimiterChar?","signatures":["delimiterChar?(c: String) -> Bool"],"summary":"","types":["String","Bool"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-taketable","kind":"function","line":345,"name":"takeTable","qualifiedName":"Tey.Docgen.Md.takeTable","signatures":["takeTable(lines: [String]) -> (MdBlock, [String])"],"summary":"","types":["[String]","(MdBlock, [String])"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-cellsof","kind":"function","line":355,"name":"cellsOf","qualifiedName":"Tey.Docgen.Md.cellsOf","signatures":["cellsOf(line: String) -> [String]"],"summary":"Leading and trailing pipes are optional, so the split is trimmed of the empty cells they produce.","types":["String","[String]"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-takeparagraph","kind":"function","line":366,"name":"takeParagraph","qualifiedName":"Tey.Docgen.Md.takeParagraph","signatures":["takeParagraph(lines: [String]) -> (MdBlock, [String])"],"summary":"--- paragraphs --------------------------------------------------------\n\nRuns to a blank line or to the start of any other construct, so a list or fence directly under prose is not swallowed into it.","types":["[String]","(MdBlock, [String])"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-paragraphline?","kind":"function","line":372,"name":"paragraphLine?","qualifiedName":"Tey.Docgen.Md.paragraphLine?","signatures":["paragraphLine?(line: String) -> Bool"],"summary":"","types":["String","Bool"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-render","kind":"function","line":383,"name":"render","qualifiedName":"Tey.Docgen.Md.render","signatures":["render(items: [MdBlock]) -> String"],"summary":"--- rendering ---------------------------------------------------------","types":["[MdBlock]","String"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-renderblock","kind":"function","line":387,"name":"renderBlock","qualifiedName":"Tey.Docgen.Md.renderBlock","signatures":["renderBlock(block: MdBlock) -> String"],"summary":"","types":["MdBlock","String"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-rendercode","kind":"function","line":406,"name":"renderCode","qualifiedName":"Tey.Docgen.Md.renderCode","signatures":["renderCode(language: String, body: String) -> String"],"summary":"Kex code goes through the same highlighter the reference pages use, so a snippet in the guide looks like a signature in the reference. Everything else is escaped and left plain.","types":["String"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-renderitems","kind":"function","line":413,"name":"renderItems","qualifiedName":"Tey.Docgen.Md.renderItems","signatures":["renderItems(items: [ListItem]) -> String"],"summary":"","types":["[ListItem]","String"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-renderitem","kind":"function","line":417,"name":"renderItem","qualifiedName":"Tey.Docgen.Md.renderItem","signatures":["renderItem(item: ListItem) -> String"],"summary":"","types":["ListItem","String"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-rendertable","kind":"function","line":424,"name":"renderTable","qualifiedName":"Tey.Docgen.Md.renderTable","signatures":["renderTable(header: [String], rows: [[String]]) -> String"],"summary":"","types":["[String]","[[String]]","String"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-renderrow","kind":"function","line":430,"name":"renderRow","qualifiedName":"Tey.Docgen.Md.renderRow","signatures":["renderRow(row: [String]) -> String"],"summary":"","types":["[String]","String"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-anchor","kind":"function","line":436,"name":"anchor","qualifiedName":"Tey.Docgen.Md.anchor","signatures":["anchor(text: String) -> String"],"summary":"A heading's id: lowercase, non-alphanumerics folded to single dashes.","types":["String"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-trimdashes","kind":"function","line":444,"name":"trimDashes","qualifiedName":"Tey.Docgen.Md.trimDashes","signatures":["trimDashes(text: String) -> String"],"summary":"`String.trim` takes no argument, and the folding above can leave a dash at either end (`## \\`try\\`` → `-try-`).","types":["String"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-anchorchar","kind":"function","line":451,"name":"anchorChar","qualifiedName":"Tey.Docgen.Md.anchorChar","signatures":["anchorChar(c: Char) -> String"],"summary":"","types":["Char","String"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-squeezedashes","kind":"function","line":456,"name":"squeezeDashes","qualifiedName":"Tey.Docgen.Md.squeezeDashes","signatures":["squeezeDashes(text: String, accum: String) -> String"],"summary":"","types":["String"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-stripinline","kind":"function","line":466,"name":"stripInline","qualifiedName":"Tey.Docgen.Md.stripInline","signatures":["stripInline(text: String) -> String"],"summary":"Inline markers removed, for anchors and any other plain-text use.","types":["String"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-inline","kind":"function","line":474,"name":"inline","qualifiedName":"Tey.Docgen.Md.inline","signatures":["inline(text: String) -> String"],"summary":"--- inline ------------------------------------------------------------\n\nCode spans first and separately: their content is escaped but never scanned for emphasis, so `a*b*c` inside backticks stays literal.","types":["String"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-inlineloop","kind":"function","line":478,"name":"inlineLoop","qualifiedName":"Tey.Docgen.Md.inlineLoop","signatures":["inlineLoop(text: String, accum: String) -> String"],"summary":"","types":["String"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-emphasis","kind":"function","line":498,"name":"emphasis","qualifiedName":"Tey.Docgen.Md.emphasis","signatures":["emphasis(text: String) -> String"],"summary":"Links before emphasis, so a `*` inside a URL is not read as a marker.","types":["String"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-links","kind":"function","line":502,"name":"links","qualifiedName":"Tey.Docgen.Md.links","signatures":["links(text: String, accum: String) -> String"],"summary":"","types":["String"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-linkparts","kind":"function","line":523,"name":"linkParts","qualifiedName":"Tey.Docgen.Md.linkParts","signatures":["linkParts(rest: String) -> (String, String, String)?"],"summary":"`label](href)` → (label, href, what follows). None when the shape is not a link after all, in which case the `[` is literal text.","types":["String","(String, String, String)?"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-marks","kind":"function","line":543,"name":"marks","qualifiedName":"Tey.Docgen.Md.marks","signatures":["marks(text: String) -> String"],"summary":"`**bold**` before `*italic*`, or the opening `**` would parse as an empty emphasis. Escaping happens here, on the text that is left.","types":["String"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-wrap","kind":"function","line":547,"name":"wrap","qualifiedName":"Tey.Docgen.Md.wrap","signatures":["wrap(text: String, strongMark: String, strongTag: String, emMark: String, emTag: String) -> String"],"summary":"","types":["String"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-pairs","kind":"function","line":555,"name":"pairs","qualifiedName":"Tey.Docgen.Md.pairs","signatures":["pairs(text: String, mark: String, tag: String, accum: String) -> String"],"summary":"Replaces each surviving pair of markers with a tag. An unpaired marker is left as written rather than swallowing the rest of the line.","types":["String"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-indexoftext","kind":"function","line":576,"name":"indexOfText","qualifiedName":"Tey.Docgen.Md.indexOfText","signatures":["indexOfText(haystack: String, needle: String, at: Integer) -> Integer?"],"summary":"Where `needle` first occurs in `haystack`, or None. String.indexOf takes a Char, and the markers here are two characters wide (\"**\"), so the search is spelled out.","types":["String","Integer","Integer?"],"urlPath":"tey/docgen/md"},{"anchor":"function-tey-docgen-md-esc","kind":"function","line":582,"name":"esc","qualifiedName":"Tey.Docgen.Md.esc","signatures":["esc(s: String) -> String"],"summary":"","types":["String"],"urlPath":"tey/docgen/md"},{"anchor":"module-tey-docgen-model","kind":"module","line":8,"name":"Tey.Docgen.Model","qualifiedName":"Tey.Docgen.Model","signatures":["emptyDoc : Doc","kindOf(entity: Entity) -> String","nameOf(entity: Entity) -> String","qualifiedNameOf(entity: Entity) -> String","lineOf(entity: Entity) -> Integer","anchorOf(entity: Entity) -> String","anchorNameOf(entity: Entity) -> String","slugOf(name: String) -> String"],"summary":"","types":["String","[Param]","Return?","[Example]","String?","Doc","[String]","Bool","[VariantEntry]?","Integer","[FieldEntry]","[FunctionEntry]","[Entity]","TypeEntry","RecordEntry","TraitEntry","MakeEntry","ModuleEntry","FunctionEntry","ConstantEntry","[MemberEntry]","[SourcePage]","[ModuleIndexEntry]","[LinkEntry]","Entity"],"urlPath":"tey/docgen/model"},{"anchor":"record-tey-docgen-model-param","kind":"record","line":10,"name":"Param","qualifiedName":"Tey.Docgen.Model.Param","signatures":[],"summary":"","types":["String"],"urlPath":"tey/docgen/model"},{"anchor":"record-tey-docgen-model-return","kind":"record","line":16,"name":"Return","qualifiedName":"Tey.Docgen.Model.Return","signatures":[],"summary":"","types":["String"],"urlPath":"tey/docgen/model"},{"anchor":"record-tey-docgen-model-example","kind":"record","line":21,"name":"Example","qualifiedName":"Tey.Docgen.Model.Example","signatures":[],"summary":"","types":["String"],"urlPath":"tey/docgen/model"},{"anchor":"record-tey-docgen-model-doc","kind":"record","line":26,"name":"Doc","qualifiedName":"Tey.Docgen.Model.Doc","signatures":[],"summary":"","types":["String","[Param]","Return?","[Example]","String?"],"urlPath":"tey/docgen/model"},{"anchor":"function-tey-docgen-model-emptydoc","kind":"function","line":34,"name":"emptyDoc","qualifiedName":"Tey.Docgen.Model.emptyDoc","signatures":["emptyDoc : Doc"],"summary":"","types":["Doc"],"urlPath":"tey/docgen/model"},{"anchor":"record-tey-docgen-model-variantentry","kind":"record","line":38,"name":"VariantEntry","qualifiedName":"Tey.Docgen.Model.VariantEntry","signatures":[],"summary":"","types":["String","[String]"],"urlPath":"tey/docgen/model"},{"anchor":"record-tey-docgen-model-fieldentry","kind":"record","line":43,"name":"FieldEntry","qualifiedName":"Tey.Docgen.Model.FieldEntry","signatures":[],"summary":"","types":["String","Bool"],"urlPath":"tey/docgen/model"},{"anchor":"record-tey-docgen-model-typeentry","kind":"record","line":49,"name":"TypeEntry","qualifiedName":"Tey.Docgen.Model.TypeEntry","signatures":[],"summary":"","types":["String","[String]","[VariantEntry]?","Doc","Integer"],"urlPath":"tey/docgen/model"},{"anchor":"record-tey-docgen-model-recordentry","kind":"record","line":59,"name":"RecordEntry","qualifiedName":"Tey.Docgen.Model.RecordEntry","signatures":[],"summary":"","types":["String","[String]","[FieldEntry]","Doc","Integer"],"urlPath":"tey/docgen/model"},{"anchor":"record-tey-docgen-model-traitentry","kind":"record","line":68,"name":"TraitEntry","qualifiedName":"Tey.Docgen.Model.TraitEntry","signatures":[],"summary":"","types":["String","[String]","[FunctionEntry]","Doc","Integer"],"urlPath":"tey/docgen/model"},{"anchor":"record-tey-docgen-model-makeentry","kind":"record","line":77,"name":"MakeEntry","qualifiedName":"Tey.Docgen.Model.MakeEntry","signatures":[],"summary":"","types":["String","Bool","[String]","[FunctionEntry]","Doc","Integer"],"urlPath":"tey/docgen/model"},{"anchor":"record-tey-docgen-model-moduleentry","kind":"record","line":86,"name":"ModuleEntry","qualifiedName":"Tey.Docgen.Model.ModuleEntry","signatures":[],"summary":"","types":["String","[Entity]","Doc","Integer"],"urlPath":"tey/docgen/model"},{"anchor":"record-tey-docgen-model-functionentry","kind":"record","line":94,"name":"FunctionEntry","qualifiedName":"Tey.Docgen.Model.FunctionEntry","signatures":[],"summary":"","types":["String","[String]","Integer","Doc"],"urlPath":"tey/docgen/model"},{"anchor":"record-tey-docgen-model-constantentry","kind":"record","line":104,"name":"ConstantEntry","qualifiedName":"Tey.Docgen.Model.ConstantEntry","signatures":[],"summary":"","types":["String","Doc","Integer"],"urlPath":"tey/docgen/model"},{"anchor":"type-tey-docgen-model-entity","kind":"type","line":112,"name":"Entity","qualifiedName":"Tey.Docgen.Model.Entity","signatures":[],"summary":"","types":["TypeEntry","RecordEntry","TraitEntry","MakeEntry","ModuleEntry","FunctionEntry","ConstantEntry"],"urlPath":"tey/docgen/model"},{"anchor":"record-tey-docgen-model-sourcepage","kind":"record","line":121,"name":"SourcePage","qualifiedName":"Tey.Docgen.Model.SourcePage","signatures":[],"summary":"","types":["String","[Entity]"],"urlPath":"tey/docgen/model"},{"anchor":"record-tey-docgen-model-moduleindexentry","kind":"record","line":132,"name":"ModuleIndexEntry","qualifiedName":"Tey.Docgen.Model.ModuleIndexEntry","signatures":[],"summary":"The navigation unit: one per module in the package, pointing at the page its entities live on. The sidebar and the module index of model.json are built from these — a FILE is where source lives, a MODULE is what a reader navigates by, and the two only coincide by accident.","types":["String","[MemberEntry]"],"urlPath":"tey/docgen/model"},{"anchor":"record-tey-docgen-model-memberentry","kind":"record","line":141,"name":"MemberEntry","qualifiedName":"Tey.Docgen.Model.MemberEntry","signatures":[],"summary":"One documented member of a module, with the anchor its section renders at — the sidebar's expanded list and the JSON index both use these.","types":["String"],"urlPath":"tey/docgen/model"},{"anchor":"record-tey-docgen-model-linkentry","kind":"record","line":150,"name":"LinkEntry","qualifiedName":"Tey.Docgen.Model.LinkEntry","signatures":[],"summary":"One row of the cross-link index: a name a type reference elsewhere in the package may mention (\"String\", \"FS.Path\") and where it lands. The index is what makes interlinked docs possible without per-renderer guesswork: every renderer resolves names against the same list.","types":["String"],"urlPath":"tey/docgen/model"},{"anchor":"record-tey-docgen-model-packagemodel","kind":"record","line":157,"name":"PackageModel","qualifiedName":"Tey.Docgen.Model.PackageModel","signatures":[],"summary":"","types":["String","[SourcePage]","[ModuleIndexEntry]","[LinkEntry]","[String]"],"urlPath":"tey/docgen/model"},{"anchor":"record-tey-docgen-model-searchentry","kind":"record","line":182,"name":"SearchEntry","qualifiedName":"Tey.Docgen.Model.SearchEntry","signatures":[],"summary":"A flattened search row: one per entity (and per function inside traits, makes and modules), joining name/kind/signature to the page URL. The `types` are the type names the entity is about — the types its signature mentions — so search can answer by name AND by type; `anchor` is the section id a result deep-links to.","types":["String","[String]","Integer"],"urlPath":"tey/docgen/model"},{"anchor":"record-tey-docgen-model-versionentry","kind":"record","line":197,"name":"VersionEntry","qualifiedName":"Tey.Docgen.Model.VersionEntry","signatures":[],"summary":"One row of versions.json. The file accumulates across builds — the output directory IS the site, so each build upserts its (package, id) entry into whatever is already published there.","types":["String"],"urlPath":"tey/docgen/model"},{"anchor":"function-tey-docgen-model-kindof","kind":"function","line":205,"name":"kindOf","qualifiedName":"Tey.Docgen.Model.kindOf","signatures":["kindOf(entity: Entity) -> String"],"summary":"The kind label used in indexes and JSON for each entity variant.","types":["Entity","String"],"urlPath":"tey/docgen/model"},{"anchor":"function-tey-docgen-model-nameof","kind":"function","line":218,"name":"nameOf","qualifiedName":"Tey.Docgen.Model.nameOf","signatures":["nameOf(entity: Entity) -> String"],"summary":"The primary display name of an entity (a make's is its target type).","types":["Entity","String"],"urlPath":"tey/docgen/model"},{"anchor":"function-tey-docgen-model-qualifiednameof","kind":"function","line":230,"name":"qualifiedNameOf","qualifiedName":"Tey.Docgen.Model.qualifiedNameOf","signatures":["qualifiedNameOf(entity: Entity) -> String"],"summary":"","types":["Entity","String"],"urlPath":"tey/docgen/model"},{"anchor":"function-tey-docgen-model-lineof","kind":"function","line":242,"name":"lineOf","qualifiedName":"Tey.Docgen.Model.lineOf","signatures":["lineOf(entity: Entity) -> Integer"],"summary":"","types":["Entity","Integer"],"urlPath":"tey/docgen/model"},{"anchor":"function-tey-docgen-model-anchorof","kind":"function","line":257,"name":"anchorOf","qualifiedName":"Tey.Docgen.Model.anchorOf","signatures":["anchorOf(entity: Entity) -> String"],"summary":"The anchor id an entity's HTML section renders at. Lives here — not in the HTML renderer — because the cross-link index and the sidebar compute the same ids, and the HTML must match whatever they resolved to.","types":["Entity","String"],"urlPath":"tey/docgen/model"},{"anchor":"function-tey-docgen-model-anchornameof","kind":"function","line":264,"name":"anchorNameOf","qualifiedName":"Tey.Docgen.Model.anchorNameOf","signatures":["anchorNameOf(entity: Entity) -> String"],"summary":"A make's anchor is keyed by its full target spelling (type params included), a module's by its qualified name — the section ids are derived from the same texts.","types":["Entity","String"],"urlPath":"tey/docgen/model"},{"anchor":"function-tey-docgen-model-slugof","kind":"function","line":272,"name":"slugOf","qualifiedName":"Tey.Docgen.Model.slugOf","signatures":["slugOf(name: String) -> String"],"summary":"","types":["String"],"urlPath":"tey/docgen/model"},{"anchor":"module-tey-docgen-nav","kind":"module","line":11,"name":"Tey.Docgen.Nav","qualifiedName":"Tey.Docgen.Nav","signatures":["buildModules(pages: [SourcePage]) -> [ModuleIndexEntry]","modulesOnPage(entities: [Entity], urlPath: String) -> [ModuleIndexEntry]","moduleEntry(entry: ModuleEntry, urlPath: String) -> ModuleIndexEntry","firstLine(summary: String) -> String","parentTitleOf(pages: [SourcePage], page: SourcePage) -> String?","parentLoop(parts: [String], pages: [SourcePage], page: SourcePage) -> String?","claimedByAnother?(pages: [SourcePage], page: SourcePage, title: String) -> Bool","topLevelPages(pages: [SourcePage]) -> [SourcePage]","childPages(pages: [SourcePage], title: String) -> [SourcePage]","descendantPages(pages: [SourcePage], page: SourcePage) -> [SourcePage]","sortedByTitle(pages: [SourcePage]) -> [SourcePage]","buildLinks(pages: [SourcePage]) -> [LinkEntry]","linkEntriesOnPage(entities: [Entity], urlPath: String) -> [LinkEntry]","linkableNames(e: Entity) -> [String]","uniqueTarget?(entries: [LinkEntry], candidate: LinkEntry) -> Bool","differentTarget?(a: LinkEntry, b: LinkEntry) -> Bool","resolve(links: [LinkEntry], name: String) -> LinkEntry?","segmentsOf(typeText: String) -> [String]","splitLoop(rest: String, ident: String, sep: String, out: [String]) -> [String]","flushIdent(ident: String, out: [String]) -> [String]","flushSep(sep: String, out: [String]) -> [String]","isIdentChar?(ch: String) -> Bool","hrefFrom(fromPath: String, toPath: String, anchor: String) -> String","upsToVersionDir(urlPath: String) -> String","ups(n: Integer) -> String"],"summary":"","types":["[SourcePage]","[ModuleIndexEntry]","[Entity]","String","ModuleEntry","ModuleIndexEntry","SourcePage","String?","[String]","Bool","[LinkEntry]","Entity","LinkEntry","LinkEntry?","Integer"],"urlPath":"tey/docgen/nav"},{"anchor":"function-tey-docgen-nav-buildmodules","kind":"function","line":17,"name":"buildModules","qualifiedName":"Tey.Docgen.Nav.buildModules","signatures":["buildModules(pages: [SourcePage]) -> [ModuleIndexEntry]"],"summary":"Every module in the package, in declaration order, pointing at the page it lives on. Nested modules are entries of their own (the sidebar nests them by name).","types":["[SourcePage]","[ModuleIndexEntry]"],"urlPath":"tey/docgen/nav"},{"anchor":"function-tey-docgen-nav-modulesonpage","kind":"function","line":21,"name":"modulesOnPage","qualifiedName":"Tey.Docgen.Nav.modulesOnPage","signatures":["modulesOnPage(entities: [Entity], urlPath: String) -> [ModuleIndexEntry]"],"summary":"","types":["[Entity]","String","[ModuleIndexEntry]"],"urlPath":"tey/docgen/nav"},{"anchor":"function-tey-docgen-nav-moduleentry","kind":"function","line":30,"name":"moduleEntry","qualifiedName":"Tey.Docgen.Nav.moduleEntry","signatures":["moduleEntry(entry: ModuleEntry, urlPath: String) -> ModuleIndexEntry"],"summary":"","types":["ModuleEntry","String","ModuleIndexEntry"],"urlPath":"tey/docgen/nav"},{"anchor":"function-tey-docgen-nav-firstline","kind":"function","line":39,"name":"firstLine","qualifiedName":"Tey.Docgen.Nav.firstLine","signatures":["firstLine(summary: String) -> String"],"summary":"","types":["String"],"urlPath":"tey/docgen/nav"},{"anchor":"function-tey-docgen-nav-parenttitleof","kind":"function","line":50,"name":"parentTitleOf","qualifiedName":"Tey.Docgen.Nav.parentTitleOf","signatures":["parentTitleOf(pages: [SourcePage], page: SourcePage) -> String?"],"summary":"The file tree a module family grows into, rebuilt from titles: a page nests under the page whose title is its dotted prefix, so \"Net.DNS\" (net/dns.kex) is a child of \"Net\" (net.kex), and \"Net.HTTP.WebSocket\" of \"Net.HTTP\". The longest existing prefix wins; a prefix with no page of its own (\"Control\" for \"Control.Retry\") leaves the page at the top level. Titles, not paths, carry the relation — the module names are what a reader scans for.","types":["[SourcePage]","SourcePage","String?"],"urlPath":"tey/docgen/nav"},{"anchor":"function-tey-docgen-nav-parentloop","kind":"function","line":54,"name":"parentLoop","qualifiedName":"Tey.Docgen.Nav.parentLoop","signatures":["parentLoop(parts: [String], pages: [SourcePage], page: SourcePage) -> String?"],"summary":"","types":["[String]","[SourcePage]","SourcePage","String?"],"urlPath":"tey/docgen/nav"},{"anchor":"function-tey-docgen-nav-claimedbyanother?","kind":"function","line":63,"name":"claimedByAnother?","qualifiedName":"Tey.Docgen.Nav.claimedByAnother?","signatures":["claimedByAnother?(pages: [SourcePage], page: SourcePage, title: String) -> Bool"],"summary":"","types":["[SourcePage]","SourcePage","String","Bool"],"urlPath":"tey/docgen/nav"},{"anchor":"function-tey-docgen-nav-toplevelpages","kind":"function","line":69,"name":"topLevelPages","qualifiedName":"Tey.Docgen.Nav.topLevelPages","signatures":["topLevelPages(pages: [SourcePage]) -> [SourcePage]"],"summary":"The sidebar's top level: pages nothing parents, alphabetically by title — a reader scans by name, not by directory-walk order.","types":["[SourcePage]"],"urlPath":"tey/docgen/nav"},{"anchor":"function-tey-docgen-nav-childpages","kind":"function","line":74,"name":"childPages","qualifiedName":"Tey.Docgen.Nav.childPages","signatures":["childPages(pages: [SourcePage], title: String) -> [SourcePage]"],"summary":"The pages nested directly under `title`, alphabetically.","types":["[SourcePage]","String"],"urlPath":"tey/docgen/nav"},{"anchor":"function-tey-docgen-nav-descendantpages","kind":"function","line":80,"name":"descendantPages","qualifiedName":"Tey.Docgen.Nav.descendantPages","signatures":["descendantPages(pages: [SourcePage], page: SourcePage) -> [SourcePage]"],"summary":"Every page in `page`'s family at any depth, alphabetically — what a module page lists as its submodules.","types":["[SourcePage]","SourcePage"],"urlPath":"tey/docgen/nav"},{"anchor":"function-tey-docgen-nav-sortedbytitle","kind":"function","line":86,"name":"sortedByTitle","qualifiedName":"Tey.Docgen.Nav.sortedByTitle","signatures":["sortedByTitle(pages: [SourcePage]) -> [SourcePage]"],"summary":"","types":["[SourcePage]"],"urlPath":"tey/docgen/nav"},{"anchor":"function-tey-docgen-nav-buildlinks","kind":"function","line":95,"name":"buildLinks","qualifiedName":"Tey.Docgen.Nav.buildLinks","signatures":["buildLinks(pages: [SourcePage]) -> [LinkEntry]"],"summary":"Linkable names, unique-target-wins: a name links while exactly one (page, anchor) answers it. A qualified name (\"FS.Path\") is its own name; a simple one (\"Path\") survives only while nothing else claims it — once two different entities answer \"Request\", the simple spelling stops linking and only the spelled-out names do.","types":["[SourcePage]","[LinkEntry]"],"urlPath":"tey/docgen/nav"},{"anchor":"function-tey-docgen-nav-linkentriesonpage","kind":"function","line":100,"name":"linkEntriesOnPage","qualifiedName":"Tey.Docgen.Nav.linkEntriesOnPage","signatures":["linkEntriesOnPage(entities: [Entity], urlPath: String) -> [LinkEntry]"],"summary":"","types":["[Entity]","String","[LinkEntry]"],"urlPath":"tey/docgen/nav"},{"anchor":"function-tey-docgen-nav-linkablenames","kind":"function","line":120,"name":"linkableNames","qualifiedName":"Tey.Docgen.Nav.linkableNames","signatures":["linkableNames(e: Entity) -> [String]"],"summary":"A type/reference name links under its qualified name; entities whose qualified name is the bare name (top-level declarations) offer that spelling too. A make's target with type parameters (\"[X]\", \"Map<K, V>\") links under the base name before the \"<\" — the anchor is still the full-target one, matching the section id.","types":["Entity","[String]"],"urlPath":"tey/docgen/nav"},{"anchor":"function-tey-docgen-nav-uniquetarget?","kind":"function","line":140,"name":"uniqueTarget?","qualifiedName":"Tey.Docgen.Nav.uniqueTarget?","signatures":["uniqueTarget?(entries: [LinkEntry], candidate: LinkEntry) -> Bool"],"summary":"Whether `candidate`'s name answers to exactly one target: every other entry under the same name must land on the same (page, anchor).","types":["[LinkEntry]","LinkEntry","Bool"],"urlPath":"tey/docgen/nav"},{"anchor":"function-tey-docgen-nav-differenttarget?","kind":"function","line":146,"name":"differentTarget?","qualifiedName":"Tey.Docgen.Nav.differentTarget?","signatures":["differentTarget?(a: LinkEntry, b: LinkEntry) -> Bool"],"summary":"","types":["LinkEntry","Bool"],"urlPath":"tey/docgen/nav"},{"anchor":"function-tey-docgen-nav-resolve","kind":"function","line":150,"name":"resolve","qualifiedName":"Tey.Docgen.Nav.resolve","signatures":["resolve(links: [LinkEntry], name: String) -> LinkEntry?"],"summary":"","types":["[LinkEntry]","String","LinkEntry?"],"urlPath":"tey/docgen/nav"},{"anchor":"function-tey-docgen-nav-segmentsof","kind":"function","line":157,"name":"segmentsOf","qualifiedName":"Tey.Docgen.Nav.segmentsOf","signatures":["segmentsOf(typeText: String) -> [String]"],"summary":"Splits a type reference into identifier segments and separator runs, so a renderer can link the identifiers and leave the punctuation alone: \"Map<String, FS.Path>\" → [\"Map\", \"<\", \"String\", \", \", \"FS.Path\", \">\"].","types":["String","[String]"],"urlPath":"tey/docgen/nav"},{"anchor":"function-tey-docgen-nav-splitloop","kind":"function","line":163,"name":"splitLoop","qualifiedName":"Tey.Docgen.Nav.splitLoop","signatures":["splitLoop(rest: String, ident: String, sep: String, out: [String]) -> [String]"],"summary":"`ident` is the identifier being read, `sep` the separator run since it; only one is non-empty at a time, and whichever it is goes out in order.","types":["String","[String]"],"urlPath":"tey/docgen/nav"},{"anchor":"function-tey-docgen-nav-flushident","kind":"function","line":174,"name":"flushIdent","qualifiedName":"Tey.Docgen.Nav.flushIdent","signatures":["flushIdent(ident: String, out: [String]) -> [String]"],"summary":"","types":["String","[String]"],"urlPath":"tey/docgen/nav"},{"anchor":"function-tey-docgen-nav-flushsep","kind":"function","line":181,"name":"flushSep","qualifiedName":"Tey.Docgen.Nav.flushSep","signatures":["flushSep(sep: String, out: [String]) -> [String]"],"summary":"","types":["String","[String]"],"urlPath":"tey/docgen/nav"},{"anchor":"function-tey-docgen-nav-isidentchar?","kind":"function","line":188,"name":"isIdentChar?","qualifiedName":"Tey.Docgen.Nav.isIdentChar?","signatures":["isIdentChar?(ch: String) -> Bool"],"summary":"","types":["String","Bool"],"urlPath":"tey/docgen/nav"},{"anchor":"function-tey-docgen-nav-hreffrom","kind":"function","line":194,"name":"hrefFrom","qualifiedName":"Tey.Docgen.Nav.hrefFrom","signatures":["hrefFrom(fromPath: String, toPath: String, anchor: String) -> String"],"summary":"The href from one page of this package to another, with anchor: same page → \"#anchor\"; else up to the version directory and back down.","types":["String"],"urlPath":"tey/docgen/nav"},{"anchor":"function-tey-docgen-nav-upstoversiondir","kind":"function","line":201,"name":"upsToVersionDir","qualifiedName":"Tey.Docgen.Nav.upsToVersionDir","signatures":["upsToVersionDir(urlPath: String) -> String"],"summary":"","types":["String"],"urlPath":"tey/docgen/nav"},{"anchor":"function-tey-docgen-nav-ups","kind":"function","line":205,"name":"ups","qualifiedName":"Tey.Docgen.Nav.ups","signatures":["ups(n: Integer) -> String"],"summary":"","types":["Integer","String"],"urlPath":"tey/docgen/nav"},{"anchor":"module-tey-docgen-prose","kind":"module","line":14,"name":"Tey.Docgen.Prose","qualifiedName":"Tey.Docgen.Prose","signatures":["proseCommand(parsed: OptionParser.ParsedOptions) -> Integer","readPages(files: [String], source: String, accum: [ProsePage]) -> [ProsePage]","pageOf(fileName: String, text: String) -> ProsePage","stripSuffix(name: String, suffix: String) -> String","writeProse(pages: [ProsePage], versionDir: String, out: String, model: PackageModel) -> ()","writeProseLoop(pages: [ProsePage], index: Integer, versionDir: String, model: PackageModel) -> ()","proseIndexHtml(pages: [ProsePage], model: PackageModel) -> String","chapterItem(prose: ProsePage) -> String","prevNextHtml(pages: [ProsePage], index: Integer) -> String","prevLink(pages: [ProsePage], index: Integer, up: String) -> String","nextLink(pages: [ProsePage], index: Integer, up: String) -> String","chapterNav(prev: String, nextHtml: String) -> String"],"summary":"","types":["OptionParser.ParsedOptions","Integer","SourcePage","String","[String]","[ProsePage]","ProsePage","PackageModel","()"],"urlPath":"tey/docgen/prose"},{"anchor":"function-tey-docgen-prose-prosecommand","kind":"function","line":17,"name":"proseCommand","qualifiedName":"Tey.Docgen.Prose.proseCommand","signatures":["proseCommand(parsed: OptionParser.ParsedOptions) -> Integer"],"summary":"","types":["OptionParser.ParsedOptions","Integer"],"urlPath":"tey/docgen/prose"},{"anchor":"record-tey-docgen-prose-prosepage","kind":"record","line":81,"name":"ProsePage","qualifiedName":"Tey.Docgen.Prose.ProsePage","signatures":[],"summary":"A page and the things only its frontmatter knows: where it sorts, the HTML its Markdown became, the description its index entry shows, and the Markdown (minus frontmatter) its raw `.md` rendering serves.","types":["SourcePage","Integer","String"],"urlPath":"tey/docgen/prose"},{"anchor":"function-tey-docgen-prose-readpages","kind":"function","line":89,"name":"readPages","qualifiedName":"Tey.Docgen.Prose.readPages","signatures":["readPages(files: [String], source: String, accum: [ProsePage]) -> [ProsePage]"],"summary":"","types":["[String]","String","[ProsePage]"],"urlPath":"tey/docgen/prose"},{"anchor":"function-tey-docgen-prose-pageof","kind":"function","line":107,"name":"pageOf","qualifiedName":"Tey.Docgen.Prose.pageOf","signatures":["pageOf(fileName: String, text: String) -> ProsePage"],"summary":"","types":["String","ProsePage"],"urlPath":"tey/docgen/prose"},{"anchor":"function-tey-docgen-prose-stripsuffix","kind":"function","line":125,"name":"stripSuffix","qualifiedName":"Tey.Docgen.Prose.stripSuffix","signatures":["stripSuffix(name: String, suffix: String) -> String"],"summary":"","types":["String"],"urlPath":"tey/docgen/prose"},{"anchor":"function-tey-docgen-prose-writeprose","kind":"function","line":133,"name":"writeProse","qualifiedName":"Tey.Docgen.Prose.writeProse","signatures":["writeProse(pages: [ProsePage], versionDir: String, out: String, model: PackageModel) -> ()"],"summary":"Both renderings, from the same parsed page: HTML for readers, Markdown for crawlers, LLMs, and the \"Markdown\" link every page carries — the same `.md`-next-to-`.html` pairing reference builds write.","types":["[ProsePage]","String","PackageModel","()"],"urlPath":"tey/docgen/prose"},{"anchor":"function-tey-docgen-prose-writeproseloop","kind":"function","line":144,"name":"writeProseLoop","qualifiedName":"Tey.Docgen.Prose.writeProseLoop","signatures":["writeProseLoop(pages: [ProsePage], index: Integer, versionDir: String, model: PackageModel) -> ()"],"summary":"","types":["[ProsePage]","Integer","String","PackageModel","()"],"urlPath":"tey/docgen/prose"},{"anchor":"function-tey-docgen-prose-proseindexhtml","kind":"function","line":166,"name":"proseIndexHtml","qualifiedName":"Tey.Docgen.Prose.proseIndexHtml","signatures":["proseIndexHtml(pages: [ProsePage], model: PackageModel) -> String"],"summary":"The book's own spine: chapters in author order with their descriptions, not the module grid reference builds get. Deliberately separate from `versionIndexHtml` — `tey docs build` keeps documenting any package, and nothing about a book leaks into it.","types":["[ProsePage]","PackageModel","String"],"urlPath":"tey/docgen/prose"},{"anchor":"function-tey-docgen-prose-chapteritem","kind":"function","line":174,"name":"chapterItem","qualifiedName":"Tey.Docgen.Prose.chapterItem","signatures":["chapterItem(prose: ProsePage) -> String"],"summary":"","types":["ProsePage","String"],"urlPath":"tey/docgen/prose"},{"anchor":"function-tey-docgen-prose-prevnexthtml","kind":"function","line":184,"name":"prevNextHtml","qualifiedName":"Tey.Docgen.Prose.prevNextHtml","signatures":["prevNextHtml(pages: [ProsePage], index: Integer) -> String"],"summary":"Chapter footer: the siblings around this one, so the book reads forward as well as sideways. First and last chapters link one way only.","types":["[ProsePage]","Integer","String"],"urlPath":"tey/docgen/prose"},{"anchor":"function-tey-docgen-prose-prevlink","kind":"function","line":194,"name":"prevLink","qualifiedName":"Tey.Docgen.Prose.prevLink","signatures":["prevLink(pages: [ProsePage], index: Integer, up: String) -> String"],"summary":"","types":["[ProsePage]","Integer","String"],"urlPath":"tey/docgen/prose"},{"anchor":"function-tey-docgen-prose-nextlink","kind":"function","line":202,"name":"nextLink","qualifiedName":"Tey.Docgen.Prose.nextLink","signatures":["nextLink(pages: [ProsePage], index: Integer, up: String) -> String"],"summary":"","types":["[ProsePage]","Integer","String"],"urlPath":"tey/docgen/prose"},{"anchor":"function-tey-docgen-prose-chapternav","kind":"function","line":209,"name":"chapterNav","qualifiedName":"Tey.Docgen.Prose.chapterNav","signatures":["chapterNav(prev: String, nextHtml: String) -> String"],"summary":"","types":["String"],"urlPath":"tey/docgen/prose"},{"anchor":"module-tey-docgen-rdoc","kind":"module","line":15,"name":"Tey.Docgen.Rdoc","qualifiedName":"Tey.Docgen.Rdoc","signatures":["parseDoc(text: String) -> Doc?","parseOrEmpty(text: String) -> Doc","rewritePlusPairs(s: String, accum: String) -> String","splitParagraphs(lines: [String], current: [String], accum: [[String]]) -> [[String]]","directiveBlock?(current: [String]) -> Bool","indented?(line: String) -> Bool","indentWidth(s: String) -> Integer","verbatim?(lines: [String]) -> Bool","dedent(lines: [String]) -> [String]","fenceVerbatim(lines: [String]) -> String","mergeVerbatim(blocks: [[String]], accum: [[String]]) -> [[String]]","classifyBlocks(blocks: [[String]], summary: String, params: [Param], returns: Return?, examples: [Example], deprecated: String?) -> Doc?","parseParam(lines: [String]) -> Param","parseReturn(lines: [String]) -> Return","parseExample(lines: [String]) -> Example","parseBracketed(s: String) -> Bracketed?","findClosingBracket(s: String, index: Integer, depth: Integer) -> Integer?"],"summary":"","types":["String","Doc?","Doc","[String]","[[String]]","Bool","Integer","[Param]","Return?","[Example]","String?","Param","Return","Example","Bracketed?","Integer?"],"urlPath":"tey/docgen/rdoc"},{"anchor":"record-tey-docgen-rdoc-bracketed","kind":"record","line":18,"name":"Bracketed","qualifiedName":"Tey.Docgen.Rdoc.Bracketed","signatures":[],"summary":"","types":["String"],"urlPath":"tey/docgen/rdoc"},{"anchor":"function-tey-docgen-rdoc-parsedoc","kind":"function","line":23,"name":"parseDoc","qualifiedName":"Tey.Docgen.Rdoc.parseDoc","signatures":["parseDoc(text: String) -> Doc?"],"summary":"","types":["String","Doc?"],"urlPath":"tey/docgen/rdoc"},{"anchor":"function-tey-docgen-rdoc-parseorempty","kind":"function","line":32,"name":"parseOrEmpty","qualifiedName":"Tey.Docgen.Rdoc.parseOrEmpty","signatures":["parseOrEmpty(text: String) -> Doc"],"summary":"","types":["String","Doc"],"urlPath":"tey/docgen/rdoc"},{"anchor":"function-tey-docgen-rdoc-rewritepluspairs","kind":"function","line":39,"name":"rewritePlusPairs","qualifiedName":"Tey.Docgen.Rdoc.rewritePlusPairs","signatures":["rewritePlusPairs(s: String, accum: String) -> String"],"summary":"","types":["String"],"urlPath":"tey/docgen/rdoc"},{"anchor":"function-tey-docgen-rdoc-splitparagraphs","kind":"function","line":63,"name":"splitParagraphs","qualifiedName":"Tey.Docgen.Rdoc.splitParagraphs","signatures":["splitParagraphs(lines: [String], current: [String], accum: [[String]]) -> [[String]]"],"summary":"Splits lines into paragraphs (blocks). Prose groups until a blank line; directives are LINE-based, so each `@param`/`@return`/`@example` line begins its own paragraph — consecutive `@param a` / `@param b` lines must not merge into one block, or only the first would be parsed. An `@example`'s indented code lines follow it and stay in its block (they do not open with `@`).","types":["[String]","[[String]]"],"urlPath":"tey/docgen/rdoc"},{"anchor":"function-tey-docgen-rdoc-directiveblock?","kind":"function","line":98,"name":"directiveBlock?","qualifiedName":"Tey.Docgen.Rdoc.directiveBlock?","signatures":["directiveBlock?(current: [String]) -> Bool"],"summary":"","types":["[String]","Bool"],"urlPath":"tey/docgen/rdoc"},{"anchor":"function-tey-docgen-rdoc-indented?","kind":"function","line":102,"name":"indented?","qualifiedName":"Tey.Docgen.Rdoc.indented?","signatures":["indented?(line: String) -> Bool"],"summary":"","types":["String","Bool"],"urlPath":"tey/docgen/rdoc"},{"anchor":"function-tey-docgen-rdoc-indentwidth","kind":"function","line":113,"name":"indentWidth","qualifiedName":"Tey.Docgen.Rdoc.indentWidth","signatures":["indentWidth(s: String) -> Integer"],"summary":"RDoc's verbatim marker is indentation: a prose block whose every line is indented is code — or a hand-laid-out table — that the author positioned deliberately. Reflowing it into a paragraph loses both the line breaks and the highlighting, so it is carried through the summary as a fenced block instead, which both renderers turn back into a highlighted `<pre>`.\n\nLeading-space count of a line.","types":["String","Integer"],"urlPath":"tey/docgen/rdoc"},{"anchor":"function-tey-docgen-rdoc-verbatim?","kind":"function","line":117,"name":"verbatim?","qualifiedName":"Tey.Docgen.Rdoc.verbatim?","signatures":["verbatim?(lines: [String]) -> Bool"],"summary":"","types":["[String]","Bool"],"urlPath":"tey/docgen/rdoc"},{"anchor":"function-tey-docgen-rdoc-dedent","kind":"function","line":127,"name":"dedent","qualifiedName":"Tey.Docgen.Rdoc.dedent","signatures":["dedent(lines: [String]) -> [String]"],"summary":"Strips the common indentation shared by every non-blank line, so a block written at two spaces (or nested deeper) renders flush left.","types":["[String]"],"urlPath":"tey/docgen/rdoc"},{"anchor":"function-tey-docgen-rdoc-fenceverbatim","kind":"function","line":139,"name":"fenceVerbatim","qualifiedName":"Tey.Docgen.Rdoc.fenceVerbatim","signatures":["fenceVerbatim(lines: [String]) -> String"],"summary":"","types":["[String]","String"],"urlPath":"tey/docgen/rdoc"},{"anchor":"function-tey-docgen-rdoc-mergeverbatim","kind":"function","line":145,"name":"mergeVerbatim","qualifiedName":"Tey.Docgen.Rdoc.mergeVerbatim","signatures":["mergeVerbatim(blocks: [[String]], accum: [[String]]) -> [[String]]"],"summary":"A blank line inside a verbatim block ends a paragraph but not the block, so adjacent verbatim blocks are re-joined with the blank line between them.","types":["[[String]]"],"urlPath":"tey/docgen/rdoc"},{"anchor":"function-tey-docgen-rdoc-classifyblocks","kind":"function","line":158,"name":"classifyBlocks","qualifiedName":"Tey.Docgen.Rdoc.classifyBlocks","signatures":["classifyBlocks(blocks: [[String]], summary: String, params: [Param], returns: Return?, examples: [Example], deprecated: String?) -> Doc?"],"summary":"","types":["[[String]]","String","[Param]","Return?","[Example]","String?","Doc?"],"urlPath":"tey/docgen/rdoc"},{"anchor":"function-tey-docgen-rdoc-parseparam","kind":"function","line":200,"name":"parseParam","qualifiedName":"Tey.Docgen.Rdoc.parseParam","signatures":["parseParam(lines: [String]) -> Param"],"summary":"","types":["[String]","Param"],"urlPath":"tey/docgen/rdoc"},{"anchor":"function-tey-docgen-rdoc-parsereturn","kind":"function","line":219,"name":"parseReturn","qualifiedName":"Tey.Docgen.Rdoc.parseReturn","signatures":["parseReturn(lines: [String]) -> Return"],"summary":"","types":["[String]","Return"],"urlPath":"tey/docgen/rdoc"},{"anchor":"function-tey-docgen-rdoc-parseexample","kind":"function","line":227,"name":"parseExample","qualifiedName":"Tey.Docgen.Rdoc.parseExample","signatures":["parseExample(lines: [String]) -> Example"],"summary":"","types":["[String]","Example"],"urlPath":"tey/docgen/rdoc"},{"anchor":"function-tey-docgen-rdoc-parsebracketed","kind":"function","line":235,"name":"parseBracketed","qualifiedName":"Tey.Docgen.Rdoc.parseBracketed","signatures":["parseBracketed(s: String) -> Bracketed?"],"summary":"\"[...]\" prefix → Bracketed. None when the text does not open with a bracketed group.","types":["String","Bracketed?"],"urlPath":"tey/docgen/rdoc"},{"anchor":"function-tey-docgen-rdoc-findclosingbracket","kind":"function","line":252,"name":"findClosingBracket","qualifiedName":"Tey.Docgen.Rdoc.findClosingBracket","signatures":["findClosingBracket(s: String, index: Integer, depth: Integer) -> Integer?"],"summary":"","types":["String","Integer","Integer?"],"urlPath":"tey/docgen/rdoc"},{"anchor":"module-tey-docgen-scan","kind":"module","line":6,"name":"Tey.Docgen.Scan","qualifiedName":"Tey.Docgen.Scan","signatures":["sourceFiles(sourceDir: String) -> [String]","proseFiles(sourceDir: String) -> [String]","filesWithSuffix(sourceDir: String, suffix: String) -> [String]","subdirectories(sourceDir: String) -> [String]","nested(dirs: [String], sourceDir: String, suffix: String) -> [String]"],"summary":"","types":["String","[String]"],"urlPath":"tey/docgen/scan"},{"anchor":"function-tey-docgen-scan-sourcefiles","kind":"function","line":7,"name":"sourceFiles","qualifiedName":"Tey.Docgen.Scan.sourceFiles","signatures":["sourceFiles(sourceDir: String) -> [String]"],"summary":"","types":["String","[String]"],"urlPath":"tey/docgen/scan"},{"anchor":"function-tey-docgen-scan-prosefiles","kind":"function","line":13,"name":"proseFiles","qualifiedName":"Tey.Docgen.Scan.proseFiles","signatures":["proseFiles(sourceDir: String) -> [String]"],"summary":"The prose half of the same walk: `tey docs prose` reads .md rather than .kex, and wants the same recursion, the same sorting and the same skip.","types":["String","[String]"],"urlPath":"tey/docgen/scan"},{"anchor":"function-tey-docgen-scan-fileswithsuffix","kind":"function","line":17,"name":"filesWithSuffix","qualifiedName":"Tey.Docgen.Scan.filesWithSuffix","signatures":["filesWithSuffix(sourceDir: String, suffix: String) -> [String]"],"summary":"","types":["String","[String]"],"urlPath":"tey/docgen/scan"},{"anchor":"function-tey-docgen-scan-subdirectories","kind":"function","line":29,"name":"subdirectories","qualifiedName":"Tey.Docgen.Scan.subdirectories","signatures":["subdirectories(sourceDir: String) -> [String]"],"summary":"","types":["String","[String]"],"urlPath":"tey/docgen/scan"},{"anchor":"function-tey-docgen-scan-nested","kind":"function","line":33,"name":"nested","qualifiedName":"Tey.Docgen.Scan.nested","signatures":["nested(dirs: [String], sourceDir: String, suffix: String) -> [String]"],"summary":"","types":["[String]","String"],"urlPath":"tey/docgen/scan"},{"anchor":"module-tey-docgen-serve","kind":"module","line":4,"name":"Tey.Docgen.Serve","qualifiedName":"Tey.Docgen.Serve","signatures":["serveCommand(parsed: OptionParser.ParsedOptions) -> Integer","routesFor(prefix: String, name: String) -> [String]","collectServeFiles(dir: String, prefix: String) -> [ServedFile]","serveFile(req: Web.Request, filePath: String) -> Web.Response","contentTypeFor(path: String) -> String","fileHandler(filePath: String) -> Web.Request -> Web.Response"],"summary":"","types":["String","OptionParser.ParsedOptions","Integer","[String]","[ServedFile]","Web.Request","Web.Response","Web.Request -> Web.Response"],"urlPath":"tey/docgen/serve"},{"anchor":"record-tey-docgen-serve-servedfile","kind":"record","line":5,"name":"ServedFile","qualifiedName":"Tey.Docgen.Serve.ServedFile","signatures":[],"summary":"","types":["String"],"urlPath":"tey/docgen/serve"},{"anchor":"function-tey-docgen-serve-servecommand","kind":"function","line":10,"name":"serveCommand","qualifiedName":"Tey.Docgen.Serve.serveCommand","signatures":["serveCommand(parsed: OptionParser.ParsedOptions) -> Integer"],"summary":"","types":["OptionParser.ParsedOptions","Integer"],"urlPath":"tey/docgen/serve"},{"anchor":"function-tey-docgen-serve-routesfor","kind":"function","line":38,"name":"routesFor","qualifiedName":"Tey.Docgen.Serve.routesFor","signatures":["routesFor(prefix: String, name: String) -> [String]"],"summary":"The URL paths a browser would type for this file: an index.html is reached by its directory (\"/\", \"/prelude/0.4.0-alpha/\") as much as by its name, and the router matches exactly — so it answers the bare, the slash-terminated, and the named spelling. Every other file answers its own path only.","types":["String","[String]"],"urlPath":"tey/docgen/serve"},{"anchor":"function-tey-docgen-serve-collectservefiles","kind":"function","line":46,"name":"collectServeFiles","qualifiedName":"Tey.Docgen.Serve.collectServeFiles","signatures":["collectServeFiles(dir: String, prefix: String) -> [ServedFile]"],"summary":"","types":["String","[ServedFile]"],"urlPath":"tey/docgen/serve"},{"anchor":"function-tey-docgen-serve-servefile","kind":"function","line":56,"name":"serveFile","qualifiedName":"Tey.Docgen.Serve.serveFile","signatures":["serveFile(req: Web.Request, filePath: String) -> Web.Response"],"summary":"","types":["Web.Request","String","Web.Response"],"urlPath":"tey/docgen/serve"},{"anchor":"function-tey-docgen-serve-contenttypefor","kind":"function","line":69,"name":"contentTypeFor","qualifiedName":"Tey.Docgen.Serve.contentTypeFor","signatures":["contentTypeFor(path: String) -> String"],"summary":"","types":["String"],"urlPath":"tey/docgen/serve"},{"anchor":"function-tey-docgen-serve-filehandler","kind":"function","line":79,"name":"fileHandler","qualifiedName":"Tey.Docgen.Serve.fileHandler","signatures":["fileHandler(filePath: String) -> Web.Request -> Web.Response"],"summary":"","types":["String","Web.Request -> Web.Response"],"urlPath":"tey/docgen/serve"}],"generatedAt":"2026-09-27T13:33:44.108900305Z","package":"tey","version":"0.2.0"}