{"entries":[{"anchor":"module-tey-broker","kind":"module","line":1,"name":"Tey.Broker","qualifiedName":"Tey.Broker","signatures":["grants(plugin: Plugin, workspaceRoot: String) -> Grants","answered(grants: Grants, line: String) -> String","host(url: String) -> Result<String, String>"],"summary":"","types":["String","Bool","[String]","Plugin","Grants","Result<String, String>"],"urlPath":"tey/broker"},{"anchor":"record-tey-broker-grants","kind":"record","line":30,"name":"Grants","qualifiedName":"Tey.Broker.Grants","signatures":[],"summary":"The plugin host's side of a command's conversation.\n\nA plugin command runs in a sandbox where it can write nothing and reach no network. Whatever it wants done in the world it asks for, one JSON object per line on its stdout, and waits for the answer on its stdin:\n\n```kex\n{\"op\":\"print\",\"text\":\"…\"}\n{\"op\":\"read\",\"path\":\"README.md\"}\n{\"op\":\"write\",\"path\":\".github/workflows/ci.yml\",\"content\":\"…\"}\n{\"op\":\"delete\",\"path\":\"old.yml\"}\n{\"op\":\"run\",\"command\":\"git\",\"arguments\":[\"status\",\"--short\"]}\n{\"op\":\"fetch\",\"method\":\"GET\",\"url\":\"https://api.github.com/…\",\"body\":\"\"}\n```\n\nEach request is checked here against what the plugin declared and the user approved, then carried out by Tey or refused:\n\n```kex\n{\"ok\":true, …}        {\"ok\":false,\"error\":\"…\"}\n```\n\nSo `Process.Run([\"git\"])` means git and nothing else, and `Net.Connect([\"api.github.com\"])` means that host and no other — the plugin never runs a program with the user's access or opens a socket; Tey does, on its behalf, after looking.\n\nWhat a plugin was approved for.","types":["String","Bool","[String]"],"urlPath":"tey/broker"},{"anchor":"function-tey-broker-grants","kind":"function","line":37,"name":"grants","qualifiedName":"Tey.Broker.grants","signatures":["grants(plugin: Plugin, workspaceRoot: String) -> Grants"],"summary":"","types":["Plugin","String","Grants"],"urlPath":"tey/broker"},{"anchor":"function-tey-broker-answered","kind":"function","line":52,"name":"answered","qualifiedName":"Tey.Broker.answered","signatures":["answered(grants: Grants, line: String) -> String"],"summary":"One request line in, one response line out. Never raises: a request that cannot be read or is refused is answered, so the plugin can say why.","types":["Grants","String"],"urlPath":"tey/broker"},{"anchor":"function-tey-broker-host","kind":"function","line":75,"name":"host","qualifiedName":"Tey.Broker.host","signatures":["host(url: String) -> Result<String, String>"],"summary":"The host name of an http(s) URL, lower-cased; an error for anything else, or for a URL that hides its host behind user information.","types":["String","Result<String, String>"],"urlPath":"tey/broker"},{"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","colorFlag?(argument: String) -> Bool","plain?(args: [String]) -> Bool","withoutColorFlags(args: [String]) -> [String]","dispatchArguments(args: [String]) -> Integer","relayColors : Void","announceToolchain : Void"],"summary":"","types":["OptionConfig","[String]","Integer","String","Bool","Void"],"urlPath":"tey/cli"},{"anchor":"function-tey-cli-parser","kind":"function","line":15,"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":181,"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":195,"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-colorflag?","kind":"function","line":203,"name":"colorFlag?","qualifiedName":"Tey.Cli.colorFlag?","signatures":["colorFlag?(argument: String) -> Bool"],"summary":"Whether an argument turns colors off. `--no-colors` is how `kex` spells it, and somebody switching between the two tools should not have to remember which one takes the `s`.","types":["String","Bool"],"urlPath":"tey/cli"},{"anchor":"function-tey-cli-plain?","kind":"function","line":208,"name":"plain?","qualifiedName":"Tey.Cli.plain?","signatures":["plain?(args: [String]) -> Bool"],"summary":"Whether the line asks for plain output. Only Tey's own arguments count: past a bare `--` they belong to the program being run, which may well have a `--no-color` of its own.","types":["[String]","Bool"],"urlPath":"tey/cli"},{"anchor":"function-tey-cli-withoutcolorflags","kind":"function","line":217,"name":"withoutColorFlags","qualifiedName":"Tey.Cli.withoutColorFlags","signatures":["withoutColorFlags(args: [String]) -> [String]"],"summary":"The line without the color flags, which are answered before parsing — by setting NO_COLOR, the one switch `Console`, every child `kex`, and this parser's own error text all read. Taking them out here rather than leaving them to the parser is what makes the flag work wherever it is written: `tey docs` is a passthrough command whose own parser has never heard of it.","types":["[String]"],"urlPath":"tey/cli"},{"anchor":"function-tey-cli-dispatcharguments","kind":"function","line":222,"name":"dispatchArguments","qualifiedName":"Tey.Cli.dispatchArguments","signatures":["dispatchArguments(args: [String]) -> Integer"],"summary":"","types":["[String]","Integer"],"urlPath":"tey/cli"},{"anchor":"function-tey-cli-relaycolors","kind":"function","line":240,"name":"relayColors","qualifiedName":"Tey.Cli.relayColors","signatures":["relayColors : Void"],"summary":"`kex` colors only a terminal. Every `kex` Tey starts — `tey test`, `tey run`, a package command — now writes to Tey's own stdout (`Process.stream` hands its child the descriptors), so it sees the terminal Tey sees and colors by itself; until it did, it wrote through a pipe and had to be told. Telling it still agrees with what it sees. NO_COLOR, when set, is left to win in every child; `Kex.AST` passes `--no-colors`, which outranks this, so nothing Tey parses back picks up escape codes.","types":["Void"],"urlPath":"tey/cli"},{"anchor":"function-tey-cli-announcetoolchain","kind":"function","line":257,"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","installWorkspace(without: String, packageName: String, force?: Bool, approveAll?: Bool) -> Integer","installDependencies(context: Context, without: String, approveAll?: Bool) -> Result<Void, String>","fetchAll(dependencies: [Tey.Lockfile.Dependency]) -> Result<Void, String>","installPrograms(arguments: [String], options: InstallOptions) -> Integer","installProgram(argument: String, options: InstallOptions) -> Integer","reinstallProgram(name: String, options: InstallOptions) -> Integer","uninstallPrograms(names: [String]) -> Integer","uninstallProgram(name: String) -> Integer","installFromPath(path: String, options: InstallOptions) -> Integer","installFromGit(url: String, options: InstallOptions) -> Integer","previousApprovals(name: String) -> {String: String}","programMember(context: Context, packageName: String) -> Result<Member, String>","installProgramMember(context: Context, member: Member, options: InstallOptions, origin: Receipt) -> Integer","installStaged(context: Context, member: Member, staging: String, options: InstallOptions, origin: Receipt) -> 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]","installTargetsSelected(context: Context, packageName: String, force?: Bool = …) -> Integer","installMemberTargets(member: Member, force?: Bool = …) -> Integer","installMemberTargetsFrom(member: Member, force?: Bool, origin: Receipt, selected: [String]) -> Integer","releaseTarget(owner: String, name: String) -> Result<Void, String>","recordInstall(package: ManifestPackage, origin: Receipt, installed: [String], receipts: [Receipt], claims: [(String, Claim)]) -> Result<Void, String>","dependencyRoots : [String]","dependencyRootsAt(start: String) -> [String]","sourceDirectoryAt(packageRoot: String) -> String","sourceUnit(directory: String, path: String) -> String","sourceUnit?(path: String) -> Bool","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","generate(arguments: [String]) -> Integer","pluginCommand(arguments: [String]) -> Integer","list : Integer","listPrograms(programs: [Receipt]) -> Void","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","Context","Result<Void, String>","[Tey.Lockfile.Dependency]","InstallOptions","{String: String}","Result<Member, String>","Member","Receipt","LockState","Tey.Toolchain.ToolchainInfo","[Member]","ManifestPackage","[Receipt]","[(String, Claim)]","Command","Void"],"urlPath":"tey/commands"},{"anchor":"record-tey-commands-workspacerunstate","kind":"record","line":15,"name":"WorkspaceRunState","qualifiedName":"Tey.Commands.WorkspaceRunState","signatures":[],"summary":"","types":["Integer","[String]"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-manifest","kind":"function","line":20,"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":28,"name":"lock","qualifiedName":"Tey.Commands.lock","signatures":["lock : Integer"],"summary":"","types":["Integer"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-add","kind":"function","line":47,"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":69,"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":102,"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-installworkspace","kind":"function","line":108,"name":"installWorkspace","qualifiedName":"Tey.Commands.installWorkspace","signatures":["installWorkspace(without: String, packageName: String, force?: Bool, approveAll?: Bool) -> Integer"],"summary":"`install`, where `force?` lets targets replace programs Tey does not own (see Tey.Programs.refusal).","types":["String","Bool","Integer"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-installdependencies","kind":"function","line":124,"name":"installDependencies","qualifiedName":"Tey.Commands.installDependencies","signatures":["installDependencies(context: Context, without: String, approveAll?: Bool) -> Result<Void, String>"],"summary":"Resolves (or reuses) the workspace's lock, fetches and verifies what it names, approves plugins, and writes the lock back — everything `tey install` does before building.","types":["Context","String","Bool","Result<Void, String>"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-fetchall","kind":"function","line":146,"name":"fetchAll","qualifiedName":"Tey.Commands.fetchAll","signatures":["fetchAll(dependencies: [Tey.Lockfile.Dependency]) -> Result<Void, String>"],"summary":"","types":["[Tey.Lockfile.Dependency]","Result<Void, String>"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-installprograms","kind":"function","line":158,"name":"installPrograms","qualifiedName":"Tey.Commands.installPrograms","signatures":["installPrograms(arguments: [String], options: InstallOptions) -> Integer"],"summary":"`tey install <argument>...`: a program from a path or a Git URL, or installed programs updated by name. Several arguments must all be names — a source is one program, with its own options.","types":["[String]","InstallOptions","Integer"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-installprogram","kind":"function","line":178,"name":"installProgram","qualifiedName":"Tey.Commands.installProgram","signatures":["installProgram(argument: String, options: InstallOptions) -> Integer"],"summary":"","types":["String","InstallOptions","Integer"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-reinstallprogram","kind":"function","line":191,"name":"reinstallProgram","qualifiedName":"Tey.Commands.reinstallProgram","signatures":["reinstallProgram(name: String, options: InstallOptions) -> Integer"],"summary":"`tey install <name>`: installs an installed program again from where its receipt says it came from — which is what updating it means. A tag or an exact commit stays pinned unless a new `--tag`/`--branch`/`--ref` is given; a branch (or HEAD) and a path are rebuilt only when their commit or content moved, unless `--rebuild` says to anyway (a new Erlang, a compiler fix).","types":["String","InstallOptions","Integer"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-uninstallprograms","kind":"function","line":245,"name":"uninstallPrograms","qualifiedName":"Tey.Commands.uninstallPrograms","signatures":["uninstallPrograms(names: [String]) -> Integer"],"summary":"`tey uninstall <name>...`: removes the programs each receipt owns, then the receipt and the build tree it came from. A program that has since been replaced by a file Tey did not write is left where it is, and said so.","types":["[String]","Integer"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-uninstallprogram","kind":"function","line":256,"name":"uninstallProgram","qualifiedName":"Tey.Commands.uninstallProgram","signatures":["uninstallProgram(name: String) -> Integer"],"summary":"","types":["String","Integer"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-installfrompath","kind":"function","line":283,"name":"installFromPath","qualifiedName":"Tey.Commands.installFromPath","signatures":["installFromPath(path: String, options: InstallOptions) -> Integer"],"summary":"Installs the program at `path` without touching it: the workspace around it is copied into a staging directory, which gets its own lock, dependencies and build, and only replaces the program's previous build tree once its programs are in place. The user's checkout gains no `ebin/`, no `tey.lock`, nothing.","types":["String","InstallOptions","Integer"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-installfromgit","kind":"function","line":304,"name":"installFromGit","qualifiedName":"Tey.Commands.installFromGit","signatures":["installFromGit(url: String, options: InstallOptions) -> Integer"],"summary":"Installs a program from a Git repository at the commit `--tag`, `--branch` or `--ref` names (the default branch's HEAD otherwise). The commit is fetched into the cache the way a dependency is, and installed from there as a path is — the cache checkout itself is never built in.","types":["String","InstallOptions","Integer"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-previousapprovals","kind":"function","line":336,"name":"previousApprovals","qualifiedName":"Tey.Commands.previousApprovals","signatures":["previousApprovals(name: String) -> {String: String}"],"summary":"The plugin approvals the previous install of program `name` was built with: its build tree's lock. None for a first install.","types":["String","{String: String}"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-programmember","kind":"function","line":349,"name":"programMember","qualifiedName":"Tey.Commands.programMember","signatures":["programMember(context: Context, packageName: String) -> Result<Member, String>"],"summary":"The member of `context` a program install means: the one `--package` names, else the one the path is inside of.","types":["Context","String","Result<Member, String>"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-installprogrammember","kind":"function","line":376,"name":"installProgramMember","qualifiedName":"Tey.Commands.installProgramMember","signatures":["installProgramMember(context: Context, member: Member, options: InstallOptions, origin: Receipt) -> Integer"],"summary":"The shared half of a path and a Git install, once the member is known: refuse a library, check `--target`, stage, build, publish.","types":["Context","Member","InstallOptions","Receipt","Integer"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-installstaged","kind":"function","line":396,"name":"installStaged","qualifiedName":"Tey.Commands.installStaged","signatures":["installStaged(context: Context, member: Member, staging: String, options: InstallOptions, origin: Receipt) -> Integer"],"summary":"","types":["Context","Member","String","InstallOptions","Receipt","Integer"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-updatedependencies","kind":"function","line":465,"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":535,"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":542,"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":558,"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":565,"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":574,"name":"updateScopeMembers","qualifiedName":"Tey.Commands.updateScopeMembers","signatures":["updateScopeMembers(context: Context) -> [Member]"],"summary":"","types":["Context","[Member]"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-installtargetsselected","kind":"function","line":581,"name":"installTargetsSelected","qualifiedName":"Tey.Commands.installTargetsSelected","signatures":["installTargetsSelected(context: Context, packageName: String, force?: Bool = …) -> Integer"],"summary":"","types":["Context","String","Bool","Integer"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-installmembertargets","kind":"function","line":610,"name":"installMemberTargets","qualifiedName":"Tey.Commands.installMemberTargets","signatures":["installMemberTargets(member: Member, force?: Bool = …) -> Integer"],"summary":"Puts this package's `target(...)` executables where they can be run by name, and records them in the package's receipt (see Tey.Programs).\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.\n\nEvery name is checked before anything is built, so a refused install costs nothing and changes nothing.","types":["Member","Bool","Integer"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-installmembertargetsfrom","kind":"function","line":620,"name":"installMemberTargetsFrom","qualifiedName":"Tey.Commands.installMemberTargetsFrom","signatures":["installMemberTargetsFrom(member: Member, force?: Bool, origin: Receipt, selected: [String]) -> Integer"],"summary":"`installMemberTargets`, recording `origin`'s source fields in the receipt — a program built in a staging copy came from somewhere else.\n\n`selected` limits the targets installed (`--target`); empty means all.","types":["Member","Bool","Receipt","[String]","Integer"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-releasetarget","kind":"function","line":678,"name":"releaseTarget","qualifiedName":"Tey.Commands.releaseTarget","signatures":["releaseTarget(owner: String, name: String) -> Result<Void, String>"],"summary":"Drops `name` from `owner`'s receipt after another package took it over with `--force`; a receipt left owning nothing is removed.","types":["String","Result<Void, String>"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-recordinstall","kind":"function","line":696,"name":"recordInstall","qualifiedName":"Tey.Commands.recordInstall","signatures":["recordInstall(package: ManifestPackage, origin: Receipt, installed: [String], receipts: [Receipt], claims: [(String, Claim)]) -> Result<Void, String>"],"summary":"Writes the package's receipt and settles ownership around it: names taken over with `--force` leave the other package's receipt, and targets the previous receipt owned that this install no longer declares are removed from the bin directory rather than left behind unowned.","types":["ManifestPackage","Receipt","[String]","[Receipt]","[(String, Claim)]","Result<Void, String>"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-dependencyroots","kind":"function","line":744,"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-dependencyrootsat","kind":"function","line":752,"name":"dependencyRootsAt","qualifiedName":"Tey.Commands.dependencyRootsAt","signatures":["dependencyRootsAt(start: String) -> [String]"],"summary":"`dependencyRoots` for the workspace around `start` rather than around the working directory. A program being installed from a path is built in a staged copy while the user stands somewhere else entirely — possibly in another project, whose lockfile would otherwise supply the dependencies.","types":["String","[String]"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-sourcedirectoryat","kind":"function","line":820,"name":"sourceDirectoryAt","qualifiedName":"Tey.Commands.sourceDirectoryAt","signatures":["sourceDirectoryAt(packageRoot: String) -> String"],"summary":"The directory a package's module names are resolved against, relative to it: `src`, or the package itself when its package.kex names the folders at its top that hold modules (`sources([\"app\", \"config\", \"db\"])` — then `App.Models.User` is `./app/models/user.kex`). A manifest that cannot be read means `src`; every caller reports that in its own way soon enough.","types":["String"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-sourceunit","kind":"function","line":832,"name":"sourceUnit","qualifiedName":"Tey.Commands.sourceUnit","signatures":["sourceUnit(directory: String, path: String) -> String"],"summary":"A file of a package's source directory, as the compiler is to be given it: relative to the package. A root of \".\" adds nothing in front.","types":["String"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-sourceunit?","kind":"function","line":839,"name":"sourceUnit?","qualifiedName":"Tey.Commands.sourceUnit?","signatures":["sourceUnit?(path: String) -> Bool"],"summary":"Whether a file directly under the source directory is a module to compile. With the package itself as the root, its manifests sit there too, and are not modules.","types":["String","Bool"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-sourceroots","kind":"function","line":848,"name":"sourceRoots","qualifiedName":"Tey.Commands.sourceRoots","signatures":["sourceRoots : [String]"],"summary":"Every `--source-root` a compile of THIS package needs: its own source directory first (`src/`, or the package itself when it declares `sources`), 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":854,"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":865,"name":"librarySources","qualifiedName":"Tey.Commands.librarySources","signatures":["librarySources : [String]"],"summary":"A library's compilable units: every `.kex` directly under its source directory (`src/`, or the package's top when it declares `sources`). 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":882,"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":898,"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, `BEAM.*` 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":902,"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":937,"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-generate","kind":"function","line":975,"name":"generate","qualifiedName":"Tey.Commands.generate","signatures":["generate(arguments: [String]) -> Integer"],"summary":"The locked dependencies, then the programs Tey has installed. Outside a project there are no dependencies to show, so it is the programs alone rather than an error about a missing package.kex. `tey generate <namespace>:<generator> [--option value ...] [--force]`\n\nRuns a generator a direct dependency declares in its `plugin` block. The plugin is a child process: it is handed the invocation as one line of JSON on stdin and answers with the files it wants written, which Tey — not the plugin — then writes, inside the workspace and asking before it replaces anything (`--force` answers yes). The child itself runs in the operating system's sandbox: it cannot write outside scratch space or use the network (`--unconfined` lifts that, with a warning).","types":["[String]","Integer"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-plugincommand","kind":"function","line":983,"name":"pluginCommand","qualifiedName":"Tey.Commands.pluginCommand","signatures":["pluginCommand(arguments: [String]) -> Integer"],"summary":"`tey plugin <namespace>:<command> [--option value ...]`\n\nRuns a command a direct dependency declares in its `plugin` block, confined to what the plugin declared and the user approved.","types":["[String]","Integer"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-list","kind":"function","line":987,"name":"list","qualifiedName":"Tey.Commands.list","signatures":["list : Integer"],"summary":"","types":["Integer"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-listprograms","kind":"function","line":1008,"name":"listPrograms","qualifiedName":"Tey.Commands.listPrograms","signatures":["listPrograms(programs: [Receipt]) -> Void"],"summary":"","types":["[Receipt]","Void"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-build","kind":"function","line":1015,"name":"build","qualifiedName":"Tey.Commands.build","signatures":["build : Integer"],"summary":"","types":["Integer"],"urlPath":"tey/commands"},{"anchor":"function-tey-commands-buildselected","kind":"function","line":1027,"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":1047,"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":1089,"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":1100,"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":1108,"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":1114,"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":1136,"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":1175,"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":1188,"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":1204,"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":1230,"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>","commitId?(text: String) -> Bool"],"summary":"","types":["[String]","Result<ProcessResult, String>","String","Result<(String, String), String>","Result<[String], String>","Bool"],"urlPath":"tey/git"},{"anchor":"function-tey-git-execute","kind":"function","line":5,"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":15,"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":39,"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":"function-tey-git-commitid?","kind":"function","line":53,"name":"commitId?","qualifiedName":"Tey.Git.commitId?","signatures":["commitId?(text: String) -> Bool"],"summary":"A full hexadecimal commit id. A short one is left to `ls-remote`: it could as well be a ref name.","types":["String","Bool"],"urlPath":"tey/git"},{"anchor":"module-tey-host","kind":"module","line":1,"name":"Tey.Host","qualifiedName":"Tey.Host","signatures":["packageManager : String","installCommand(manager: String, packages: [String]) -> String?","librariesHint : String","gitHint : String"],"summary":"","types":["String","[String]","String?"],"urlPath":"tey/host"},{"anchor":"function-tey-host-packagemanager","kind":"function","line":13,"name":"packageManager","qualifiedName":"Tey.Host.packageManager","signatures":["packageManager : String"],"summary":"The machine Tey runs on, as far as telling someone how to fix it goes: which package manager installs what is missing. Tey never runs these commands — installing system packages needs privileges Tey should not ask for — it only prints the one line that does it, so the advice is exact rather than \"install GMP somehow\".\n\nThe package manager this system uses: \"brew\", \"apt\", \"dnf\", \"pacman\", or \"\" when it cannot be told. Linux is judged by /etc/os-release's ID plus everything ID_LIKE names, which is what gives Linux Mint and Pop!_OS Ubuntu's answer.","types":["String"],"urlPath":"tey/host"},{"anchor":"function-tey-host-installcommand","kind":"function","line":29,"name":"installCommand","qualifiedName":"Tey.Host.installCommand","signatures":["installCommand(manager: String, packages: [String]) -> String?"],"summary":"The command installing `packages` with this system's package manager, or None when there is no manager to name. Package names differ between managers, so the caller passes the right list for `packageManager`.","types":["String","[String]","String?"],"urlPath":"tey/host"},{"anchor":"function-tey-host-librarieshint","kind":"function","line":42,"name":"librariesHint","qualifiedName":"Tey.Host.librariesHint","signatures":["librariesHint : String"],"summary":"The shared libraries a released Kex binary loads: readline, GMP, PCRE2 and (on Linux) OpenSSL 3. Checked against each distro's own package names.","types":["String"],"urlPath":"tey/host"},{"anchor":"function-tey-host-githint","kind":"function","line":55,"name":"gitHint","qualifiedName":"Tey.Host.gitHint","signatures":["gitHint : String"],"summary":"Git: Tey lists Kex releases and fetches every Git dependency with it.","types":["String"],"urlPath":"tey/host"},{"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":["sourceFolder?(name: String) -> Bool","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]","Bool","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","[String]","[Dependency]","[Target]","[Command]","Toolchain?","ManifestWorkspace?","[Plugin]"],"urlPath":"tey/manifest"},{"anchor":"function-tey-manifest-sourcefolder?","kind":"function","line":130,"name":"sourceFolder?","qualifiedName":"Tey.Manifest.sourceFolder?","signatures":["sourceFolder?(name: String) -> Bool"],"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). Whether a name can be a source folder: one directory at the package's top, by its plain name. Not a path — its name is the first part of every module in it — and nothing hidden.","types":["String","Bool"],"urlPath":"tey/manifest"},{"anchor":"constant-tey-manifest-reservedcommands","kind":"constant","line":134,"name":"reservedCommands","qualifiedName":"Tey.Manifest.reservedCommands","signatures":[],"summary":"","types":["[String]"],"urlPath":"tey/manifest"},{"anchor":"function-tey-manifest-read","kind":"function","line":145,"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":362,"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":377,"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-programs","kind":"module","line":12,"name":"Tey.Programs","qualifiedName":"Tey.Programs","signatures":["pinnedReason(receipt: Receipt, options: InstallOptions) -> String?","directory : String","classify(argument: String) -> ProgramSource","buildDirectory(name: String) -> String","stagingDirectory : Result<String, String>","stage(root: String, destination: String) -> Result<Void, String>","copyInto(root: String, relative: String, destination: String) -> Bool","publishBuild(name: String, staged: String) -> Result<Void, String>","receiptPath(name: String) -> String","encode(receipt: Receipt) -> String","decode(text: String) -> Result<Receipt, String>","claim(target: String, packageName: String, receipts: [Receipt], exists?: Bool, teyBuilt?: Bool) -> Claim","refusal(target: String, claim: Claim, path: String, force?: Bool) -> String?","load(name: String) -> Receipt?","all : [Receipt]","save(receipt: Receipt) -> Result<Void, String>","remove(name: String) -> Bool","teyBuilt?(path: String) -> Bool","listLine(receipt: Receipt) -> String","pinText(receipt: Receipt) -> String"],"summary":"What Tey has put in `${TEY_HOME}/bin`, and who owns each file there.\n\nEvery package whose targets Tey installs gets a receipt at `${TEY_HOME}/programs/<name>/receipt.json`. The receipt is the only authority for ownership: a file in the bin directory that no receipt lists is not Tey's to overwrite or delete. Without one, a second package declaring the same target name silently replaced the first package's program, and nothing could say what a file in there was or where it had come from.\n\nKeyed by PACKAGE, not by binary: one package may install several targets, and reinstalling or removing it acts on all of them together.","types":["String","[String]","Bool","Receipt","InstallOptions","String?","ProgramSource","Result<String, String>","Result<Void, String>","Result<Receipt, String>","[Receipt]","Claim","Receipt?"],"urlPath":"tey/programs"},{"anchor":"record-tey-programs-receipt","kind":"record","line":16,"name":"Receipt","qualifiedName":"Tey.Programs.Receipt","signatures":[],"summary":"","types":["String","[String]"],"urlPath":"tey/programs"},{"anchor":"record-tey-programs-installoptions","kind":"record","line":49,"name":"InstallOptions","qualifiedName":"Tey.Programs.InstallOptions","signatures":[],"summary":"How `tey install <argument>` was asked to install a program: the workspace member (`--package`), the Git pin (`--tag`/`--branch`/`--ref`, \"ref\" of \"HEAD\" when none), which targets (`--target`, all when empty), whether to take over others' programs (`--force`), and whether to re-resolve rather than use the program's committed lock (`--fresh`).\n\n`pinned?` says a pin was given at all — reinstalling by name keeps the receipt's unless one is. `rebuild?` rebuilds even when nothing moved.","types":["String","Bool","[String]"],"urlPath":"tey/programs"},{"anchor":"function-tey-programs-pinnedreason","kind":"function","line":65,"name":"pinnedReason","qualifiedName":"Tey.Programs.pinnedReason","signatures":["pinnedReason(receipt: Receipt, options: InstallOptions) -> String?"],"summary":"Why reinstalling `receipt` by name has nothing to do, or None when it must be rebuilt. A tag or an exact commit is a pin the user chose: it stays, with a pointer at moving it. Pure, so the whole rule is testable.","types":["Receipt","InstallOptions","String?"],"urlPath":"tey/programs"},{"anchor":"type-tey-programs-programsource","kind":"type","line":74,"name":"ProgramSource","qualifiedName":"Tey.Programs.ProgramSource","signatures":[],"summary":"What `tey install <argument>` names. `tey add` is how a dependency is added, so an argument to `tey install` always means a program.","types":["String","String","String"],"urlPath":"tey/programs"},{"anchor":"type-tey-programs-claim","kind":"type","line":80,"name":"Claim","qualifiedName":"Tey.Programs.Claim","signatures":[],"summary":"What installing one target name would do to the bin directory.","types":["String"],"urlPath":"tey/programs"},{"anchor":"constant-tey-programs-reservednames","kind":"constant","line":91,"name":"reservedNames","qualifiedName":"Tey.Programs.reservedNames","signatures":[],"summary":"Names that are Tey's own and never a package's to take: the `kex` shim lives in this directory, and replacing it would change which compiler every shell runs.","types":["[String]"],"urlPath":"tey/programs"},{"anchor":"function-tey-programs-directory","kind":"function","line":93,"name":"directory","qualifiedName":"Tey.Programs.directory","signatures":["directory : String"],"summary":"","types":["String"],"urlPath":"tey/programs"},{"anchor":"function-tey-programs-classify","kind":"function","line":100,"name":"classify","qualifiedName":"Tey.Programs.classify","signatures":["classify(argument: String) -> ProgramSource"],"summary":"A path when it starts like one (`.`, `/`, `~`), a Git URL when it has a scheme or is scp-like (`git@host:owner/repo`), and otherwise the name of an installed program.","types":["String","ProgramSource"],"urlPath":"tey/programs"},{"anchor":"function-tey-programs-builddirectory","kind":"function","line":109,"name":"buildDirectory","qualifiedName":"Tey.Programs.buildDirectory","signatures":["buildDirectory(name: String) -> String"],"summary":"Where a program's staged build tree ends up once it is installed.","types":["String"],"urlPath":"tey/programs"},{"anchor":"function-tey-programs-stagingdirectory","kind":"function","line":116,"name":"stagingDirectory","qualifiedName":"Tey.Programs.stagingDirectory","signatures":["stagingDirectory : Result<String, String>"],"summary":"A fresh directory to build a program in before it is installed. Beside `programs/` rather than in it, so a half-built tree is never listed as a program, and on the same filesystem, so publishing it is a rename.","types":["Result<String, String>"],"urlPath":"tey/programs"},{"anchor":"function-tey-programs-stage","kind":"function","line":128,"name":"stage","qualifiedName":"Tey.Programs.stage","signatures":["stage(root: String, destination: String) -> Result<Void, String>"],"summary":"Copies the tree at `root` into `destination`: what a snapshot would hold, plus a committed `tey.lock` — the dependency versions the program's author tested, which a snapshot leaves out.","types":["String","Result<Void, String>"],"urlPath":"tey/programs"},{"anchor":"function-tey-programs-copyinto","kind":"function","line":140,"name":"copyInto","qualifiedName":"Tey.Programs.copyInto","signatures":["copyInto(root: String, relative: String, destination: String) -> Bool"],"summary":"","types":["String","Bool"],"urlPath":"tey/programs"},{"anchor":"function-tey-programs-publishbuild","kind":"function","line":152,"name":"publishBuild","qualifiedName":"Tey.Programs.publishBuild","signatures":["publishBuild(name: String, staged: String) -> Result<Void, String>"],"summary":"Replaces a program's build tree with the one it was just installed from. The old tree is moved aside first and removed last, so a failure part way leaves one of the two in place.","types":["String","Result<Void, String>"],"urlPath":"tey/programs"},{"anchor":"function-tey-programs-receiptpath","kind":"function","line":168,"name":"receiptPath","qualifiedName":"Tey.Programs.receiptPath","signatures":["receiptPath(name: String) -> String"],"summary":"","types":["String"],"urlPath":"tey/programs"},{"anchor":"function-tey-programs-encode","kind":"function","line":172,"name":"encode","qualifiedName":"Tey.Programs.encode","signatures":["encode(receipt: Receipt) -> String"],"summary":"","types":["Receipt","String"],"urlPath":"tey/programs"},{"anchor":"function-tey-programs-decode","kind":"function","line":187,"name":"decode","qualifiedName":"Tey.Programs.decode","signatures":["decode(text: String) -> Result<Receipt, String>"],"summary":"","types":["String","Result<Receipt, String>"],"urlPath":"tey/programs"},{"anchor":"function-tey-programs-claim","kind":"function","line":219,"name":"claim","qualifiedName":"Tey.Programs.claim","signatures":["claim(target: String, packageName: String, receipts: [Receipt], exists?: Bool, teyBuilt?: Bool) -> Claim"],"summary":"The decision for one target name, given every receipt and what is on disk. Pure, so the whole rule is testable without a bin directory.\n\n`teyBuilt?` covers the programs a project-local `tey install` put here before receipts existed: they are escripts Tey itself wrote, so taking them into a receipt loses nothing, where refusing would make every existing installation demand `--force` on its next reinstall.","types":["String","[Receipt]","Bool","Claim"],"urlPath":"tey/programs"},{"anchor":"function-tey-programs-refusal","kind":"function","line":240,"name":"refusal","qualifiedName":"Tey.Programs.refusal","signatures":["refusal(target: String, claim: Claim, path: String, force?: Bool) -> String?"],"summary":"Why a claim stops the install, or None when it may go ahead. `--force` takes a name over from another package or from an unowned file, but never from Tey itself.","types":["String","Claim","Bool","String?"],"urlPath":"tey/programs"},{"anchor":"function-tey-programs-load","kind":"function","line":249,"name":"load","qualifiedName":"Tey.Programs.load","signatures":["load(name: String) -> Receipt?"],"summary":"","types":["String","Receipt?"],"urlPath":"tey/programs"},{"anchor":"function-tey-programs-all","kind":"function","line":261,"name":"all","qualifiedName":"Tey.Programs.all","signatures":["all : [Receipt]"],"summary":"Every receipt, by package name. An unreadable one is reported rather than skipped silently: skipping it would make the files it owns look unowned.","types":["[Receipt]"],"urlPath":"tey/programs"},{"anchor":"function-tey-programs-save","kind":"function","line":280,"name":"save","qualifiedName":"Tey.Programs.save","signatures":["save(receipt: Receipt) -> Result<Void, String>"],"summary":"Written beside the final file and renamed into place, so a reader never sees half a receipt and a failed write leaves the previous one intact.","types":["Receipt","Result<Void, String>"],"urlPath":"tey/programs"},{"anchor":"function-tey-programs-remove","kind":"function","line":289,"name":"remove","qualifiedName":"Tey.Programs.remove","signatures":["remove(name: String) -> Bool"],"summary":"","types":["String","Bool"],"urlPath":"tey/programs"},{"anchor":"function-tey-programs-teybuilt?","kind":"function","line":296,"name":"teyBuilt?","qualifiedName":"Tey.Programs.teyBuilt?","signatures":["teyBuilt?(path: String) -> Bool"],"summary":"Whether `path` is an escript Tey's own target build wrote: its emulator line starts Kex's escript launcher, or names `kex_main` directly as an escript built before the launcher did.","types":["String","Bool"],"urlPath":"tey/programs"},{"anchor":"function-tey-programs-listline","kind":"function","line":310,"name":"listLine","qualifiedName":"Tey.Programs.listLine","signatures":["listLine(receipt: Receipt) -> String"],"summary":"The line `tey list` prints for one installed program.","types":["Receipt","String"],"urlPath":"tey/programs"},{"anchor":"function-tey-programs-pintext","kind":"function","line":318,"name":"pinText","qualifiedName":"Tey.Programs.pinText","signatures":["pinText(receipt: Receipt) -> String"],"summary":"`v0.4.0`, `main (3f9c1a2)`, or a short commit — what a Git install is pinned to, as `tey list` shows it.","types":["Receipt","String"],"urlPath":"tey/programs"},{"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-sandbox","kind":"module","line":1,"name":"Tey.Sandbox","qualifiedName":"Tey.Sandbox","signatures":["available? : Bool","scratch : [String]","profile(limits: Limits, home: String) -> String","prefix(limits: Limits) -> Result<([String], String), String>"],"summary":"","types":["[String]","Bool","","Limits","String","Result<([String], String), String>"],"urlPath":"tey/sandbox"},{"anchor":"record-tey-sandbox-limits","kind":"record","line":21,"name":"Limits","qualifiedName":"Tey.Sandbox.Limits","signatures":[],"summary":"What a plugin process is allowed to do beyond reading files and computing.\n\nA plugin is code from a dependency, run on the user's machine. Approval says the user accepts what the plugin *asked* for; this is what makes the answer true, by running the child inside the operating system's sandbox:\n\n- it can write only under `writable` (always the temporary directories and\n  the Kex cache, which compiling and running its entrypoint need);\n- it can use the network only when `network?`;\n- it cannot read the places credentials are usually kept.\n\nEverything the child starts inherits the same limits.\n\nWhat this does NOT do, and must not be mistaken for: `Process.Run([...])` is not enforced — the child can start any program, though that program is held to the same limits — and `Net.Connect([...])` opens the network as a whole rather than to the listed hosts, because the sandbox filters by address and not by name.","types":["[String]","Bool"],"urlPath":"tey/sandbox"},{"anchor":"constant-tey-sandbox-tool","kind":"constant","line":29,"name":"TOOL","qualifiedName":"Tey.Sandbox.TOOL","signatures":[],"summary":"macOS's `sandbox-exec`. The only mechanism supported so far; on any other system `available?` is false and the caller has to refuse or be told to run unconfined.","types":[""],"urlPath":"tey/sandbox"},{"anchor":"function-tey-sandbox-available?","kind":"function","line":31,"name":"available?","qualifiedName":"Tey.Sandbox.available?","signatures":["available? : Bool"],"summary":"","types":["Bool"],"urlPath":"tey/sandbox"},{"anchor":"function-tey-sandbox-scratch","kind":"function","line":37,"name":"scratch","qualifiedName":"Tey.Sandbox.scratch","signatures":["scratch : [String]"],"summary":"The directories a Kex child always needs to write to: where the compiler puts its scratch files and its run cache.","types":["[String]"],"urlPath":"tey/sandbox"},{"anchor":"function-tey-sandbox-profile","kind":"function","line":52,"name":"profile","qualifiedName":"Tey.Sandbox.profile","signatures":["profile(limits: Limits, home: String) -> String"],"summary":"The sandbox profile for `limits`. Later rules win, so: allow by default, deny the dangerous classes, then allow back the exceptions.","types":["Limits","String"],"urlPath":"tey/sandbox"},{"anchor":"function-tey-sandbox-prefix","kind":"function","line":72,"name":"prefix","qualifiedName":"Tey.Sandbox.prefix","signatures":["prefix(limits: Limits) -> Result<([String], String), String>"],"summary":"The words to put in front of a command line to run it under `limits`: `sandbox-exec -f <profile file>`. The profile file is left for the caller to delete once the child has exited.","types":["Limits","Result<([String], String), String>"],"urlPath":"tey/sandbox"},{"anchor":"module-tey-selfupdate","kind":"module","line":1,"name":"Tey.SelfUpdate","qualifiedName":"Tey.SelfUpdate","signatures":["currentPrefix : String?","installEbin : 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?","installedVersion(prefix: String) -> String","upgradeLatest(includePre: Bool) -> Result<UpgradeOutcome, String>","upgradePinned(version: String) -> Result<UpgradeOutcome, String>","installPaired(kexVersion: String) -> Result<String?, String>"],"summary":"","types":["String","String?","Bool","Ordering","[String]","","Result<UpgradeOutcome, String>","Result<String?, 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-installebin","kind":"function","line":36,"name":"installEbin","qualifiedName":"Tey.SelfUpdate.installEbin","signatures":["installEbin : String?"],"summary":"The launcher's own runtime directory. TEY_EBIN can instead name the Tey paired with the selected Kex (see `installPaired`), which is not an install to upgrade — TEY_INSTALL_EBIN always names the launcher's.","types":["String?"],"urlPath":"tey/self_update"},{"anchor":"function-tey-selfupdate-prefixof","kind":"function","line":46,"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":55,"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":62,"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":81,"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":92,"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":110,"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":"constant-tey-selfupdate-firstselfupgrading","kind":"constant","line":119,"name":"firstSelfUpgrading","qualifiedName":"Tey.SelfUpdate.firstSelfUpgrading","signatures":[],"summary":"The oldest Tey with an `upgrade` command. Pinning an older one would strand the install — 0.2.0 cannot run `tey upgrade` to come back — so it is refused, with the installer as the deliberate way there.","types":[""],"urlPath":"tey/self_update"},{"anchor":"function-tey-selfupdate-installedversion","kind":"function","line":128,"name":"installedVersion","qualifiedName":"Tey.SelfUpdate.installedVersion","signatures":["installedVersion(prefix: String) -> String"],"summary":"The version of the Tey installed at `prefix`, which is not always the one running: with a Kex selected whose own Tey is unpacked beside it (see `installPaired`), the launcher runs that one instead. Comparing the running version against a release then answers \"already the newest\" while the install itself stays old. The installed launcher is asked directly, pointed at its own runtime; if that cannot be read, the running version is the answer — the behaviour before, and never a reason to downgrade.","types":["String"],"urlPath":"tey/self_update"},{"anchor":"function-tey-selfupdate-upgradelatest","kind":"function","line":146,"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":169,"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":"function-tey-selfupdate-installpaired","kind":"function","line":198,"name":"installPaired","qualifiedName":"Tey.SelfUpdate.installPaired","signatures":["installPaired(kexVersion: String) -> Result<String?, String>"],"summary":"The Tey a Kex release ships, unpacked beside that toolchain so `bin/tey` runs it whenever that Kex is selected: Kex and Tey are developed and released as a pair, and a pre-release is only tested properly as that pair. Nothing installed is replaced — not even a Homebrew keg — which is what makes this safe to do on every `tey kex install`.\n\nThe answer is the Tey version unpacked, or None when it was already there: tags do not move, so neither does what they carry.","types":["String","Result<String?, 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>","sourceFiles(root: String) -> [String]","contentDigest(root: String) -> Result<String, String>"],"summary":"","types":["String","Result<Tey.Lockfile.Dependency, String>","Tey.Lockfile.Dependency","Result<String, 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":"function-tey-snapshot-sourcefiles","kind":"function","line":61,"name":"sourceFiles","qualifiedName":"Tey.Snapshot.sourceFiles","signatures":["sourceFiles(root: String) -> [String]"],"summary":"The files a snapshot of `root` holds, relative to it: everything but VCS metadata, build output and `.teyignore` matches.","types":["String","[String]"],"urlPath":"tey/snapshot"},{"anchor":"function-tey-snapshot-contentdigest","kind":"function","line":66,"name":"contentDigest","qualifiedName":"Tey.Snapshot.contentDigest","signatures":["contentDigest(root: String) -> Result<String, String>"],"summary":"The content digest a snapshot of `root` is published under.","types":["String","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","pairedTeyEbin(version: String) -> String","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","startupProblem(prefix: String) -> String?","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.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":62,"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":66,"name":"installed?","qualifiedName":"Tey.Toolchain.installed?","signatures":["installed?(version: String) -> Bool"],"summary":"","types":["String","Bool"],"urlPath":"tey/toolchain"},{"anchor":"function-tey-toolchain-pairedteyebin","kind":"function","line":74,"name":"pairedTeyEbin","qualifiedName":"Tey.Toolchain.pairedTeyEbin","signatures":["pairedTeyEbin(version: String) -> String"],"summary":"Where the Tey released with a Kex version lives — `bin/tey` reads the same path. Beside the toolchain rather than inside it: reinstalling a Kex replaces its whole directory, and a Tey running from there would lose its modules mid-run.","types":["String"],"urlPath":"tey/toolchain"},{"anchor":"function-tey-toolchain-availableversions","kind":"function","line":80,"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":92,"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":99,"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":110,"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":118,"name":"installedKex","qualifiedName":"Tey.Toolchain.installedKex","signatures":["installedKex : String?"],"summary":"","types":["String?"],"urlPath":"tey/toolchain"},{"anchor":"function-tey-toolchain-bundled","kind":"function","line":136,"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":146,"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":161,"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":176,"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":191,"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":202,"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":214,"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":221,"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":262,"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":270,"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":286,"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":303,"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":314,"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":324,"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-startupproblem","kind":"function","line":344,"name":"startupProblem","qualifiedName":"Tey.Toolchain.startupProblem","signatures":["startupProblem(prefix: 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. Why an installed toolchain's `kex` cannot start on this machine, or None when it runs. A release archive is a prebuilt binary that loads readline, GMP, PCRE2 and OpenSSL from the system (and needs glibc 2.38+ on Linux); \"installed\" followed by a loader error on the first `kex` is the worst way to learn one of those is missing.","types":["String","String?"],"urlPath":"tey/toolchain"},{"anchor":"function-tey-toolchain-installrelease","kind":"function","line":355,"name":"installRelease","qualifiedName":"Tey.Toolchain.installRelease","signatures":["installRelease(version: String) -> Result<String, String>"],"summary":"","types":["String","Result<String, String>"],"urlPath":"tey/toolchain"},{"anchor":"type-tey-toolchain-archivefailure","kind":"type","line":378,"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","String"],"urlPath":"tey/toolchain"},{"anchor":"function-tey-toolchain-releasebase","kind":"function","line":385,"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":398,"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":409,"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":451,"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":469,"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":501,"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":520,"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":535,"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":550,"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":559,"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":568,"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-version","kind":"module","line":2,"name":"Tey.Version","qualifiedName":"Tey.Version","signatures":[],"summary":"GENERATED by tey/Makefile from tey/package.kex — do not edit.","types":["String"],"urlPath":"tey/version"},{"anchor":"constant-tey-version-number","kind":"constant","line":5,"name":"number","qualifiedName":"Tey.Version.number","signatures":[],"summary":"Tey's own version, as declared by package.kex's version(...) line.","types":["String"],"urlPath":"tey/version"},{"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":9,"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":10,"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","strict(parsed: OptionParser.ParsedOptions) -> Bool","printUsage : Integer","outputsHelp : String"],"summary":"","types":["OptionParser.OptionConfig","[String]","Integer","OptionParser.ParsedOptions","Bool","String"],"urlPath":"tey/docgen/cli"},{"anchor":"function-tey-docgen-cli-options","kind":"function","line":25,"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.\n\nThe three subcommands are declared here, the way Tey declares its own, so `tey docs` help is generated from the same definitions that parse the line and reads like `tey help` does.","types":["OptionParser.OptionConfig"],"urlPath":"tey/docgen/cli"},{"anchor":"function-tey-docgen-cli-dispatch","kind":"function","line":53,"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-strict","kind":"function","line":63,"name":"strict","qualifiedName":"Tey.Docgen.Cli.strict","signatures":["strict(parsed: OptionParser.ParsedOptions) -> Bool"],"summary":"After a command word, OptionParser hands an option it does not know on to the command as an argument, for commands with a vocabulary of their own. These three have none beyond the options above, so one left over is a typo — and `--sorce src` silently documenting the wrong directory is worse than an error.","types":["OptionParser.ParsedOptions","Bool"],"urlPath":"tey/docgen/cli"},{"anchor":"function-tey-docgen-cli-printusage","kind":"function","line":76,"name":"printUsage","qualifiedName":"Tey.Docgen.Cli.printUsage","signatures":["printUsage : Integer"],"summary":"The generated help, then what a build leaves behind — the one part of this command's story that no option or subcommand declares.","types":["Integer"],"urlPath":"tey/docgen/cli"},{"anchor":"function-tey-docgen-cli-outputshelp","kind":"function","line":83,"name":"outputsHelp","qualifiedName":"Tey.Docgen.Cli.outputsHelp","signatures":["outputsHelp : String"],"summary":"Styled like OptionParser's own blocks: a bold heading, then one aligned row per entry, padded on the unstyled name.","types":["String"],"urlPath":"tey/docgen/cli"},{"anchor":"module-tey-docgen-css","kind":"module","line":11,"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":12,"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], header: String) -> SourcePage","detachHeader(items: [Kex.AST.Node], header: String) -> [Kex.AST.Node]","withoutHeader(item: Kex.AST.Node, header: String) -> Kex.AST.Node","docOf(item: Kex.AST.Node) -> String?","withDoc(item: Kex.AST.Node, doc: String?) -> Kex.AST.Node","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]","mergeMakes(entities: [Entity]) -> [Entity]","sameMakeTarget?(e: Entity, target: String) -> Bool","absorbMake(e: Entity, later: MakeEntry) -> 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, receiverMethods: Bool) -> [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, lists: [[ParamSig]]) -> Pending","findPending(accum: [Pending], name: String) -> Integer?","indexedFind(accum: [Pending], name: String, index: Integer) -> Integer?","finalizeFunction(fn: PendingFunction) -> FunctionEntry","declaredReturn(fn: PendingFunction) -> String","finalResult(ref: Kex.AST.TypeRef) -> Kex.AST.TypeRef","docReturnType(doc: Doc) -> String","functionTypes(fn: PendingFunction) -> [String]","annotationTypes(info: Kex.AST.AnnotationInfo, paramLists: [[ParamSig]]) -> [String]","signatureTexts(fn: PendingFunction) -> [String]","plainSignature(fn: PendingFunction, params: [ParamSig]) -> String","renderSignature(info: Kex.AST.AnnotationInfo, fn: PendingFunction) -> String","docNamedSignature(name: String, ref: Kex.AST.TypeRef, doc: Doc) -> String","paramText(name: String, typeName: String, hasDefault: Bool) -> String","parenthesized(typeName: String) -> String","displayName(p: ParamSig, index: Integer, doc: Doc) -> String","docParamType(doc: Doc, name: String) -> String","bestParams(lists: [[ParamSig]]) -> [ParamSig]?","namedCount(list: [ParamSig]) -> Integer","withPeerType(p: ParamSig, index: Integer, peers: [[ParamSig]]) -> ParamSig","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: [[ParamSig]]) -> [ParamSig]?","matchingParamLists(ref: Kex.AST.TypeRef, paramLists: [[ParamSig]]) -> [[ParamSig]]","paramsMatch(ref: Kex.AST.TypeRef, names: [ParamSig]) -> Bool","flattenToArity(ref: Kex.AST.TypeRef, arity: Integer) -> Kex.AST.TypeRef","clauseParams(clause: Kex.AST.ClauseInfo) -> [ParamSig]","paramSig(p: Kex.AST.ParamInfo) -> ParamSig","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","Kex.AST.Node","String?","ModuleEntry","Bool","Entity","PendingFunction","[Kex.AST.AnnotationInfo]","[[ParamSig]]","Integer","Doc","[Pending]","MakeEntry","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","Integer?","FunctionEntry","Kex.AST.TypeRef","[String]","[ParamSig]","ParamSig","[ParamSig]?","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":24,"name":"pageFor","qualifiedName":"Tey.Docgen.Extract.pageFor","signatures":["pageFor(source: String, items: [Kex.AST.Node], header: String) -> SourcePage"],"summary":"`header` is the file's opening comment when a blank line separates it from what follows (Index.fileHeader). The AST reader attaches every comment above a declaration to it, blank lines and all, so the first declaration's doc arrives with the file's introduction glued on top — algebra.kex's \"Algebraic structures: ...\" read as the summary of `Monoid`. The header is cut off that doc here and kept as the page's own intro.","types":["String","[Kex.AST.Node]","SourcePage"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-detachheader","kind":"function","line":37,"name":"detachHeader","qualifiedName":"Tey.Docgen.Extract.detachHeader","signatures":["detachHeader(items: [Kex.AST.Node], header: String) -> [Kex.AST.Node]"],"summary":"The items with the header removed from the first documented one.","types":["[Kex.AST.Node]","String"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-withoutheader","kind":"function","line":47,"name":"withoutHeader","qualifiedName":"Tey.Docgen.Extract.withoutHeader","signatures":["withoutHeader(item: Kex.AST.Node, header: String) -> Kex.AST.Node"],"summary":"","types":["Kex.AST.Node","String"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-docof","kind":"function","line":57,"name":"docOf","qualifiedName":"Tey.Docgen.Extract.docOf","signatures":["docOf(item: Kex.AST.Node) -> String?"],"summary":"","types":["Kex.AST.Node","String?"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-withdoc","kind":"function","line":71,"name":"withDoc","qualifiedName":"Tey.Docgen.Extract.withDoc","signatures":["withDoc(item: Kex.AST.Node, doc: String?) -> Kex.AST.Node"],"summary":"","types":["Kex.AST.Node","String?"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-pagetitle","kind":"function","line":89,"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":125,"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":137,"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":145,"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":149,"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":157,"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":161,"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":166,"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":170,"name":"PendingFunction","qualifiedName":"Tey.Docgen.Extract.PendingFunction","signatures":[],"summary":"","types":["String","[Kex.AST.AnnotationInfo]","[[ParamSig]]","Integer","Doc"],"urlPath":"tey/docgen/extract"},{"anchor":"record-tey-docgen-extract-paramsig","kind":"record","line":185,"name":"ParamSig","qualifiedName":"Tey.Docgen.Extract.ParamSig","signatures":[],"summary":"One parameter as a clause declares it. `named` is false for a pattern parameter (`let repeat(0) = ...`), whose spelling is a value, not a name a signature should show.","types":["String","Bool"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-bodyentities","kind":"function","line":192,"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":210,"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-mergemakes","kind":"function","line":217,"name":"mergeMakes","qualifiedName":"Tey.Docgen.Extract.mergeMakes","signatures":["mergeMakes(entities: [Entity]) -> [Entity]"],"summary":"Two `make Queue<A>` blocks in one file (one for the collection traits, one for Blankable) are one set of methods to a reader: the later block folds into the first, traits and members appended.","types":["[Entity]"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-samemaketarget?","kind":"function","line":229,"name":"sameMakeTarget?","qualifiedName":"Tey.Docgen.Extract.sameMakeTarget?","signatures":["sameMakeTarget?(e: Entity, target: String) -> Bool"],"summary":"","types":["Entity","String","Bool"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-absorbmake","kind":"function","line":236,"name":"absorbMake","qualifiedName":"Tey.Docgen.Extract.absorbMake","signatures":["absorbMake(e: Entity, later: MakeEntry) -> Entity"],"summary":"","types":["Entity","MakeEntry"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-finalizeone","kind":"function","line":250,"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":257,"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":275,"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":279,"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":292,"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":303,"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":316,"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":327,"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":337,"name":"functionEntries","qualifiedName":"Tey.Docgen.Extract.functionEntries","signatures":["functionEntries(body: [Kex.AST.Node], prefix: String, receiverMethods: Bool) -> [FunctionEntry]"],"summary":"","types":["[Kex.AST.Node]","String","Bool","[FunctionEntry]"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-noteannotation","kind":"function","line":357,"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":372,"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":397,"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":426,"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":436,"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":451,"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":493,"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":503,"name":"addClause","qualifiedName":"Tey.Docgen.Extract.addClause","signatures":["addClause(p: Pending, info: Kex.AST.FunctionInfo, lists: [[ParamSig]]) -> Pending"],"summary":"","types":["Pending","Kex.AST.FunctionInfo","[[ParamSig]]"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-findpending","kind":"function","line":530,"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":534,"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":545,"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-declaredreturn","kind":"function","line":561,"name":"declaredReturn","qualifiedName":"Tey.Docgen.Extract.declaredReturn","signatures":["declaredReturn(fn: PendingFunction) -> String"],"summary":"The one return type the source commits to: the annotation's result, or the inline `-> T` of an unannotated clause. What the @return tag says is checked against this (Index.reportDocDrift), never shown instead of it.","types":["PendingFunction","String"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-finalresult","kind":"function","line":579,"name":"finalResult","qualifiedName":"Tey.Docgen.Extract.finalResult","signatures":["finalResult(ref: Kex.AST.TypeRef) -> Kex.AST.TypeRef"],"summary":"What a curried type finally answers: `A -> (A -> T -> A) -> A` is A.","types":["Kex.AST.TypeRef"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-docreturntype","kind":"function","line":586,"name":"docReturnType","qualifiedName":"Tey.Docgen.Extract.docReturnType","signatures":["docReturnType(doc: Doc) -> String"],"summary":"","types":["Doc","String"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-functiontypes","kind":"function","line":596,"name":"functionTypes","qualifiedName":"Tey.Docgen.Extract.functionTypes","signatures":["functionTypes(fn: PendingFunction) -> [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":["PendingFunction","[String]"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-annotationtypes","kind":"function","line":603,"name":"annotationTypes","qualifiedName":"Tey.Docgen.Extract.annotationTypes","signatures":["annotationTypes(info: Kex.AST.AnnotationInfo, paramLists: [[ParamSig]]) -> [String]"],"summary":"","types":["Kex.AST.AnnotationInfo","[[ParamSig]]","[String]"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-signaturetexts","kind":"function","line":626,"name":"signatureTexts","qualifiedName":"Tey.Docgen.Extract.signatureTexts","signatures":["signatureTexts(fn: PendingFunction) -> [String]"],"summary":"A signature names every parameter WITH its type and ends in the result: `and(a: Integer, b: Integer) -> Integer`. The names come from a clause, the types from the annotation (flattened to the clause's arity), from the clause's own inline annotations, or — for a method nobody annotated — from its @param/@return tags. A zero-parameter member reads as the property it looks like at the call site (`sum : Number`). A method with no clause at all (a trait's required method) has only its type, and borrows parameter names from its @param tags when they line up.","types":["PendingFunction","[String]"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-plainsignature","kind":"function","line":638,"name":"plainSignature","qualifiedName":"Tey.Docgen.Extract.plainSignature","signatures":["plainSignature(fn: PendingFunction, params: [ParamSig]) -> String"],"summary":"A signature built from the clause alone: inline types first, the doc tags as the fallback, bare names when neither says.","types":["PendingFunction","[ParamSig]","String"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-rendersignature","kind":"function","line":651,"name":"renderSignature","qualifiedName":"Tey.Docgen.Extract.renderSignature","signatures":["renderSignature(info: Kex.AST.AnnotationInfo, fn: PendingFunction) -> String"],"summary":"","types":["Kex.AST.AnnotationInfo","PendingFunction","String"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-docnamedsignature","kind":"function","line":674,"name":"docNamedSignature","qualifiedName":"Tey.Docgen.Extract.docNamedSignature","signatures":["docNamedSignature(name: String, ref: Kex.AST.TypeRef, doc: Doc) -> String"],"summary":"An annotation with no clause to take names from: the @param tags name the parameters when there are exactly as many as the type has.","types":["String","Kex.AST.TypeRef","Doc"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-paramtext","kind":"function","line":690,"name":"paramText","qualifiedName":"Tey.Docgen.Extract.paramText","signatures":["paramText(name: String, typeName: String, hasDefault: Bool) -> String"],"summary":"","types":["String","Bool"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-parenthesized","kind":"function","line":697,"name":"parenthesized","qualifiedName":"Tey.Docgen.Extract.parenthesized","signatures":["parenthesized(typeName: String) -> String"],"summary":"A function type inside a parameter list reads as the parameter's type only in parentheses: `f: (T -> Void)`, not `f: T -> Void`.","types":["String"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-displayname","kind":"function","line":704,"name":"displayName","qualifiedName":"Tey.Docgen.Extract.displayName","signatures":["displayName(p: ParamSig, index: Integer, doc: Doc) -> String"],"summary":"A pattern parameter (`repeat(0)`) shows the name its @param tag gives that position, or `_` — never the literal, which reads as an argument.","types":["ParamSig","Integer","Doc","String"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-docparamtype","kind":"function","line":712,"name":"docParamType","qualifiedName":"Tey.Docgen.Extract.docParamType","signatures":["docParamType(doc: Doc, name: String) -> String"],"summary":"","types":["Doc","String"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-bestparams","kind":"function","line":722,"name":"bestParams","qualifiedName":"Tey.Docgen.Extract.bestParams","signatures":["bestParams(lists: [[ParamSig]]) -> [ParamSig]?"],"summary":"Of several clauses' parameter lists, the one that names the most parameters — `repeat(n: Integer)` over `repeat(0)` — merged with the types the other clauses of the same arity declare.","types":["[[ParamSig]]","[ParamSig]?"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-namedcount","kind":"function","line":733,"name":"namedCount","qualifiedName":"Tey.Docgen.Extract.namedCount","signatures":["namedCount(list: [ParamSig]) -> Integer"],"summary":"","types":["[ParamSig]","Integer"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-withpeertype","kind":"function","line":737,"name":"withPeerType","qualifiedName":"Tey.Docgen.Extract.withPeerType","signatures":["withPeerType(p: ParamSig, index: Integer, peers: [[ParamSig]]) -> ParamSig"],"summary":"","types":["ParamSig","Integer","[[ParamSig]]"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-signaturetypetext","kind":"function","line":751,"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":759,"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":766,"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":772,"name":"matchingParamList","qualifiedName":"Tey.Docgen.Extract.matchingParamList","signatures":["matchingParamList(ref: Kex.AST.TypeRef, paramLists: [[ParamSig]]) -> [ParamSig]?"],"summary":"","types":["Kex.AST.TypeRef","[[ParamSig]]","[ParamSig]?"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-matchingparamlists","kind":"function","line":776,"name":"matchingParamLists","qualifiedName":"Tey.Docgen.Extract.matchingParamLists","signatures":["matchingParamLists(ref: Kex.AST.TypeRef, paramLists: [[ParamSig]]) -> [[ParamSig]]"],"summary":"","types":["Kex.AST.TypeRef","[[ParamSig]]"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-paramsmatch","kind":"function","line":780,"name":"paramsMatch","qualifiedName":"Tey.Docgen.Extract.paramsMatch","signatures":["paramsMatch(ref: Kex.AST.TypeRef, names: [ParamSig]) -> Bool"],"summary":"","types":["Kex.AST.TypeRef","[ParamSig]","Bool"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-flattentoarity","kind":"function","line":790,"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-clauseparams","kind":"function","line":807,"name":"clauseParams","qualifiedName":"Tey.Docgen.Extract.clauseParams","signatures":["clauseParams(clause: Kex.AST.ClauseInfo) -> [ParamSig]"],"summary":"`type` is a keyword after `.`, so typed-record access goes through pattern matching instead.","types":["Kex.AST.ClauseInfo","[ParamSig]"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-paramsig","kind":"function","line":811,"name":"paramSig","qualifiedName":"Tey.Docgen.Extract.paramSig","signatures":["paramSig(p: Kex.AST.ParamInfo) -> ParamSig"],"summary":"","types":["Kex.AST.ParamInfo","ParamSig"],"urlPath":"tey/docgen/extract"},{"anchor":"function-tey-docgen-extract-paramname","kind":"function","line":823,"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":831,"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":838,"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":844,"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":848,"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":858,"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":865,"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":870,"name":"titleCase","qualifiedName":"Tey.Docgen.Extract.titleCase","signatures":["titleCase(s: String) -> String"],"summary":"","types":["String"],"urlPath":"tey/docgen/extract"},{"anchor":"module-tey-docgen-fragments","kind":"module","line":22,"name":"Tey.Docgen.Fragments","qualifiedName":"Tey.Docgen.Fragments","signatures":["write(pages: [SourcePage], versionDir: String, model: PackageModel) -> Integer","writePage(page: SourcePage, versionDir: String, model: PackageModel) -> ()","unitData(model: PackageModel, source: String, toc: [TocEntry]) -> Any","tocValue(t: TocEntry) -> Any","tocHtml(toc: [TocEntry]) -> String","unitRoot(model: PackageModel) -> String","pageUrl(model: PackageModel, urlPath: String) -> String","navTree(pages: [SourcePage], model: PackageModel) -> Any","navNode(page: SourcePage, pages: [SourcePage], model: PackageModel) -> Any","tocOf(entities: [Entity]) -> [TocEntry]","tocAt(entities: [Entity], nested: Bool) -> [TocEntry]","tocTitle(e: Entity) -> String","descriptionOf(page: SourcePage) -> String","summaryOf(e: Entity) -> String","absolutize(html: String, model: PackageModel, urlPath: String) -> String","sitePath(href: String, base: [String]) -> String","normalize(base: [String], rel: [String]) -> [String]"],"summary":"","types":["[SourcePage]","String","PackageModel","Integer","SourcePage","()","[TocEntry]","Any","Bool","TocEntry","[Entity]","Entity","[String]"],"urlPath":"tey/docgen/fragments"},{"anchor":"function-tey-docgen-fragments-write","kind":"function","line":25,"name":"write","qualifiedName":"Tey.Docgen.Fragments.write","signatures":["write(pages: [SourcePage], versionDir: String, model: PackageModel) -> Integer"],"summary":"","types":["[SourcePage]","String","PackageModel","Integer"],"urlPath":"tey/docgen/fragments"},{"anchor":"function-tey-docgen-fragments-writepage","kind":"function","line":41,"name":"writePage","qualifiedName":"Tey.Docgen.Fragments.writePage","signatures":["writePage(page: SourcePage, versionDir: String, model: PackageModel) -> ()"],"summary":"","types":["SourcePage","String","PackageModel","()"],"urlPath":"tey/docgen/fragments"},{"anchor":"function-tey-docgen-fragments-unitdata","kind":"function","line":60,"name":"unitData","qualifiedName":"Tey.Docgen.Fragments.unitData","signatures":["unitData(model: PackageModel, source: String, toc: [TocEntry]) -> Any"],"summary":"Everything a theme might show beside the body: which unit and version this is (the header badge), where the source lives, and the page's sections for an \"On this page\" list.","types":["PackageModel","String","[TocEntry]","Any"],"urlPath":"tey/docgen/fragments"},{"anchor":"record-tey-docgen-fragments-tocentry","kind":"record","line":72,"name":"TocEntry","qualifiedName":"Tey.Docgen.Fragments.TocEntry","signatures":[],"summary":"","types":["String","Bool"],"urlPath":"tey/docgen/fragments"},{"anchor":"function-tey-docgen-fragments-tocvalue","kind":"function","line":79,"name":"tocValue","qualifiedName":"Tey.Docgen.Fragments.tocValue","signatures":["tocValue(t: TocEntry) -> Any"],"summary":"","types":["TocEntry","Any"],"urlPath":"tey/docgen/fragments"},{"anchor":"function-tey-docgen-fragments-tochtml","kind":"function","line":87,"name":"tocHtml","qualifiedName":"Tey.Docgen.Fragments.tocHtml","signatures":["tocHtml(toc: [TocEntry]) -> String"],"summary":"The rail as markup too, so a theme template can place it without walking JSON: a template language that sees the data as `Any` cannot iterate it. A page with a single section has nothing to navigate.","types":["[TocEntry]","String"],"urlPath":"tey/docgen/fragments"},{"anchor":"function-tey-docgen-fragments-unitroot","kind":"function","line":97,"name":"unitRoot","qualifiedName":"Tey.Docgen.Fragments.unitRoot","signatures":["unitRoot(model: PackageModel) -> String"],"summary":"\"/prelude/0.4.0/\": where the unit is mounted.","types":["PackageModel","String"],"urlPath":"tey/docgen/fragments"},{"anchor":"function-tey-docgen-fragments-pageurl","kind":"function","line":101,"name":"pageUrl","qualifiedName":"Tey.Docgen.Fragments.pageUrl","signatures":["pageUrl(model: PackageModel, urlPath: String) -> String"],"summary":"","types":["PackageModel","String"],"urlPath":"tey/docgen/fragments"},{"anchor":"function-tey-docgen-fragments-navtree","kind":"function","line":107,"name":"navTree","qualifiedName":"Tey.Docgen.Fragments.navTree","signatures":["navTree(pages: [SourcePage], model: PackageModel) -> Any"],"summary":"The page tree, nested the way the standalone sidebar nests it: a module family (Net, Net.DNS, Net.HTTP) is one branch.","types":["[SourcePage]","PackageModel","Any"],"urlPath":"tey/docgen/fragments"},{"anchor":"function-tey-docgen-fragments-navnode","kind":"function","line":113,"name":"navNode","qualifiedName":"Tey.Docgen.Fragments.navNode","signatures":["navNode(page: SourcePage, pages: [SourcePage], model: PackageModel) -> Any"],"summary":"","types":["SourcePage","[SourcePage]","PackageModel","Any"],"urlPath":"tey/docgen/fragments"},{"anchor":"function-tey-docgen-fragments-tocof","kind":"function","line":121,"name":"tocOf","qualifiedName":"Tey.Docgen.Fragments.tocOf","signatures":["tocOf(entities: [Entity]) -> [TocEntry]"],"summary":"The sections a reader can jump to, in page order: each declaration with a section of its own, and those a module declares.","types":["[Entity]","[TocEntry]"],"urlPath":"tey/docgen/fragments"},{"anchor":"function-tey-docgen-fragments-tocat","kind":"function","line":125,"name":"tocAt","qualifiedName":"Tey.Docgen.Fragments.tocAt","signatures":["tocAt(entities: [Entity], nested: Bool) -> [TocEntry]"],"summary":"","types":["[Entity]","Bool","[TocEntry]"],"urlPath":"tey/docgen/fragments"},{"anchor":"function-tey-docgen-fragments-toctitle","kind":"function","line":135,"name":"tocTitle","qualifiedName":"Tey.Docgen.Fragments.tocTitle","signatures":["tocTitle(e: Entity) -> String"],"summary":"","types":["Entity","String"],"urlPath":"tey/docgen/fragments"},{"anchor":"function-tey-docgen-fragments-descriptionof","kind":"function","line":144,"name":"descriptionOf","qualifiedName":"Tey.Docgen.Fragments.descriptionOf","signatures":["descriptionOf(page: SourcePage) -> String"],"summary":"One sentence for the page's <meta name=\"description\">: the file's intro, else what its first declaration says, else its title.","types":["SourcePage","String"],"urlPath":"tey/docgen/fragments"},{"anchor":"function-tey-docgen-fragments-summaryof","kind":"function","line":151,"name":"summaryOf","qualifiedName":"Tey.Docgen.Fragments.summaryOf","signatures":["summaryOf(e: Entity) -> String"],"summary":"","types":["Entity","String"],"urlPath":"tey/docgen/fragments"},{"anchor":"function-tey-docgen-fragments-absolutize","kind":"function","line":167,"name":"absolutize","qualifiedName":"Tey.Docgen.Fragments.absolutize","signatures":["absolutize(html: String, model: PackageModel, urlPath: String) -> String"],"summary":"Every relative href in a fragment, rewritten to a site path: from the page at `urlPath`, \"../net.html#module-net\" is \"/prelude/0.4.0/net/#module-net\" and \"index.html\" is \"/prelude/0.4.0/\". A fragment-only href (\"#x\"), an absolute one and an external URL stay as they are.","types":["String","PackageModel"],"urlPath":"tey/docgen/fragments"},{"anchor":"function-tey-docgen-fragments-sitepath","kind":"function","line":177,"name":"sitePath","qualifiedName":"Tey.Docgen.Fragments.sitePath","signatures":["sitePath(href: String, base: [String]) -> String"],"summary":"","types":["String","[String]"],"urlPath":"tey/docgen/fragments"},{"anchor":"function-tey-docgen-fragments-normalize","kind":"function","line":193,"name":"normalize","qualifiedName":"Tey.Docgen.Fragments.normalize","signatures":["normalize(base: [String], rel: [String]) -> [String]"],"summary":"","types":["[String]"],"urlPath":"tey/docgen/fragments"},{"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","highlightLinked(source: String, hrefOf: (String -> String)) -> String","renderLinkedTok(t: Tok, hrefOf: (String -> String)) -> 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]","(String -> 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":267,"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":272,"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":278,"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-highlightlinked","kind":"function","line":285,"name":"highlightLinked","qualifiedName":"Tey.Docgen.Highlight.highlightLinked","signatures":["highlightLinked(source: String, hrefOf: (String -> String)) -> String"],"summary":"The same highlighting, with every type name that `hrefOf` can place wrapped in a link to it — signatures read as code and navigate as a reference. `hrefOf` answers \"\" for a name it cannot place.","types":["String","(String -> String)"],"urlPath":"tey/docgen/highlight"},{"anchor":"function-tey-docgen-highlight-renderlinkedtok","kind":"function","line":289,"name":"renderLinkedTok","qualifiedName":"Tey.Docgen.Highlight.renderLinkedTok","signatures":["renderLinkedTok(t: Tok, hrefOf: (String -> String)) -> String"],"summary":"","types":["Tok","(String -> String)","String"],"urlPath":"tey/docgen/highlight"},{"anchor":"function-tey-docgen-highlight-rendertok","kind":"function","line":297,"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":306,"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":310,"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":314,"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","pageBodyHtml(page: SourcePage, model: PackageModel, heading: Bool) -> String","submodulesHtml(page: SourcePage, model: PackageModel) -> String","submoduleItem(child: SourcePage, page: SourcePage, model: PackageModel) -> String","preludePage?(page: SourcePage, model: PackageModel) -> Bool","preludeBodyHtml(page: SourcePage, model: PackageModel, heading: Bool) -> 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","versionIndexBodyHtml(model: PackageModel, heading: Bool) -> String","cardModules(model: PackageModel) -> [Tey.Docgen.Model.ModuleIndexEntry]","constantsOnly?(model: PackageModel, m: Tey.Docgen.Model.ModuleIndexEntry) -> Bool","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","latestVersion(packageName: String, versions: [VersionEntry]) -> VersionEntry?","versionsNewestFirst(packageName: String, versions: [VersionEntry]) -> [VersionEntry]","packageRedirectHtml(packageName: String, versions: [VersionEntry]) -> 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","chrome(title: String, root: String, script: Bool, nav: String, content: String) -> String","backLink(href: String, text: String) -> 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","entitiesHtml(entities: [Entity], page: SourcePage, model: PackageModel) -> String","sectionEntities(entities: [Entity]) -> [Entity]","declaredTypeNames(entities: [Entity]) -> [String]","declaredTraitNames(entities: [Entity]) -> [String]","makesFor(entities: [Entity], name: String) -> [MakeEntry]","entitySection(e: Entity, page: SourcePage, model: PackageModel) -> String","linker(page: SourcePage, model: PackageModel) -> String -> String","hrefer(page: SourcePage, model: PackageModel) -> String -> String","typeSection(e: TypeEntry, makes: [MakeEntry], page: SourcePage, model: PackageModel) -> String","variantsHtml(variants: [VariantEntry]?) -> String","variantItem(v: VariantEntry) -> String","recordSection(e: RecordEntry, makes: [MakeEntry], page: SourcePage, model: PackageModel) -> String","typeBodyHtml(name: String, makes: [MakeEntry], page: SourcePage, model: PackageModel) -> String","makeGroupHtml(m: MakeEntry, base: String, page: SourcePage, model: PackageModel) -> String","genericReceiver?(target: String, base: String) -> Bool","implementsHtml(name: String, page: SourcePage, model: PackageModel) -> String","traitLinks(traits: [String], page: SourcePage, model: PackageModel) -> String","providedHtml(name: String, page: SourcePage, model: PackageModel) -> String","providedFromHtml(written: String, own: [String], page: SourcePage, model: PackageModel) -> String","elsewhereHtml(name: String, 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","implementedByHtml(e: TraitEntry, page: SourcePage, model: PackageModel) -> String","makeSection(e: MakeEntry, page: SourcePage, model: PackageModel) -> String","firstMakeOnPage?(facts: Tey.Docgen.Model.TypeFacts, e: MakeEntry, page: SourcePage) -> Bool","homeNote(base: String, facts: Tey.Docgen.Model.TypeFacts?, page: SourcePage, model: PackageModel) -> String","moduleSection(e: ModuleEntry, page: SourcePage, model: PackageModel) -> String","memberEntity?(e: Entity) -> Bool","moduleMemberHtml(e: Entity, page: SourcePage, model: PackageModel) -> String","functionSection(e: FunctionEntry, page: SourcePage, model: PackageModel) -> String","constantSection(e: ConstantEntry, page: SourcePage, model: PackageModel) -> String","functionsHtml(functions: [FunctionEntry], owner: String, level: Integer, implements: [String], page: SourcePage, model: PackageModel) -> String","functionGroupHtml(fs: [FunctionEntry], name: String, owner: String, level: Integer, implements: [String], page: SourcePage, model: PackageModel) -> String","traitTag(name: String, implements: [String], page: SourcePage, model: PackageModel) -> String","overloadHtml(f: FunctionEntry, page: SourcePage, model: PackageModel) -> String","signaturesHtml(f: FunctionEntry, page: SourcePage, model: PackageModel) -> String","docHtml(doc: Doc, page: SourcePage, model: PackageModel) -> String","entityDocHtml(doc: Doc, page: SourcePage, model: PackageModel) -> String","plainDocHtml(doc: Doc) -> String","summaryParagraphs(summary: String) -> [String]","groupParagraphs(lines: [String], current: [String], accum: [String], fenced: Bool) -> [String]","paragraphHtml(p: String, hrefOf: (String -> String)) -> String","bulletLine?(line: String) -> Bool","bulletListHtml(lines: [String], hrefOf: (String -> String)) -> String","inlineCode(text: String) -> String","linkedInline(text: String, hrefOf: (String -> String)) -> String","linkableCode?(code: String) -> Bool","firstSentence(text: String) -> String","paramsHtml(f: FunctionEntry, link: (String -> String), page: SourcePage, model: PackageModel) -> String","returnsHtml(f: FunctionEntry, link: (String -> String), page: SourcePage, model: PackageModel) -> 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?","[Tey.Docgen.Model.ModuleIndexEntry]","Tey.Docgen.Model.ModuleIndexEntry","[String]","[VersionEntry]","VersionEntry?","VersionEntry","[SourcePage]","[Entity]","[MakeEntry]","Entity","String -> String","TypeEntry","[VariantEntry]?","VariantEntry","RecordEntry","MakeEntry","Tey.Docgen.Model.FieldEntry","(String -> String)","[LinkEntry]","TraitEntry","Tey.Docgen.Model.TypeFacts","Tey.Docgen.Model.TypeFacts?","ModuleEntry","FunctionEntry","ConstantEntry","[FunctionEntry]","Integer","Doc"],"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-pagebodyhtml","kind":"function","line":19,"name":"pageBodyHtml","qualifiedName":"Tey.Docgen.Html.pageBodyHtml","signatures":["pageBodyHtml(page: SourcePage, model: PackageModel, heading: Bool) -> String"],"summary":"A page's content without the chrome — what `pageHtml` wraps in the layout, and what a host site (the fragments output) wraps in its own. `heading` is false when the host renders the title itself.","types":["SourcePage","PackageModel","Bool","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-submoduleshtml","kind":"function","line":35,"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":42,"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":49,"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-preludebodyhtml","kind":"function","line":57,"name":"preludeBodyHtml","qualifiedName":"Tey.Docgen.Html.preludeBodyHtml","signatures":["preludeBodyHtml(page: SourcePage, model: PackageModel, heading: Bool) -> 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","Bool","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-preludeitem","kind":"function","line":69,"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":82,"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":92,"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":99,"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":103,"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":114,"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-versionindexbodyhtml","kind":"function","line":118,"name":"versionIndexBodyHtml","qualifiedName":"Tey.Docgen.Html.versionIndexBodyHtml","signatures":["versionIndexBodyHtml(model: PackageModel, heading: Bool) -> String"],"summary":"","types":["PackageModel","Bool","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-cardmodules","kind":"function","line":130,"name":"cardModules","qualifiedName":"Tey.Docgen.Html.cardModules","signatures":["cardModules(model: PackageModel) -> [Tey.Docgen.Model.ModuleIndexEntry]"],"summary":"The modules worth a card. `Int8`, `Float32` and friends are modules holding two constants each, declared in number.kex beside Integer and Float: listing them beside `Net` and `FS` made the index read as if the stdlib had a dozen integer libraries. They are on their file's page.","types":["PackageModel","[Tey.Docgen.Model.ModuleIndexEntry]"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-constantsonly?","kind":"function","line":139,"name":"constantsOnly?","qualifiedName":"Tey.Docgen.Html.constantsOnly?","signatures":["constantsOnly?(model: PackageModel, m: Tey.Docgen.Model.ModuleIndexEntry) -> Bool"],"summary":"","types":["PackageModel","Tey.Docgen.Model.ModuleIndexEntry","Bool"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-indexsections","kind":"function","line":147,"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":167,"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":171,"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":178,"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-latestversion","kind":"function","line":188,"name":"latestVersion","qualifiedName":"Tey.Docgen.Html.latestVersion","signatures":["latestVersion(packageName: String, versions: [VersionEntry]) -> VersionEntry?"],"summary":"The version a reader gets by default: the highest release by semantic version, never an unreleased `-dev` build while a release exists. versions.json is in BUILD order, newest build first, and tools/build-docs.sh builds the working tree last, so its first entry is usually the -dev build rather than the latest release.","types":["String","[VersionEntry]","VersionEntry?"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-versionsnewestfirst","kind":"function","line":199,"name":"versionsNewestFirst","qualifiedName":"Tey.Docgen.Html.versionsNewestFirst","signatures":["versionsNewestFirst(packageName: String, versions: [VersionEntry]) -> [VersionEntry]"],"summary":"One package's versions, highest first by semantic version.","types":["String","[VersionEntry]"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-packageredirecthtml","kind":"function","line":209,"name":"packageRedirectHtml","qualifiedName":"Tey.Docgen.Html.packageRedirectHtml","signatures":["packageRedirectHtml(packageName: String, versions: [VersionEntry]) -> String"],"summary":"<pkg>/index.html: straight on to the latest version, so a link to a package lands on its reference rather than on a list of builds. Every other version stays one click away, at versions.html.","types":["String","[VersionEntry]"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-packageversionshtml","kind":"function","line":223,"name":"packageVersionsHtml","qualifiedName":"Tey.Docgen.Html.packageVersionsHtml","signatures":["packageVersionsHtml(packageName: String, versions: [VersionEntry]) -> String"],"summary":"<pkg>/versions.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":232,"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":239,"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":252,"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":263,"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":268,"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-chrome","kind":"function","line":279,"name":"chrome","qualifiedName":"Tey.Docgen.Html.chrome","signatures":["chrome(title: String, root: String, script: Bool, nav: String, content: String) -> String"],"summary":"What every full page shares: the <head>, and the top bar with the brand on the left and `nav` on the right. `root` is the relative path back to the site root, and `script` says whether the page loads assets/site.js.","types":["String","Bool"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-backlink","kind":"function","line":284,"name":"backLink","qualifiedName":"Tey.Docgen.Html.backLink","signatures":["backLink(href: String, text: String) -> String"],"summary":"","types":["String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-layout","kind":"function","line":288,"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":323,"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":332,"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":353,"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":361,"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":370,"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-entitieshtml","kind":"function","line":389,"name":"entitiesHtml","qualifiedName":"Tey.Docgen.Html.entitiesHtml","signatures":["entitiesHtml(entities: [Entity], page: SourcePage, model: PackageModel) -> String"],"summary":"A page's declarations in source order — except that a type's `make` blocks on the same page are pulled into the type's own section, so `List` reads as one thing (the type, then its functions, grouped by the receiver they need) rather than a type followed by three loose \"make\" sections.","types":["[Entity]","SourcePage","PackageModel","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-sectionentities","kind":"function","line":403,"name":"sectionEntities","qualifiedName":"Tey.Docgen.Html.sectionEntities","signatures":["sectionEntities(entities: [Entity]) -> [Entity]"],"summary":"The declarations that get a section of their own: everything except the make blocks folded into a type or trait on the same page.","types":["[Entity]"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-declaredtypenames","kind":"function","line":413,"name":"declaredTypeNames","qualifiedName":"Tey.Docgen.Html.declaredTypeNames","signatures":["declaredTypeNames(entities: [Entity]) -> [String]"],"summary":"","types":["[Entity]","[String]"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-declaredtraitnames","kind":"function","line":425,"name":"declaredTraitNames","qualifiedName":"Tey.Docgen.Html.declaredTraitNames","signatures":["declaredTraitNames(entities: [Entity]) -> [String]"],"summary":"A `make <Trait>` beside its trait is the trait's defaults, rendered in the trait's own section (Relations.traitMethods).","types":["[Entity]","[String]"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-makesfor","kind":"function","line":434,"name":"makesFor","qualifiedName":"Tey.Docgen.Html.makesFor","signatures":["makesFor(entities: [Entity], name: String) -> [MakeEntry]"],"summary":"","types":["[Entity]","String","[MakeEntry]"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-entitysection","kind":"function","line":443,"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":457,"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-hrefer","kind":"function","line":463,"name":"hrefer","qualifiedName":"Tey.Docgen.Html.hrefer","signatures":["hrefer(page: SourcePage, model: PackageModel) -> String -> String"],"summary":"The bare href for a name, or \"\" — what linked highlighting and linked prose both need.","types":["SourcePage","PackageModel","String -> String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-typesection","kind":"function","line":472,"name":"typeSection","qualifiedName":"Tey.Docgen.Html.typeSection","signatures":["typeSection(e: TypeEntry, makes: [MakeEntry], page: SourcePage, model: PackageModel) -> String"],"summary":"","types":["TypeEntry","[MakeEntry]","SourcePage","PackageModel","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-variantshtml","kind":"function","line":486,"name":"variantsHtml","qualifiedName":"Tey.Docgen.Html.variantsHtml","signatures":["variantsHtml(variants: [VariantEntry]?) -> String"],"summary":"Only real constructors: an abstract type (`type List<X>`) has none, and a \"Variants: (abstract)\" heading told the reader nothing.","types":["[VariantEntry]?","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-variantitem","kind":"function","line":493,"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":500,"name":"recordSection","qualifiedName":"Tey.Docgen.Html.recordSection","signatures":["recordSection(e: RecordEntry, makes: [MakeEntry], page: SourcePage, model: PackageModel) -> String"],"summary":"","types":["RecordEntry","[MakeEntry]","SourcePage","PackageModel","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-typebodyhtml","kind":"function","line":512,"name":"typeBodyHtml","qualifiedName":"Tey.Docgen.Html.typeBodyHtml","signatures":["typeBodyHtml(name: String, makes: [MakeEntry], page: SourcePage, model: PackageModel) -> String"],"summary":"Everything about a type beyond its declaration: the traits it implements (from every file), its functions grouped by receiver, the functions it gets from those traits for free, and the other modules that add functions to it.","types":["String","[MakeEntry]","SourcePage","PackageModel"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-makegrouphtml","kind":"function","line":520,"name":"makeGroupHtml","qualifiedName":"Tey.Docgen.Html.makeGroupHtml","signatures":["makeGroupHtml(m: MakeEntry, base: String, page: SourcePage, model: PackageModel) -> String"],"summary":"\"Functions\" for the plain receiver, \"On `[Number]`\" for a specialised one.","types":["MakeEntry","String","SourcePage","PackageModel"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-genericreceiver?","kind":"function","line":533,"name":"genericReceiver?","qualifiedName":"Tey.Docgen.Html.genericReceiver?","signatures":["genericReceiver?(target: String, base: String) -> Bool"],"summary":"`[X]` and `FileHandle<R, W>` are the type itself; `[Number]` is not.","types":["String","Bool"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-implementshtml","kind":"function","line":540,"name":"implementsHtml","qualifiedName":"Tey.Docgen.Html.implementsHtml","signatures":["implementsHtml(name: String, page: SourcePage, model: PackageModel) -> String"],"summary":"Every trait the type implements, wherever the implementing make block lives — algebra.kex is what makes Integer a Monoid, and number.kex's reader should still learn that.","types":["String","SourcePage","PackageModel"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-traitlinks","kind":"function","line":547,"name":"traitLinks","qualifiedName":"Tey.Docgen.Html.traitLinks","signatures":["traitLinks(traits: [String], page: SourcePage, model: PackageModel) -> String"],"summary":"","types":["[String]","SourcePage","PackageModel","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-providedhtml","kind":"function","line":560,"name":"providedHtml","qualifiedName":"Tey.Docgen.Html.providedHtml","signatures":["providedHtml(name: String, page: SourcePage, model: PackageModel) -> String"],"summary":"The trait functions a type gets without writing them: a trait's provided functions, minus any the type defines itself somewhere. This is the answer to \"where does `List.eachIndexed` come from?\".","types":["String","SourcePage","PackageModel"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-providedfromhtml","kind":"function","line":570,"name":"providedFromHtml","qualifiedName":"Tey.Docgen.Html.providedFromHtml","signatures":["providedFromHtml(written: String, own: [String], page: SourcePage, model: PackageModel) -> String"],"summary":"","types":["String","[String]","SourcePage","PackageModel"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-elsewherehtml","kind":"function","line":595,"name":"elsewhereHtml","qualifiedName":"Tey.Docgen.Html.elsewhereHtml","signatures":["elsewhereHtml(name: String, page: SourcePage, model: PackageModel) -> String"],"summary":"Other modules that add functions to this type: `make Integer` in time.kex is where `5.seconds` comes from.","types":["String","SourcePage","PackageModel"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-fieldrow","kind":"function","line":613,"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":620,"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":632,"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":644,"name":"traitSection","qualifiedName":"Tey.Docgen.Html.traitSection","signatures":["traitSection(e: TraitEntry, page: SourcePage, model: PackageModel) -> String"],"summary":"A trait: what an implementor must write, what it then gets for free, and who implements it.","types":["TraitEntry","SourcePage","PackageModel","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-implementedbyhtml","kind":"function","line":662,"name":"implementedByHtml","qualifiedName":"Tey.Docgen.Html.implementedByHtml","signatures":["implementedByHtml(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":679,"name":"makeSection","qualifiedName":"Tey.Docgen.Html.makeSection","signatures":["makeSection(e: MakeEntry, page: SourcePage, model: PackageModel) -> String"],"summary":"A make block with no type declaration on its page. On the type's home page (string.kex for String) it carries everything the type section would; elsewhere it points home.","types":["MakeEntry","SourcePage","PackageModel","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-firstmakeonpage?","kind":"function","line":704,"name":"firstMakeOnPage?","qualifiedName":"Tey.Docgen.Html.firstMakeOnPage?","signatures":["firstMakeOnPage?(facts: Tey.Docgen.Model.TypeFacts, e: MakeEntry, page: SourcePage) -> Bool"],"summary":"","types":["Tey.Docgen.Model.TypeFacts","MakeEntry","SourcePage","Bool"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-homenote","kind":"function","line":711,"name":"homeNote","qualifiedName":"Tey.Docgen.Html.homeNote","signatures":["homeNote(base: String, facts: Tey.Docgen.Model.TypeFacts?, page: SourcePage, model: PackageModel) -> String"],"summary":"","types":["String","Tey.Docgen.Model.TypeFacts?","SourcePage","PackageModel"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-modulesection","kind":"function","line":732,"name":"moduleSection","qualifiedName":"Tey.Docgen.Html.moduleSection","signatures":["moduleSection(e: ModuleEntry, page: SourcePage, model: PackageModel) -> String"],"summary":"A module's own functions and constants are its API, listed under it (h3) like a type's functions. Types, traits and nested modules it declares stand as sections of their own after that.","types":["ModuleEntry","SourcePage","PackageModel","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-memberentity?","kind":"function","line":741,"name":"memberEntity?","qualifiedName":"Tey.Docgen.Html.memberEntity?","signatures":["memberEntity?(e: Entity) -> Bool"],"summary":"","types":["Entity","Bool"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-modulememberhtml","kind":"function","line":749,"name":"moduleMemberHtml","qualifiedName":"Tey.Docgen.Html.moduleMemberHtml","signatures":["moduleMemberHtml(e: Entity, page: SourcePage, model: PackageModel) -> String"],"summary":"","types":["Entity","SourcePage","PackageModel","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-functionsection","kind":"function","line":761,"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":766,"name":"constantSection","qualifiedName":"Tey.Docgen.Html.constantSection","signatures":["constantSection(e: ConstantEntry, page: SourcePage, model: PackageModel) -> String"],"summary":"","types":["ConstantEntry","SourcePage","PackageModel","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-functionshtml","kind":"function","line":779,"name":"functionsHtml","qualifiedName":"Tey.Docgen.Html.functionsHtml","signatures":["functionsHtml(functions: [FunctionEntry], owner: String, level: Integer, implements: [String], page: SourcePage, model: PackageModel) -> String"],"summary":"Members of a trait or make block, one heading per NAME: overloads (`count` and `count(pred)`) are one function with several signatures, not two unrelated entries. `owner` scopes the anchors; `implements` lets a member that fulfils a trait function say which trait.","types":["[FunctionEntry]","String","Integer","[String]","SourcePage","PackageModel"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-functiongrouphtml","kind":"function","line":789,"name":"functionGroupHtml","qualifiedName":"Tey.Docgen.Html.functionGroupHtml","signatures":["functionGroupHtml(fs: [FunctionEntry], name: String, owner: String, level: Integer, implements: [String], page: SourcePage, model: PackageModel) -> String"],"summary":"","types":["[FunctionEntry]","String","Integer","[String]","SourcePage","PackageModel"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-traittag","kind":"function","line":800,"name":"traitTag","qualifiedName":"Tey.Docgen.Html.traitTag","signatures":["traitTag(name: String, implements: [String], page: SourcePage, model: PackageModel) -> String"],"summary":"\"from Enumerable\": this member is the type's own version of a function the trait declares, linked to the trait's description of it.","types":["String","[String]","SourcePage","PackageModel"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-overloadhtml","kind":"function","line":817,"name":"overloadHtml","qualifiedName":"Tey.Docgen.Html.overloadHtml","signatures":["overloadHtml(f: FunctionEntry, page: SourcePage, model: PackageModel) -> String"],"summary":"One overload: its signature first (what you call), then the prose.","types":["FunctionEntry","SourcePage","PackageModel","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-signatureshtml","kind":"function","line":822,"name":"signaturesHtml","qualifiedName":"Tey.Docgen.Html.signaturesHtml","signatures":["signaturesHtml(f: FunctionEntry, page: SourcePage, model: PackageModel) -> String"],"summary":"","types":["FunctionEntry","SourcePage","PackageModel","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-dochtml","kind":"function","line":829,"name":"docHtml","qualifiedName":"Tey.Docgen.Html.docHtml","signatures":["docHtml(doc: Doc, page: SourcePage, model: PackageModel) -> String"],"summary":"","types":["Doc","SourcePage","PackageModel","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-entitydochtml","kind":"function","line":840,"name":"entityDocHtml","qualifiedName":"Tey.Docgen.Html.entityDocHtml","signatures":["entityDocHtml(doc: Doc, page: SourcePage, model: PackageModel) -> String"],"summary":"A declaration's doc: prose, then its examples and any deprecation — a type's @example is as much a part of it as a function's.","types":["Doc","SourcePage","PackageModel","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-plaindochtml","kind":"function","line":846,"name":"plainDocHtml","qualifiedName":"Tey.Docgen.Html.plainDocHtml","signatures":["plainDocHtml(doc: Doc) -> String"],"summary":"Unlinked: for prose with no page to resolve against (the prelude comment, card summaries).","types":["Doc","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-summaryparagraphs","kind":"function","line":855,"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":859,"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":883,"name":"paragraphHtml","qualifiedName":"Tey.Docgen.Html.paragraphHtml","signatures":["paragraphHtml(p: String, hrefOf: (String -> String)) -> String"],"summary":"A summary paragraph is prose, a fenced block that Rdoc produced from an indented (verbatim) block, or a bullet list — each rendered as what it is rather than reflowed into one paragraph.","types":["String","(String -> String)"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-bulletline?","kind":"function","line":898,"name":"bulletLine?","qualifiedName":"Tey.Docgen.Html.bulletLine?","signatures":["bulletLine?(line: String) -> Bool"],"summary":"","types":["String","Bool"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-bulletlisthtml","kind":"function","line":905,"name":"bulletListHtml","qualifiedName":"Tey.Docgen.Html.bulletListHtml","signatures":["bulletListHtml(lines: [String], hrefOf: (String -> String)) -> String"],"summary":"`- item` lines, with indented continuation lines folded into the item above them.","types":["[String]","(String -> String)","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-inlinecode","kind":"function","line":915,"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-linkedinline","kind":"function","line":921,"name":"linkedInline","qualifiedName":"Tey.Docgen.Html.linkedInline","signatures":["linkedInline(text: String, hrefOf: (String -> String)) -> String"],"summary":"The same, with a code span that names something documented — a type, a trait, `List.map` — linked to it.","types":["String","(String -> String)"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-linkablecode?","kind":"function","line":938,"name":"linkableCode?","qualifiedName":"Tey.Docgen.Html.linkableCode?","signatures":["linkableCode?(code: String) -> Bool"],"summary":"Only a bare name is a reference: `List`, `FS.Path`, `List.map`. A code span with spaces or parentheses is an expression, not a name.","types":["String","Bool"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-firstsentence","kind":"function","line":942,"name":"firstSentence","qualifiedName":"Tey.Docgen.Html.firstSentence","signatures":["firstSentence(text: String) -> String"],"summary":"","types":["String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-paramshtml","kind":"function","line":952,"name":"paramsHtml","qualifiedName":"Tey.Docgen.Html.paramsHtml","signatures":["paramsHtml(f: FunctionEntry, link: (String -> String), page: SourcePage, model: PackageModel) -> String"],"summary":"Each parameter's meaning. Its type is in the signature right above, so it is repeated here only when there is no signature to read it from.","types":["FunctionEntry","(String -> String)","SourcePage","PackageModel","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-returnshtml","kind":"function","line":970,"name":"returnsHtml","qualifiedName":"Tey.Docgen.Html.returnsHtml","signatures":["returnsHtml(f: FunctionEntry, link: (String -> String), page: SourcePage, model: PackageModel) -> String"],"summary":"The signature already states the result type, so when there is one \"Returns\" says only what the value MEANS. A @return tag whose type disagrees would otherwise put two answers side by side (`min : X?` above \"Returns: Number?\").","types":["FunctionEntry","(String -> String)","SourcePage","PackageModel","String"],"urlPath":"tey/docgen/html"},{"anchor":"function-tey-docgen-html-exampleshtml","kind":"function","line":984,"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":995,"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":1003,"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":1007,"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":1015,"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":1026,"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":1034,"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":1038,"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":1047,"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":1055,"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":1059,"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","externalLinks(paths: String) -> [LinkEntry]","writeUnitIndexFiles(pages: [SourcePage], model: PackageModel, out: String) -> ()","reportDocDrift(pages: [SourcePage]) -> ()","normalizeType(text: String) -> String","optString(value: String?) -> String","preludeInfo(source: String) -> (String, [String], String)","leadingComment(lines: [String]) -> String","commentBody(line: String) -> String","fileHeader(lines: [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","[LinkEntry]","[SourcePage]","PackageModel","()","String?","(String, [String], String)","[String]","(String, String)?","[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-externallinks","kind":"function","line":94,"name":"externalLinks","qualifiedName":"Tey.Docgen.Index.externalLinks","signatures":["externalLinks(paths: String) -> [LinkEntry]"],"summary":"Names another unit documents, so this one's signatures and prose can link to them: the Tey reference links `String` and `FS.Path` into the standard library's. Each model.json says which unit it is; its pages sit at ../../<package>/<version>/ from this unit's version directory. A file that cannot be read is reported and skipped — links are an extra.","types":["String","[LinkEntry]"],"urlPath":"tey/docgen/index"},{"anchor":"function-tey-docgen-index-writeunitindexfiles","kind":"function","line":126,"name":"writeUnitIndexFiles","qualifiedName":"Tey.Docgen.Index.writeUnitIndexFiles","signatures":["writeUnitIndexFiles(pages: [SourcePage], model: PackageModel, out: String) -> ()"],"summary":"The unit's own index files — its manifest and the shared versions.json — without the site-level ones (landing pages, llms.txt, sitemap), which a host site that frames fragments owns.","types":["[SourcePage]","PackageModel","String","()"],"urlPath":"tey/docgen/index"},{"anchor":"function-tey-docgen-index-reportdocdrift","kind":"function","line":138,"name":"reportDocDrift","qualifiedName":"Tey.Docgen.Index.reportDocDrift","signatures":["reportDocDrift(pages: [SourcePage]) -> ()"],"summary":"A @return tag that names a different type than the signature declares is a doc comment that has drifted from its code (`min : X?` documented as returning `Number?`). The page shows the signature's type; this says where the tag disagrees so the comment can be fixed.","types":["[SourcePage]","()"],"urlPath":"tey/docgen/index"},{"anchor":"function-tey-docgen-index-normalizetype","kind":"function","line":154,"name":"normalizeType","qualifiedName":"Tey.Docgen.Index.normalizeType","signatures":["normalizeType(text: String) -> String"],"summary":"","types":["String"],"urlPath":"tey/docgen/index"},{"anchor":"function-tey-docgen-index-optstring","kind":"function","line":158,"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":169,"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":181,"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":185,"name":"commentBody","qualifiedName":"Tey.Docgen.Index.commentBody","signatures":["commentBody(line: String) -> String"],"summary":"","types":["String"],"urlPath":"tey/docgen/index"},{"anchor":"function-tey-docgen-index-fileheader","kind":"function","line":193,"name":"fileHeader","qualifiedName":"Tey.Docgen.Index.fileHeader","signatures":["fileHeader(lines: [String]) -> String"],"summary":"The file's opening comment, when it is its own block: a blank line after it, not a declaration. A comment that runs straight into a declaration is that declaration's doc, and the page gets no intro.","types":["[String]","String"],"urlPath":"tey/docgen/index"},{"anchor":"function-tey-docgen-index-usingname","kind":"function","line":203,"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":210,"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":222,"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":237,"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":250,"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":260,"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":264,"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":285,"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":297,"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":314,"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":322,"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":328,"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":363,"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":373,"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":387,"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":399,"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":406,"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":423,"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":432,"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":439,"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":446,"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":450,"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":455,"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":479,"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":484,"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":491,"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":504,"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, owner: String) -> 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, owner: String) -> SearchEntry"],"summary":"","types":["FunctionEntry","SourcePage","String","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","entitiesMd(entities: [Entity], page: SourcePage, model: PackageModel) -> String","entitySection(e: Entity, page: SourcePage, model: PackageModel) -> String","linkMd(model: PackageModel, fromPath: String, name: String) -> String","hrefMd(fromPath: String, toPath: String, anchor: String) -> String","linkTypeMd(model: PackageModel, fromPath: String, text: String) -> String","typeSection(e: TypeEntry, makes: [MakeEntry], page: SourcePage, model: PackageModel) -> String","variantBullet(name: String, fields: [String]) -> String","recordSection(e: RecordEntry, makes: [MakeEntry], page: SourcePage, model: PackageModel) -> String","typeBodyMd(name: String, makes: [MakeEntry], page: SourcePage, model: PackageModel) -> String","implementsMd(name: String, page: SourcePage, model: PackageModel) -> String","traitLinksMd(traits: [String], page: SourcePage, model: PackageModel) -> String","providedMd(name: String, page: SourcePage, model: PackageModel) -> String","providedFromMd(written: String, own: [String], page: SourcePage, model: PackageModel) -> String","elsewhereMd(name: String, page: SourcePage, model: PackageModel) -> 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","constantSection(e: ConstantEntry) -> String","functionsMd(functions: [FunctionEntry], owner: String, level: Integer, implements: [String], page: SourcePage, model: PackageModel) -> String","traitTagsMd(name: String, implements: [String], page: SourcePage, model: PackageModel) -> String","overloadMd(f: FunctionEntry, page: SourcePage, model: PackageModel) -> String","signatureParts(parts: [String], f: FunctionEntry) -> [String]","paramParts(parts: [String], f: FunctionEntry) -> [String]","returnParts(parts: [String], f: FunctionEntry) -> [String]","returnLine(r: Return) -> String","exampleParts(parts: [String], doc: Doc) -> [String]","exampleBlocks(examples: [Example]) -> [String]","exampleBlock(ex: Example) -> [String]","entityDocMd(doc: Doc) -> String","docBlock(doc: Doc) -> String","typeParamSuffix(typeParams: [String]) -> String"],"summary":"","types":["SourcePage","PackageModel","String","Entity","[Entity]","TypeEntry","[MakeEntry]","[String]","RecordEntry","TraitEntry","MakeEntry","ModuleEntry","ConstantEntry","[FunctionEntry]","Integer","FunctionEntry","Return","Doc","[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-entitiesmd","kind":"function","line":40,"name":"entitiesMd","qualifiedName":"Tey.Docgen.Markdown.entitiesMd","signatures":["entitiesMd(entities: [Entity], page: SourcePage, model: PackageModel) -> String"],"summary":"The same layout as the HTML: a type's make blocks on its own page are folded into the type's section.","types":["[Entity]","SourcePage","PackageModel","String"],"urlPath":"tey/docgen/markdown"},{"anchor":"function-tey-docgen-markdown-entitysection","kind":"function","line":52,"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":67,"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-hrefmd","kind":"function","line":74,"name":"hrefMd","qualifiedName":"Tey.Docgen.Markdown.hrefMd","signatures":["hrefMd(fromPath: String, toPath: String, anchor: String) -> String"],"summary":"","types":["String"],"urlPath":"tey/docgen/markdown"},{"anchor":"function-tey-docgen-markdown-linktypemd","kind":"function","line":79,"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":89,"name":"typeSection","qualifiedName":"Tey.Docgen.Markdown.typeSection","signatures":["typeSection(e: TypeEntry, makes: [MakeEntry], page: SourcePage, model: PackageModel) -> String"],"summary":"","types":["TypeEntry","[MakeEntry]","SourcePage","PackageModel","String"],"urlPath":"tey/docgen/markdown"},{"anchor":"function-tey-docgen-markdown-variantbullet","kind":"function","line":105,"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":112,"name":"recordSection","qualifiedName":"Tey.Docgen.Markdown.recordSection","signatures":["recordSection(e: RecordEntry, makes: [MakeEntry], page: SourcePage, model: PackageModel) -> String"],"summary":"","types":["RecordEntry","[MakeEntry]","SourcePage","PackageModel","String"],"urlPath":"tey/docgen/markdown"},{"anchor":"function-tey-docgen-markdown-typebodymd","kind":"function","line":123,"name":"typeBodyMd","qualifiedName":"Tey.Docgen.Markdown.typeBodyMd","signatures":["typeBodyMd(name: String, makes: [MakeEntry], page: SourcePage, model: PackageModel) -> String"],"summary":"","types":["String","[MakeEntry]","SourcePage","PackageModel"],"urlPath":"tey/docgen/markdown"},{"anchor":"function-tey-docgen-markdown-implementsmd","kind":"function","line":132,"name":"implementsMd","qualifiedName":"Tey.Docgen.Markdown.implementsMd","signatures":["implementsMd(name: String, page: SourcePage, model: PackageModel) -> String"],"summary":"","types":["String","SourcePage","PackageModel"],"urlPath":"tey/docgen/markdown"},{"anchor":"function-tey-docgen-markdown-traitlinksmd","kind":"function","line":139,"name":"traitLinksMd","qualifiedName":"Tey.Docgen.Markdown.traitLinksMd","signatures":["traitLinksMd(traits: [String], page: SourcePage, model: PackageModel) -> String"],"summary":"","types":["[String]","SourcePage","PackageModel","String"],"urlPath":"tey/docgen/markdown"},{"anchor":"function-tey-docgen-markdown-providedmd","kind":"function","line":148,"name":"providedMd","qualifiedName":"Tey.Docgen.Markdown.providedMd","signatures":["providedMd(name: String, page: SourcePage, model: PackageModel) -> String"],"summary":"","types":["String","SourcePage","PackageModel"],"urlPath":"tey/docgen/markdown"},{"anchor":"function-tey-docgen-markdown-providedfrommd","kind":"function","line":158,"name":"providedFromMd","qualifiedName":"Tey.Docgen.Markdown.providedFromMd","signatures":["providedFromMd(written: String, own: [String], page: SourcePage, model: PackageModel) -> String"],"summary":"","types":["String","[String]","SourcePage","PackageModel"],"urlPath":"tey/docgen/markdown"},{"anchor":"function-tey-docgen-markdown-elsewheremd","kind":"function","line":178,"name":"elsewhereMd","qualifiedName":"Tey.Docgen.Markdown.elsewhereMd","signatures":["elsewhereMd(name: String, page: SourcePage, model: PackageModel) -> String"],"summary":"","types":["String","SourcePage","PackageModel"],"urlPath":"tey/docgen/markdown"},{"anchor":"function-tey-docgen-markdown-traitsection","kind":"function","line":193,"name":"traitSection","qualifiedName":"Tey.Docgen.Markdown.traitSection","signatures":["traitSection(e: TraitEntry, page: SourcePage, model: PackageModel) -> String"],"summary":"","types":["TraitEntry","SourcePage","PackageModel","String"],"urlPath":"tey/docgen/markdown"},{"anchor":"function-tey-docgen-markdown-makesection","kind":"function","line":206,"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":227,"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-constantsection","kind":"function","line":241,"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-functionsmd","kind":"function","line":247,"name":"functionsMd","qualifiedName":"Tey.Docgen.Markdown.functionsMd","signatures":["functionsMd(functions: [FunctionEntry], owner: String, level: Integer, implements: [String], page: SourcePage, model: PackageModel) -> String"],"summary":"One heading per name; overloads listed under it.","types":["[FunctionEntry]","String","Integer","[String]","SourcePage","PackageModel"],"urlPath":"tey/docgen/markdown"},{"anchor":"function-tey-docgen-markdown-traittagsmd","kind":"function","line":258,"name":"traitTagsMd","qualifiedName":"Tey.Docgen.Markdown.traitTagsMd","signatures":["traitTagsMd(name: String, implements: [String], page: SourcePage, model: PackageModel) -> String"],"summary":"","types":["String","[String]","SourcePage","PackageModel"],"urlPath":"tey/docgen/markdown"},{"anchor":"function-tey-docgen-markdown-overloadmd","kind":"function","line":271,"name":"overloadMd","qualifiedName":"Tey.Docgen.Markdown.overloadMd","signatures":["overloadMd(f: FunctionEntry, page: SourcePage, model: PackageModel) -> String"],"summary":"","types":["FunctionEntry","SourcePage","PackageModel","String"],"urlPath":"tey/docgen/markdown"},{"anchor":"function-tey-docgen-markdown-signatureparts","kind":"function","line":280,"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-paramparts","kind":"function","line":287,"name":"paramParts","qualifiedName":"Tey.Docgen.Markdown.paramParts","signatures":["paramParts(parts: [String], f: FunctionEntry) -> [String]"],"summary":"","types":["[String]","FunctionEntry"],"urlPath":"tey/docgen/markdown"},{"anchor":"function-tey-docgen-markdown-returnparts","kind":"function","line":298,"name":"returnParts","qualifiedName":"Tey.Docgen.Markdown.returnParts","signatures":["returnParts(parts: [String], f: FunctionEntry) -> [String]"],"summary":"","types":["[String]","FunctionEntry"],"urlPath":"tey/docgen/markdown"},{"anchor":"function-tey-docgen-markdown-returnline","kind":"function","line":312,"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":322,"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":329,"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":333,"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-entitydocmd","kind":"function","line":342,"name":"entityDocMd","qualifiedName":"Tey.Docgen.Markdown.entityDocMd","signatures":["entityDocMd(doc: Doc) -> String"],"summary":"","types":["Doc","String"],"urlPath":"tey/docgen/markdown"},{"anchor":"function-tey-docgen-markdown-docblock","kind":"function","line":348,"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":355,"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","memberAnchorOf(owner: String, name: String) -> String","ownerSlugOf(owner: String) -> String","typeVariable?(word: String) -> Bool","wordsOf(text: String) -> [String]","wordSplit(rest: String, word: String, out: [String]) -> [String]","slugOf(name: String) -> String","operatorSlug(name: String) -> String","operatorCharName(c: Char) -> String","baseTypeOf(target: String) -> String"],"summary":"","types":["String","[Param]","Return?","[Example]","String?","Doc","[String]","Bool","[VariantEntry]?","Integer","[FieldEntry]","[FunctionEntry]","[Entity]","TypeEntry","RecordEntry","TraitEntry","MakeEntry","ModuleEntry","FunctionEntry","ConstantEntry","[Extension]","[MemberEntry]","[SourcePage]","[ModuleIndexEntry]","[LinkEntry]","[TypeFacts]","[TraitFacts]","Entity","Char"],"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":107,"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":115,"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":124,"name":"SourcePage","qualifiedName":"Tey.Docgen.Model.SourcePage","signatures":[],"summary":"","types":["String","[Entity]"],"urlPath":"tey/docgen/model"},{"anchor":"record-tey-docgen-model-extension","kind":"record","line":139,"name":"Extension","qualifiedName":"Tey.Docgen.Model.Extension","signatures":[],"summary":"One `make` block seen from the type it extends: where it is, what it adds, and which traits it declares. A type's methods are spread over many files (`make Integer` lives in number.kex, time.kex, units.kex and algebra.kex), and these rows are what put them back together.","types":["String","[String]"],"urlPath":"tey/docgen/model"},{"anchor":"record-tey-docgen-model-typefacts","kind":"record","line":151,"name":"TypeFacts","qualifiedName":"Tey.Docgen.Model.TypeFacts","signatures":[],"summary":"Everything the package says about one type, across files. `homePath` is the page a reader should land on for the type — the one declaring it, or the one named after it for builtins such as Integer and String.","types":["String","[Extension]","[String]"],"urlPath":"tey/docgen/model"},{"anchor":"record-tey-docgen-model-traitfacts","kind":"record","line":163,"name":"TraitFacts","qualifiedName":"Tey.Docgen.Model.TraitFacts","signatures":[],"summary":"A trait seen from the outside: where it is documented and which make blocks implement it.","types":["String","[Extension]"],"urlPath":"tey/docgen/model"},{"anchor":"record-tey-docgen-model-moduleindexentry","kind":"record","line":175,"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":184,"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":193,"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":200,"name":"PackageModel","qualifiedName":"Tey.Docgen.Model.PackageModel","signatures":[],"summary":"","types":["String","[SourcePage]","[ModuleIndexEntry]","[LinkEntry]","[String]","[TypeFacts]","[TraitFacts]"],"urlPath":"tey/docgen/model"},{"anchor":"record-tey-docgen-model-searchentry","kind":"record","line":229,"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":244,"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":252,"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":265,"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":277,"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":289,"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":304,"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":314,"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-memberanchorof","kind":"function","line":324,"name":"memberAnchorOf","qualifiedName":"Tey.Docgen.Model.memberAnchorOf","signatures":["memberAnchorOf(owner: String, name: String) -> String"],"summary":"The anchor of a function documented inside a trait or make section: scoped by its owner, because `count` is a member of both `[X]` and `String`, and one page can hold several owners.","types":["String"],"urlPath":"tey/docgen/model"},{"anchor":"function-tey-docgen-model-ownerslugof","kind":"function","line":332,"name":"ownerSlugOf","qualifiedName":"Tey.Docgen.Model.ownerSlugOf","signatures":["ownerSlugOf(owner: String) -> String"],"summary":"An owner spelled as a type: `[X]` -> \"list\", `[Number]` -> \"list-number\", `FileHandle<CanRead, W>` -> \"filehandle-canread\". Type variables (a lone capital, optionally numbered) say nothing about WHICH methods these are, so they are dropped rather than baked into every anchor.","types":["String"],"urlPath":"tey/docgen/model"},{"anchor":"function-tey-docgen-model-typevariable?","kind":"function","line":339,"name":"typeVariable?","qualifiedName":"Tey.Docgen.Model.typeVariable?","signatures":["typeVariable?(word: String) -> Bool"],"summary":"","types":["String","Bool"],"urlPath":"tey/docgen/model"},{"anchor":"function-tey-docgen-model-wordsof","kind":"function","line":346,"name":"wordsOf","qualifiedName":"Tey.Docgen.Model.wordsOf","signatures":["wordsOf(text: String) -> [String]"],"summary":"Identifier-ish runs of a type text: letters, digits, `_`, `?`, `!`.","types":["String","[String]"],"urlPath":"tey/docgen/model"},{"anchor":"function-tey-docgen-model-wordsplit","kind":"function","line":350,"name":"wordSplit","qualifiedName":"Tey.Docgen.Model.wordSplit","signatures":["wordSplit(rest: String, word: String, out: [String]) -> [String]"],"summary":"","types":["String","[String]"],"urlPath":"tey/docgen/model"},{"anchor":"function-tey-docgen-model-slugof","kind":"function","line":362,"name":"slugOf","qualifiedName":"Tey.Docgen.Model.slugOf","signatures":["slugOf(name: String) -> String"],"summary":"An id-safe spelling of a name: lower case, every run of punctuation one dash. `?` and `!` survive — they are part of Kex names (`empty?`) and legal in a fragment.","types":["String"],"urlPath":"tey/docgen/model"},{"anchor":"function-tey-docgen-model-operatorslug","kind":"function","line":370,"name":"operatorSlug","qualifiedName":"Tey.Docgen.Model.operatorSlug","signatures":["operatorSlug(name: String) -> String"],"summary":"An operator method has no letters to slug: `+` is \"op-plus\", `<=>` is \"op-lt-eq-gt\" — distinct, stable and readable in a URL.","types":["String"],"urlPath":"tey/docgen/model"},{"anchor":"function-tey-docgen-model-operatorcharname","kind":"function","line":375,"name":"operatorCharName","qualifiedName":"Tey.Docgen.Model.operatorCharName","signatures":["operatorCharName(c: Char) -> String"],"summary":"","types":["Char","String"],"urlPath":"tey/docgen/model"},{"anchor":"function-tey-docgen-model-basetypeof","kind":"function","line":400,"name":"baseTypeOf","qualifiedName":"Tey.Docgen.Model.baseTypeOf","signatures":["baseTypeOf(target: String) -> String"],"summary":"\"[X]\" -> \"List\", \"{K: V}\" -> \"Map\", \"FileHandle<R, W>\" -> \"FileHandle\", \"Map<K, V>\" -> \"Map\": the type a make block extends, whatever specialisation it spells.","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]","withTypeHomes(links: [LinkEntry], types: [Tey.Docgen.Model.TypeFacts]) -> [LinkEntry]","linkEntriesOnPage(entities: [Entity], urlPath: String) -> [LinkEntry]","memberLinks(ownerName: String, owner: String, functions: [Tey.Docgen.Model.FunctionEntry], 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]","[Tey.Docgen.Model.TypeFacts]","[Tey.Docgen.Model.FunctionEntry]","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-withtypehomes","kind":"function","line":106,"name":"withTypeHomes","qualifiedName":"Tey.Docgen.Nav.withTypeHomes","signatures":["withTypeHomes(links: [LinkEntry], types: [Tey.Docgen.Model.TypeFacts]) -> [LinkEntry]"],"summary":"The links, plus a home for every type that make blocks extend. A bare `Integer` is claimed by a module (number parsing) AND by five make blocks, so the uniqueness rule drops it — yet a type name in a signature means the type, and the type has a home page (Relations.homePathOf). Those homes fill in what uniqueness left out; a name that already links keeps its link.","types":["[LinkEntry]","[Tey.Docgen.Model.TypeFacts]"],"urlPath":"tey/docgen/nav"},{"anchor":"function-tey-docgen-nav-linkentriesonpage","kind":"function","line":113,"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-memberlinks","kind":"function","line":130,"name":"memberLinks","qualifiedName":"Tey.Docgen.Nav.memberLinks","signatures":["memberLinks(ownerName: String, owner: String, functions: [Tey.Docgen.Model.FunctionEntry], urlPath: String) -> [LinkEntry]"],"summary":"`List.map`, `Enumerable.filter`: members are linkable under their owner's name, so prose that writes `List.map` lands on the method.","types":["String","[Tey.Docgen.Model.FunctionEntry]","[LinkEntry]"],"urlPath":"tey/docgen/nav"},{"anchor":"function-tey-docgen-nav-linkablenames","kind":"function","line":141,"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":161,"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":167,"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":171,"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":178,"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":184,"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":195,"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":202,"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":209,"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":215,"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":222,"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":226,"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","rewriteProseBlocks(blocks: [[String]]) -> [[String]]","rewriteProseBlock(block: [String]) -> [String]","rewritePlusPairs(s: String, accum: String) -> String","plusPair?(head: String, inner: String, tail: String) -> Bool","boundaryBefore?(head: String) -> Bool","boundaryAfter?(tail: String) -> Bool","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?","directiveBody(lines: [String], prefixLength: Integer) -> String","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":31,"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-rewriteproseblocks","kind":"function","line":45,"name":"rewriteProseBlocks","qualifiedName":"Tey.Docgen.Rdoc.rewriteProseBlocks","signatures":["rewriteProseBlocks(blocks: [[String]]) -> [[String]]"],"summary":"``code`` is prose markup, so it is rewritten per prose block — after the split, not before it. Rewriting the whole comment at once paired a `+` operator inside an indented code sample (say `1 + 1`) with the next prose pair (``describe``), turning the operator into a stray backtick and eating the markup. Verbatim blocks and `@example` code are Kex source and are left alone; `@param`/`@return` descriptions are prose and still rewrite. Pairing never crosses a block: each block is rewritten on its own.","types":["[[String]]"],"urlPath":"tey/docgen/rdoc"},{"anchor":"function-tey-docgen-rdoc-rewriteproseblock","kind":"function","line":49,"name":"rewriteProseBlock","qualifiedName":"Tey.Docgen.Rdoc.rewriteProseBlock","signatures":["rewriteProseBlock(block: [String]) -> [String]"],"summary":"","types":["[String]"],"urlPath":"tey/docgen/rdoc"},{"anchor":"function-tey-docgen-rdoc-rewritepluspairs","kind":"function","line":62,"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-pluspair?","kind":"function","line":87,"name":"plusPair?","qualifiedName":"Tey.Docgen.Rdoc.plusPair?","signatures":["plusPair?(head: String, inner: String, tail: String) -> Bool"],"summary":"A ``...`` pair is markup only when it reads as one: content with no space against either delimiter (so `1 + 1` stays an addition), no backtick inside (so converted spans never nest), and a non-identifier character on both sides (so `a+b` stays put even if it ever reaches here).","types":["String","Bool"],"urlPath":"tey/docgen/rdoc"},{"anchor":"function-tey-docgen-rdoc-boundarybefore?","kind":"function","line":103,"name":"boundaryBefore?","qualifiedName":"Tey.Docgen.Rdoc.boundaryBefore?","signatures":["boundaryBefore?(head: String) -> Bool"],"summary":"","types":["String","Bool"],"urlPath":"tey/docgen/rdoc"},{"anchor":"function-tey-docgen-rdoc-boundaryafter?","kind":"function","line":113,"name":"boundaryAfter?","qualifiedName":"Tey.Docgen.Rdoc.boundaryAfter?","signatures":["boundaryAfter?(tail: String) -> Bool"],"summary":"","types":["String","Bool"],"urlPath":"tey/docgen/rdoc"},{"anchor":"function-tey-docgen-rdoc-splitparagraphs","kind":"function","line":129,"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":164,"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":168,"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":179,"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":183,"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":193,"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":205,"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":211,"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":224,"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-directivebody","kind":"function","line":271,"name":"directiveBody","qualifiedName":"Tey.Docgen.Rdoc.directiveBody","signatures":["directiveBody(lines: [String], prefixLength: Integer) -> String"],"summary":"","types":["[String]","Integer","String"],"urlPath":"tey/docgen/rdoc"},{"anchor":"function-tey-docgen-rdoc-parseparam","kind":"function","line":278,"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":297,"name":"parseReturn","qualifiedName":"Tey.Docgen.Rdoc.parseReturn","signatures":["parseReturn(lines: [String]) -> Return"],"summary":"Reads a `@return [Type] description` directive.","types":["[String]","Return"],"urlPath":"tey/docgen/rdoc"},{"anchor":"function-tey-docgen-rdoc-parseexample","kind":"function","line":305,"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":313,"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":330,"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-relations","kind":"module","line":11,"name":"Tey.Docgen.Relations","qualifiedName":"Tey.Docgen.Relations","signatures":["build(pages: [SourcePage]) -> ([TypeFacts], [TraitFacts])","pageExtensions(page: SourcePage, entities: [Entity]) -> [Extension]","extensionOf(page: SourcePage, entity: Entity, entry: MakeEntry) -> Extension","typeFacts(base: String, extensions: [Extension], pages: [SourcePage]) -> TypeFacts","homePathOf(base: String, mine: [Extension], pages: [SourcePage]) -> String","homeAnchorOf(base: String, home: String, mine: [Extension], pages: [SourcePage]) -> String","declarationAnchors(entities: [Entity], base: String) -> [String]","companionModule?(entities: [Entity], base: String) -> Bool","declares?(entities: [Entity], base: String) -> Bool","pageTraits(page: SourcePage, entities: [Entity], extensions: [Extension]) -> [TraitFacts]","namesTrait?(written: String, name: String, qualifiedName: String) -> Bool","typeFactsFor(model: PackageModel, base: String) -> TypeFacts?","traitFactsFor(model: PackageModel, written: String) -> TraitFacts?","traitEntryFor(model: PackageModel, facts: TraitFacts) -> TraitEntry?","traitEntries(entities: [Entity]) -> [TraitEntry]","traitMethods(model: PackageModel, entry: TraitEntry) -> ([FunctionEntry], [FunctionEntry])","traitDefaults(entities: [Entity], entry: TraitEntry) -> [FunctionEntry]","traitTarget?(model: PackageModel, target: String) -> Bool","allFunctions(entities: [Entity]) -> [FunctionEntry]","required?(f: FunctionEntry) -> Bool"],"summary":"","types":["[SourcePage]","([TypeFacts], [TraitFacts])","SourcePage","[Entity]","[Extension]","Entity","MakeEntry","Extension","String","TypeFacts","[String]","Bool","[TraitFacts]","PackageModel","TypeFacts?","TraitFacts?","TraitFacts","TraitEntry?","[TraitEntry]","TraitEntry","([FunctionEntry], [FunctionEntry])","[FunctionEntry]","FunctionEntry"],"urlPath":"tey/docgen/relations"},{"anchor":"function-tey-docgen-relations-build","kind":"function","line":14,"name":"build","qualifiedName":"Tey.Docgen.Relations.build","signatures":["build(pages: [SourcePage]) -> ([TypeFacts], [TraitFacts])"],"summary":"","types":["[SourcePage]","([TypeFacts], [TraitFacts])"],"urlPath":"tey/docgen/relations"},{"anchor":"function-tey-docgen-relations-pageextensions","kind":"function","line":25,"name":"pageExtensions","qualifiedName":"Tey.Docgen.Relations.pageExtensions","signatures":["pageExtensions(page: SourcePage, entities: [Entity]) -> [Extension]"],"summary":"","types":["SourcePage","[Entity]","[Extension]"],"urlPath":"tey/docgen/relations"},{"anchor":"function-tey-docgen-relations-extensionof","kind":"function","line":35,"name":"extensionOf","qualifiedName":"Tey.Docgen.Relations.extensionOf","signatures":["extensionOf(page: SourcePage, entity: Entity, entry: MakeEntry) -> Extension"],"summary":"","types":["SourcePage","Entity","MakeEntry","Extension"],"urlPath":"tey/docgen/relations"},{"anchor":"function-tey-docgen-relations-typefacts","kind":"function","line":46,"name":"typeFacts","qualifiedName":"Tey.Docgen.Relations.typeFacts","signatures":["typeFacts(base: String, extensions: [Extension], pages: [SourcePage]) -> TypeFacts"],"summary":"","types":["String","[Extension]","[SourcePage]","TypeFacts"],"urlPath":"tey/docgen/relations"},{"anchor":"function-tey-docgen-relations-homepathof","kind":"function","line":62,"name":"homePathOf","qualifiedName":"Tey.Docgen.Relations.homePathOf","signatures":["homePathOf(base: String, mine: [Extension], pages: [SourcePage]) -> String"],"summary":"Where a reader should land for a type: the page declaring it; else the page titled after it (string.kex for the builtin String); else the page whose make block adds the most methods — number.kex for Integer, not algebra.kex, which only makes it a Monoid.","types":["String","[Extension]","[SourcePage]"],"urlPath":"tey/docgen/relations"},{"anchor":"function-tey-docgen-relations-homeanchorof","kind":"function","line":83,"name":"homeAnchorOf","qualifiedName":"Tey.Docgen.Relations.homeAnchorOf","signatures":["homeAnchorOf(base: String, home: String, mine: [Extension], pages: [SourcePage]) -> String"],"summary":"","types":["String","[Extension]","[SourcePage]"],"urlPath":"tey/docgen/relations"},{"anchor":"function-tey-docgen-relations-declarationanchors","kind":"function","line":95,"name":"declarationAnchors","qualifiedName":"Tey.Docgen.Relations.declarationAnchors","signatures":["declarationAnchors(entities: [Entity], base: String) -> [String]"],"summary":"","types":["[Entity]","String","[String]"],"urlPath":"tey/docgen/relations"},{"anchor":"function-tey-docgen-relations-companionmodule?","kind":"function","line":106,"name":"companionModule?","qualifiedName":"Tey.Docgen.Relations.companionModule?","signatures":["companionModule?(entities: [Entity], base: String) -> Bool"],"summary":"","types":["[Entity]","String","Bool"],"urlPath":"tey/docgen/relations"},{"anchor":"function-tey-docgen-relations-declares?","kind":"function","line":115,"name":"declares?","qualifiedName":"Tey.Docgen.Relations.declares?","signatures":["declares?(entities: [Entity], base: String) -> Bool"],"summary":"","types":["[Entity]","String","Bool"],"urlPath":"tey/docgen/relations"},{"anchor":"function-tey-docgen-relations-pagetraits","kind":"function","line":126,"name":"pageTraits","qualifiedName":"Tey.Docgen.Relations.pageTraits","signatures":["pageTraits(page: SourcePage, entities: [Entity], extensions: [Extension]) -> [TraitFacts]"],"summary":"","types":["SourcePage","[Entity]","[Extension]","[TraitFacts]"],"urlPath":"tey/docgen/relations"},{"anchor":"function-tey-docgen-relations-namestrait?","kind":"function","line":144,"name":"namesTrait?","qualifiedName":"Tey.Docgen.Relations.namesTrait?","signatures":["namesTrait?(written: String, name: String, qualifiedName: String) -> Bool"],"summary":"`implement: Enumerable` and `implement: Kex.Enumerable` both name the trait declared as `Enumerable` inside `module Kex`.","types":["String","Bool"],"urlPath":"tey/docgen/relations"},{"anchor":"function-tey-docgen-relations-typefactsfor","kind":"function","line":150,"name":"typeFactsFor","qualifiedName":"Tey.Docgen.Relations.typeFactsFor","signatures":["typeFactsFor(model: PackageModel, base: String) -> TypeFacts?"],"summary":"The facts for the type a make target extends, if any make extends it.","types":["PackageModel","String","TypeFacts?"],"urlPath":"tey/docgen/relations"},{"anchor":"function-tey-docgen-relations-traitfactsfor","kind":"function","line":154,"name":"traitFactsFor","qualifiedName":"Tey.Docgen.Relations.traitFactsFor","signatures":["traitFactsFor(model: PackageModel, written: String) -> TraitFacts?"],"summary":"","types":["PackageModel","String","TraitFacts?"],"urlPath":"tey/docgen/relations"},{"anchor":"function-tey-docgen-relations-traitentryfor","kind":"function","line":159,"name":"traitEntryFor","qualifiedName":"Tey.Docgen.Relations.traitEntryFor","signatures":["traitEntryFor(model: PackageModel, facts: TraitFacts) -> TraitEntry?"],"summary":"The declaration of a trait, for its method list.","types":["PackageModel","TraitFacts","TraitEntry?"],"urlPath":"tey/docgen/relations"},{"anchor":"function-tey-docgen-relations-traitentries","kind":"function","line":164,"name":"traitEntries","qualifiedName":"Tey.Docgen.Relations.traitEntries","signatures":["traitEntries(entities: [Entity]) -> [TraitEntry]"],"summary":"","types":["[Entity]","[TraitEntry]"],"urlPath":"tey/docgen/relations"},{"anchor":"function-tey-docgen-relations-traitmethods","kind":"function","line":178,"name":"traitMethods","qualifiedName":"Tey.Docgen.Relations.traitMethods","signatures":["traitMethods(model: PackageModel, entry: TraitEntry) -> ([FunctionEntry], [FunctionEntry])"],"summary":"A trait's methods as an implementor sees them. Required: declared with no body and given no default anywhere. Provided: a body in the trait, or a default from a `make <Trait>` block in any file — plus methods such a block adds that the trait never declared.","types":["PackageModel","TraitEntry","([FunctionEntry], [FunctionEntry])"],"urlPath":"tey/docgen/relations"},{"anchor":"function-tey-docgen-relations-traitdefaults","kind":"function","line":187,"name":"traitDefaults","qualifiedName":"Tey.Docgen.Relations.traitDefaults","signatures":["traitDefaults(entities: [Entity], entry: TraitEntry) -> [FunctionEntry]"],"summary":"","types":["[Entity]","TraitEntry","[FunctionEntry]"],"urlPath":"tey/docgen/relations"},{"anchor":"function-tey-docgen-relations-traittarget?","kind":"function","line":201,"name":"traitTarget?","qualifiedName":"Tey.Docgen.Relations.traitTarget?","signatures":["traitTarget?(model: PackageModel, target: String) -> Bool"],"summary":"Whether a make target names a trait of this package.","types":["PackageModel","String","Bool"],"urlPath":"tey/docgen/relations"},{"anchor":"function-tey-docgen-relations-allfunctions","kind":"function","line":208,"name":"allFunctions","qualifiedName":"Tey.Docgen.Relations.allFunctions","signatures":["allFunctions(entities: [Entity]) -> [FunctionEntry]"],"summary":"Every function documented anywhere in these entities: top-level and module functions, trait methods, make members.","types":["[Entity]","[FunctionEntry]"],"urlPath":"tey/docgen/relations"},{"anchor":"function-tey-docgen-relations-required?","kind":"function","line":222,"name":"required?","qualifiedName":"Tey.Docgen.Relations.required?","signatures":["required?(f: FunctionEntry) -> Bool"],"summary":"A trait method with no clause is one an implementor must write; one with a body comes for free.","types":["FunctionEntry","Bool"],"urlPath":"tey/docgen/relations"},{"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(filePath: String, _request: Request<Binary>, _context: Context) -> Response<Binary>","contentTypeFor(path: String) -> String"],"summary":"","types":["String","OptionParser.ParsedOptions","Integer","[String]","[ServedFile]","Request<Binary>","Context","Response<Binary>"],"urlPath":"tey/docgen/serve"},{"anchor":"record-tey-docgen-serve-servedfile","kind":"record","line":8,"name":"ServedFile","qualifiedName":"Tey.Docgen.Serve.ServedFile","signatures":[],"summary":"","types":["String"],"urlPath":"tey/docgen/serve"},{"anchor":"function-tey-docgen-serve-servecommand","kind":"function","line":13,"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":52,"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":60,"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":73,"name":"serveFile","qualifiedName":"Tey.Docgen.Serve.serveFile","signatures":["serveFile(filePath: String, _request: Request<Binary>, _context: Context) -> Response<Binary>"],"summary":"A route handler once `filePath` is applied: `~serveFile(path)`. Reads the file as bytes, not text: the site ships images and fonts beside its HTML, and decoding those as UTF-8 would turn them into a 404.","types":["String","Request<Binary>","Context","Response<Binary>"],"urlPath":"tey/docgen/serve"},{"anchor":"function-tey-docgen-serve-contenttypefor","kind":"function","line":90,"name":"contentTypeFor","qualifiedName":"Tey.Docgen.Serve.contentTypeFor","signatures":["contentTypeFor(path: String) -> String"],"summary":"","types":["String"],"urlPath":"tey/docgen/serve"}],"generatedAt":"2026-10-30T20:38:05.585006816Z","package":"tey","version":"0.2.1-dev"}