{"entries":[{"anchor":"type-ordering","kind":"type","line":11,"name":"Ordering","qualifiedName":"Ordering","signatures":[],"summary":"The result of `Comparable.compare`. Declared here rather than only inside the interpreter so that `Ordering`, `Less`, `Equal` and `Greater` reach the semantic layer the same way every other stdlib type does — through the collected interfaces — instead of existing solely as native environment bindings the type checker and name resolver cannot see.","types":[],"urlPath":"algebra"},{"anchor":"trait-comparable","kind":"trait","line":13,"name":"Comparable","qualifiedName":"Comparable","signatures":["compare : This -> Ordering"],"summary":"","types":["(This) -> Ordering"],"urlPath":"algebra"},{"anchor":"comparable-compare","kind":"function","line":16,"name":"compare","qualifiedName":"Comparable.compare","signatures":["compare : This -> Ordering"],"summary":"A total order: `compare` answers Less, Equal or Greater. `==` stays independent — a type may be Equatable without being ordered.","types":["(This) -> Ordering"],"urlPath":"algebra"},{"anchor":"make-number","kind":"make","line":22,"name":"Number","qualifiedName":"Number","signatures":["compare(other: Number) -> Ordering"],"summary":"Number carries the implementation, so Integer and Float both inherit it rather than repeating the same three comparisons. Mixed receivers work because `<` and `>` promote across the two (`1.compare(1.0)` is Equal).","types":["Number","Ordering"],"urlPath":"algebra"},{"anchor":"number-compare","kind":"function","line":23,"name":"compare","qualifiedName":"Number.compare","signatures":["compare(other: Number) -> Ordering"],"summary":"","types":["Number","Ordering"],"urlPath":"algebra"},{"anchor":"trait-monoid","kind":"trait","line":30,"name":"Monoid","qualifiedName":"Monoid","signatures":["identity : This","combine : This -> This","repeat(n: Integer) -> This"],"summary":"","types":["This","(This) -> This","Integer"],"urlPath":"algebra"},{"anchor":"monoid-identity","kind":"function","line":32,"name":"identity","qualifiedName":"Monoid.identity","signatures":["identity : This"],"summary":"`combine` must be associative and `identity` neutral on both sides.","types":["This"],"urlPath":"algebra"},{"anchor":"monoid-combine","kind":"function","line":33,"name":"combine","qualifiedName":"Monoid.combine","signatures":["combine : This -> This"],"summary":"","types":["(This) -> This"],"urlPath":"algebra"},{"anchor":"monoid-repeat","kind":"function","line":37,"name":"repeat","qualifiedName":"Monoid.repeat","signatures":["repeat(n: Integer) -> This"],"summary":"Combines this value with itself `n` times. Repeating zero times returns the monoid identity; a negative repetition count is invalid.","types":["Integer","This"],"urlPath":"algebra"},{"anchor":"trait-group","kind":"trait","line":45,"name":"Group","qualifiedName":"Group","signatures":["identity : This","combine : This -> This","inverse : This"],"summary":"","types":["This","(This) -> This"],"urlPath":"algebra"},{"anchor":"group-identity","kind":"function","line":47,"name":"identity","qualifiedName":"Group.identity","signatures":["identity : This"],"summary":"Combining a value with its inverse must produce `identity`.","types":["This"],"urlPath":"algebra"},{"anchor":"group-combine","kind":"function","line":48,"name":"combine","qualifiedName":"Group.combine","signatures":["combine : This -> This"],"summary":"","types":["(This) -> This"],"urlPath":"algebra"},{"anchor":"group-inverse","kind":"function","line":49,"name":"inverse","qualifiedName":"Group.inverse","signatures":["inverse : This"],"summary":"","types":["This"],"urlPath":"algebra"},{"anchor":"make-integer","kind":"make","line":52,"name":"Integer","qualifiedName":"Integer","signatures":["combine(other: This) -> This","inverse : This"],"summary":"","types":["This"],"urlPath":"algebra"},{"anchor":"integer-identity","kind":"function","line":53,"name":"identity","qualifiedName":"Integer.identity","signatures":[],"summary":"","types":[],"urlPath":"algebra"},{"anchor":"integer-combine","kind":"function","line":54,"name":"combine","qualifiedName":"Integer.combine","signatures":["combine(other: This) -> This"],"summary":"","types":["This"],"urlPath":"algebra"},{"anchor":"integer-inverse","kind":"function","line":55,"name":"inverse","qualifiedName":"Integer.inverse","signatures":["inverse : This"],"summary":"","types":[],"urlPath":"algebra"},{"anchor":"make-string","kind":"make","line":58,"name":"String","qualifiedName":"String","signatures":["combine(other: This) -> This"],"summary":"","types":["This"],"urlPath":"algebra"},{"anchor":"string-identity","kind":"function","line":59,"name":"identity","qualifiedName":"String.identity","signatures":[],"summary":"","types":[],"urlPath":"algebra"},{"anchor":"string-combine","kind":"function","line":60,"name":"combine","qualifiedName":"String.combine","signatures":["combine(other: This) -> This"],"summary":"","types":["This"],"urlPath":"algebra"},{"anchor":"make-list","kind":"make","line":63,"name":"[A]","qualifiedName":"[A]","signatures":["combine(other: This) -> This"],"summary":"","types":["This"],"urlPath":"algebra"},{"anchor":"list-identity","kind":"function","line":64,"name":"identity","qualifiedName":"List.identity","signatures":[],"summary":"","types":[],"urlPath":"algebra"},{"anchor":"list-combine","kind":"function","line":65,"name":"combine","qualifiedName":"List.combine","signatures":["combine(other: This) -> This"],"summary":"","types":["This"],"urlPath":"algebra"},{"anchor":"make-ordering","kind":"make","line":75,"name":"Ordering","qualifiedName":"Ordering","signatures":["combine(_, other: Ordering) -> Ordering","reverse : Ordering","thenBy : Block<Ordering> -> Ordering"],"summary":"Ordering is a Monoid under \"first decision wins\", with Equal as identity. That is what makes multi-key comparison compose instead of nesting ifs:\n\n```kex\na.name.compare(b.name).combine(a.age.compare(b.age))\n```\n\n`combine` evaluates its argument eagerly, so the later comparison runs even when the earlier one already decided. Use `thenBy` when that matters.","types":["Ordering","(Block<Ordering>) -> Ordering"],"urlPath":"algebra"},{"anchor":"ordering-identity","kind":"function","line":76,"name":"identity","qualifiedName":"Ordering.identity","signatures":[],"summary":"","types":[],"urlPath":"algebra"},{"anchor":"ordering-combine","kind":"function","line":78,"name":"combine","qualifiedName":"Ordering.combine","signatures":["combine(_, other: Ordering) -> Ordering"],"summary":"","types":["Ordering"],"urlPath":"algebra"},{"anchor":"ordering-reverse","kind":"function","line":83,"name":"reverse","qualifiedName":"Ordering.reverse","signatures":["reverse : Ordering"],"summary":"Swaps Less and Greater and fixes Equal — descending order.","types":["Ordering"],"urlPath":"algebra"},{"anchor":"ordering-thenby","kind":"function","line":92,"name":"thenBy","qualifiedName":"Ordering.thenBy","signatures":["thenBy : Block<Ordering> -> Ordering"],"summary":"Short-circuiting `combine`: the tie-breaker block runs only when this comparison is Equal, so it costs nothing once the order is decided.\n\n```kex\na.name.compare(b.name).thenBy { a.age.compare(b.age) }\n```","types":["(Block<Ordering>) -> Ordering","Ordering"],"urlPath":"algebra"},{"anchor":"module-bits","kind":"module","line":7,"name":"Bits","qualifiedName":"Bits","signatures":["and(a: Integer, b: Integer) -> Integer","or(a: Integer, b: Integer) -> Integer","xor(a: Integer, b: Integer) -> Integer","not(a: Integer) -> Integer","shiftLeft(n: Integer, by: Integer) -> Integer","shiftRight(n: Integer, by: Integer) -> Integer","test?(n: Integer, index: Integer) -> Bool","set(n: Integer, index: Integer) -> Integer","clear(n: Integer, index: Integer) -> Integer","toggle(n: Integer, index: Integer) -> Integer","count(n: Integer) -> Integer","width(n: Integer) -> Integer"],"summary":"The `Bits` module provides bitwise operations on `Integer`.\n\nIntegers are arbitrary precision, and a negative one behaves as if it were written in infinite-precision two's complement — so `Bits.not(0)` is `-1` and `Bits.and(-1, 255)` is `255`, with no word size to overflow. Shifts and bit indices count from bit 0 (the least significant bit).","types":["Integer","Bool"],"urlPath":"bits"},{"anchor":"function-bits-and","kind":"function","line":17,"name":"and","qualifiedName":"Bits.and","signatures":["and(a: Integer, b: Integer) -> Integer"],"summary":"Bitwise AND of `a` and `b`.","types":["Integer"],"urlPath":"bits"},{"anchor":"function-bits-or","kind":"function","line":28,"name":"or","qualifiedName":"Bits.or","signatures":["or(a: Integer, b: Integer) -> Integer"],"summary":"Bitwise OR of `a` and `b`.","types":["Integer"],"urlPath":"bits"},{"anchor":"function-bits-xor","kind":"function","line":39,"name":"xor","qualifiedName":"Bits.xor","signatures":["xor(a: Integer, b: Integer) -> Integer"],"summary":"Bitwise exclusive OR of `a` and `b`.","types":["Integer"],"urlPath":"bits"},{"anchor":"function-bits-not","kind":"function","line":51,"name":"not","qualifiedName":"Bits.not","signatures":["not(a: Integer) -> Integer"],"summary":"Bitwise complement of `a`. Every integer is signed and unbounded, so this is always +-(a + 1)+ rather than a width-dependent mask.","types":["Integer"],"urlPath":"bits"},{"anchor":"function-bits-shiftleft","kind":"function","line":62,"name":"shiftLeft","qualifiedName":"Bits.shiftLeft","signatures":["shiftLeft(n: Integer, by: Integer) -> Integer"],"summary":"Shifts `n` left by `by` bits. Raises if `by` is negative.","types":["Integer"],"urlPath":"bits"},{"anchor":"function-bits-shiftright","kind":"function","line":75,"name":"shiftRight","qualifiedName":"Bits.shiftRight","signatures":["shiftRight(n: Integer, by: Integer) -> Integer"],"summary":"Shifts `n` right by `by` bits, propagating the sign — the result of shifting a negative number stays negative. Raises if `by` is negative.","types":["Integer"],"urlPath":"bits"},{"anchor":"function-bits-test?","kind":"function","line":87,"name":"test?","qualifiedName":"Bits.test?","signatures":["test?(n: Integer, index: Integer) -> Bool"],"summary":"True when the bit at `index` of `n` is set. Raises if `index` is negative.","types":["Integer","Bool"],"urlPath":"bits"},{"anchor":"function-bits-set","kind":"function","line":98,"name":"set","qualifiedName":"Bits.set","signatures":["set(n: Integer, index: Integer) -> Integer"],"summary":"`n` with the bit at `index` set. Raises if `index` is negative.","types":["Integer"],"urlPath":"bits"},{"anchor":"function-bits-clear","kind":"function","line":109,"name":"clear","qualifiedName":"Bits.clear","signatures":["clear(n: Integer, index: Integer) -> Integer"],"summary":"`n` with the bit at `index` cleared. Raises if `index` is negative.","types":["Integer"],"urlPath":"bits"},{"anchor":"function-bits-toggle","kind":"function","line":120,"name":"toggle","qualifiedName":"Bits.toggle","signatures":["toggle(n: Integer, index: Integer) -> Integer"],"summary":"`n` with the bit at `index` flipped. Raises if `index` is negative.","types":["Integer"],"urlPath":"bits"},{"anchor":"function-bits-count","kind":"function","line":131,"name":"count","qualifiedName":"Bits.count","signatures":["count(n: Integer) -> Integer"],"summary":"Number of set bits in `n` (population count). A negative value has infinitely many under two's complement, so this raises for one.","types":["Integer"],"urlPath":"bits"},{"anchor":"function-bits-width","kind":"function","line":144,"name":"width","qualifiedName":"Bits.width","signatures":["width(n: Integer) -> Integer"],"summary":"Number of bits needed to represent `n`, i.e. the position of its highest set bit plus one. Zero needs none. Raises for a negative value.","types":["Integer"],"urlPath":"bits"},{"anchor":"trait-blankable","kind":"trait","line":5,"name":"Blankable","qualifiedName":"Blankable","signatures":["blank? : Bool"],"summary":"","types":["Bool"],"urlPath":"blankable"},{"anchor":"blankable-blank?","kind":"function","line":6,"name":"blank?","qualifiedName":"Blankable.blank?","signatures":["blank? : Bool"],"summary":"","types":["Bool"],"urlPath":"blankable"},{"anchor":"make-bool","kind":"make","line":10,"name":"Bool","qualifiedName":"Bool","signatures":["blank? : Bool"],"summary":"","types":[],"urlPath":"blankable"},{"anchor":"bool-blank?","kind":"function","line":11,"name":"blank?","qualifiedName":"Bool.blank?","signatures":["blank? : Bool"],"summary":"","types":[],"urlPath":"blankable"},{"anchor":"make-integer","kind":"make","line":15,"name":"Integer","qualifiedName":"Integer","signatures":["blank? : Bool"],"summary":"","types":["Bool"],"urlPath":"blankable"},{"anchor":"integer-blank?","kind":"function","line":16,"name":"blank?","qualifiedName":"Integer.blank?","signatures":["blank? : Bool"],"summary":"","types":["Bool"],"urlPath":"blankable"},{"anchor":"make-float","kind":"make","line":20,"name":"Float","qualifiedName":"Float","signatures":["blank? : Bool"],"summary":"","types":["Bool"],"urlPath":"blankable"},{"anchor":"float-blank?","kind":"function","line":21,"name":"blank?","qualifiedName":"Float.blank?","signatures":["blank? : Bool"],"summary":"","types":["Bool"],"urlPath":"blankable"},{"anchor":"make-string","kind":"make","line":25,"name":"String","qualifiedName":"String","signatures":["blank? : Bool"],"summary":"","types":[],"urlPath":"blankable"},{"anchor":"string-blank?","kind":"function","line":26,"name":"blank?","qualifiedName":"String.blank?","signatures":["blank? : Bool"],"summary":"","types":[],"urlPath":"blankable"},{"anchor":"make-optional","kind":"make","line":30,"name":"Optional<X>","qualifiedName":"Optional<X>","signatures":["blank? : Bool"],"summary":"","types":["Bool"],"urlPath":"blankable"},{"anchor":"optional-blank?","kind":"function","line":31,"name":"blank?","qualifiedName":"Optional.blank?","signatures":["blank? : Bool"],"summary":"","types":["Bool"],"urlPath":"blankable"},{"anchor":"make-list","kind":"make","line":36,"name":"[X]","qualifiedName":"[X]","signatures":["blank? : Bool"],"summary":"","types":["Bool"],"urlPath":"blankable"},{"anchor":"list-blank?","kind":"function","line":37,"name":"blank?","qualifiedName":"List.blank?","signatures":["blank? : Bool"],"summary":"","types":["Bool"],"urlPath":"blankable"},{"anchor":"module-console","kind":"module","line":3,"name":"Console","qualifiedName":"Console","signatures":["colorize(text: String, color: String) -> String"],"summary":"ANSI terminal styling. Color constants become empty strings when Kex is started with --no-colors, so callers can compose them without branching.","types":["","String","Bool"],"urlPath":"console"},{"anchor":"constant-console-reset","kind":"constant","line":4,"name":"RESET","qualifiedName":"Console.RESET","signatures":[],"summary":"","types":[""],"urlPath":"console"},{"anchor":"constant-console-bold","kind":"constant","line":5,"name":"BOLD","qualifiedName":"Console.BOLD","signatures":[],"summary":"","types":[""],"urlPath":"console"},{"anchor":"constant-console-dim","kind":"constant","line":6,"name":"DIM","qualifiedName":"Console.DIM","signatures":[],"summary":"","types":[""],"urlPath":"console"},{"anchor":"constant-console-italic","kind":"constant","line":7,"name":"ITALIC","qualifiedName":"Console.ITALIC","signatures":[],"summary":"","types":[""],"urlPath":"console"},{"anchor":"constant-console-underline","kind":"constant","line":8,"name":"UNDERLINE","qualifiedName":"Console.UNDERLINE","signatures":[],"summary":"","types":[""],"urlPath":"console"},{"anchor":"constant-console-blink","kind":"constant","line":9,"name":"BLINK","qualifiedName":"Console.BLINK","signatures":[],"summary":"","types":[""],"urlPath":"console"},{"anchor":"constant-console-reverse","kind":"constant","line":10,"name":"REVERSE","qualifiedName":"Console.REVERSE","signatures":[],"summary":"","types":[""],"urlPath":"console"},{"anchor":"constant-console-hidden","kind":"constant","line":11,"name":"HIDDEN","qualifiedName":"Console.HIDDEN","signatures":[],"summary":"","types":[""],"urlPath":"console"},{"anchor":"constant-console-strikethrough","kind":"constant","line":12,"name":"STRIKETHROUGH","qualifiedName":"Console.STRIKETHROUGH","signatures":[],"summary":"","types":[""],"urlPath":"console"},{"anchor":"constant-console-red","kind":"constant","line":13,"name":"RED","qualifiedName":"Console.RED","signatures":[],"summary":"","types":[""],"urlPath":"console"},{"anchor":"constant-console-green","kind":"constant","line":14,"name":"GREEN","qualifiedName":"Console.GREEN","signatures":[],"summary":"","types":[""],"urlPath":"console"},{"anchor":"constant-console-yellow","kind":"constant","line":15,"name":"YELLOW","qualifiedName":"Console.YELLOW","signatures":[],"summary":"","types":[""],"urlPath":"console"},{"anchor":"constant-console-blue","kind":"constant","line":16,"name":"BLUE","qualifiedName":"Console.BLUE","signatures":[],"summary":"","types":[""],"urlPath":"console"},{"anchor":"constant-console-magenta","kind":"constant","line":17,"name":"MAGENTA","qualifiedName":"Console.MAGENTA","signatures":[],"summary":"","types":[""],"urlPath":"console"},{"anchor":"constant-console-cyan","kind":"constant","line":18,"name":"CYAN","qualifiedName":"Console.CYAN","signatures":[],"summary":"","types":[""],"urlPath":"console"},{"anchor":"constant-console-white","kind":"constant","line":19,"name":"WHITE","qualifiedName":"Console.WHITE","signatures":[],"summary":"","types":[""],"urlPath":"console"},{"anchor":"constant-console-gray","kind":"constant","line":20,"name":"GRAY","qualifiedName":"Console.GRAY","signatures":[],"summary":"","types":[""],"urlPath":"console"},{"anchor":"constant-console-purple","kind":"constant","line":21,"name":"PURPLE","qualifiedName":"Console.PURPLE","signatures":[],"summary":"","types":[""],"urlPath":"console"},{"anchor":"constant-console-clear","kind":"constant","line":27,"name":"CLEAR","qualifiedName":"Console.CLEAR","signatures":[],"summary":"Cursor and screen control, empty under --no-colors like the styles above. CLEAR erases the screen and homes the cursor; HOME only moves the cursor, so a redraw paints over the previous frame without a blank flash between them; CLEARLINE erases the current line and returns to its start.","types":[""],"urlPath":"console"},{"anchor":"constant-console-home","kind":"constant","line":28,"name":"HOME","qualifiedName":"Console.HOME","signatures":[],"summary":"","types":[""],"urlPath":"console"},{"anchor":"constant-console-clearline","kind":"constant","line":29,"name":"CLEARLINE","qualifiedName":"Console.CLEARLINE","signatures":[],"summary":"","types":[""],"urlPath":"console"},{"anchor":"function-console-colorize","kind":"function","line":32,"name":"colorize","qualifiedName":"Console.colorize","signatures":["colorize(text: String, color: String) -> String"],"summary":"Wrap `text` in an ANSI style and reset attributes afterwards.","types":["String"],"urlPath":"console"},{"anchor":"constant-console-enabled?","kind":"constant","line":36,"name":"enabled?","qualifiedName":"Console.enabled?","signatures":[],"summary":"Whether terminal styling is enabled for this process.","types":["Bool"],"urlPath":"console"},{"anchor":"module-digest","kind":"module","line":3,"name":"Digest","qualifiedName":"Digest","signatures":["sha256(content: String) -> String","fileSha256(path: String) -> String?"],"summary":"Cryptographic content digests. Hex strings are used at the public boundary so Kex programs never need to handle backend-specific binary values.","types":["String","String?"],"urlPath":"digest"},{"anchor":"function-digest-sha256","kind":"function","line":4,"name":"sha256","qualifiedName":"Digest.sha256","signatures":["sha256(content: String) -> String"],"summary":"","types":["String"],"urlPath":"digest"},{"anchor":"function-digest-filesha256","kind":"function","line":7,"name":"fileSha256","qualifiedName":"Digest.fileSha256","signatures":["fileSha256(path: String) -> String?"],"summary":"","types":["String","String?"],"urlPath":"digest"},{"anchor":"trait-foldable","kind":"trait","line":6,"name":"Foldable","qualifiedName":"Foldable","signatures":["reduce : A -> (A -> T -> A) -> A","each(f)","eachIndexed(f)","all?(pred)","any?(pred)","find(pred)","count(pred)"],"summary":"","types":["(A) -> ((A) -> (T) -> A) -> A"],"urlPath":"enumerable"},{"anchor":"foldable-reduce","kind":"function","line":7,"name":"reduce","qualifiedName":"Foldable.reduce","signatures":["reduce : A -> (A -> T -> A) -> A"],"summary":"","types":["(A) -> ((A) -> (T) -> A) -> A"],"urlPath":"enumerable"},{"anchor":"foldable-each","kind":"function","line":10,"name":"each","qualifiedName":"Foldable.each","signatures":["each(f)"],"summary":"Applies `f` to each item for its side effects. Returns unit.","types":[],"urlPath":"enumerable"},{"anchor":"foldable-eachindexed","kind":"function","line":24,"name":"eachIndexed","qualifiedName":"Foldable.eachIndexed","signatures":["eachIndexed(f)"],"summary":"Applies `f` to each item together with its 0-based position, for side effects. Returns unit. The index is the LAST block parameter, so a Map entry can be taken either whole (`|entry, i|`) or spread (`|k, v, i|`).","types":[],"urlPath":"enumerable"},{"anchor":"foldable-all?","kind":"function","line":33,"name":"all?","qualifiedName":"Foldable.all?","signatures":["all?(pred)"],"summary":"True if every item satisfies `pred`.","types":[],"urlPath":"enumerable"},{"anchor":"foldable-any?","kind":"function","line":38,"name":"any?","qualifiedName":"Foldable.any?","signatures":["any?(pred)"],"summary":"True if at least one item satisfies `pred`.","types":[],"urlPath":"enumerable"},{"anchor":"foldable-find","kind":"function","line":43,"name":"find","qualifiedName":"Foldable.find","signatures":["find(pred)"],"summary":"The first item satisfying `pred` wrapped in Just, or None.","types":[],"urlPath":"enumerable"},{"anchor":"foldable-count","kind":"function","line":51,"name":"count","qualifiedName":"Foldable.count","signatures":["count(pred)"],"summary":"Counts the items for which `pred` holds.","types":[],"urlPath":"enumerable"},{"anchor":"trait-enumerable","kind":"trait","line":58,"name":"Enumerable","qualifiedName":"Enumerable","signatures":["reduce : A -> (A -> T -> A) -> A","map(f)","mapIndexed(f)","filter(pred)","flatMap(f)","collect(f)"],"summary":"Enumerable — collection-producing operations derived from a left fold.","types":["(A) -> ((A) -> (T) -> A) -> A"],"urlPath":"enumerable"},{"anchor":"enumerable-reduce","kind":"function","line":59,"name":"reduce","qualifiedName":"Enumerable.reduce","signatures":["reduce : A -> (A -> T -> A) -> A"],"summary":"","types":["(A) -> ((A) -> (T) -> A) -> A"],"urlPath":"enumerable"},{"anchor":"enumerable-map","kind":"function","line":62,"name":"map","qualifiedName":"Enumerable.map","signatures":["map(f)"],"summary":"Transforms each item by applying `f`, collecting the results into a list.","types":[],"urlPath":"enumerable"},{"anchor":"enumerable-mapindexed","kind":"function","line":74,"name":"mapIndexed","qualifiedName":"Enumerable.mapIndexed","signatures":["mapIndexed(f)"],"summary":"Transforms each item together with its 0-based position, collecting the results into a list. Index is the LAST block parameter — see eachIndexed.","types":[],"urlPath":"enumerable"},{"anchor":"enumerable-filter","kind":"function","line":86,"name":"filter","qualifiedName":"Enumerable.filter","signatures":["filter(pred)"],"summary":"Keeps the items for which `pred` holds.","types":[],"urlPath":"enumerable"},{"anchor":"enumerable-flatmap","kind":"function","line":94,"name":"flatMap","qualifiedName":"Enumerable.flatMap","signatures":["flatMap(f)"],"summary":"Maps each item to a list and concatenates the results.","types":[],"urlPath":"enumerable"},{"anchor":"enumerable-collect","kind":"function","line":101,"name":"collect","qualifiedName":"Enumerable.collect","signatures":["collect(f)"],"summary":"Maps each item through `f` (returning an `Optional`), keeping and unwrapping the `Just(y)` results and dropping `None`. Filter + map fused via an Optional-returning function.","types":[],"urlPath":"enumerable"},{"anchor":"module-env","kind":"module","line":35,"name":"ENV","qualifiedName":"ENV","signatures":["get(key, default)","has?(key)","keys","values","count","each(f)","entries","set(name, value)","unset(name)"],"summary":"ENV : Map<String, String>\n\n`main` receives the environment snapshot as its second parameter, which is the same immutable value exposed by global `ENV`. Reading the parameter is pure because the dependency is explicit in the function signature.","types":[],"urlPath":"env"},{"anchor":"function-env-get","kind":"function","line":36,"name":"get","qualifiedName":"ENV.get","signatures":["get(key, default)"],"summary":"","types":[],"urlPath":"env"},{"anchor":"function-env-has?","kind":"function","line":38,"name":"has?","qualifiedName":"ENV.has?","signatures":["has?(key)"],"summary":"","types":[],"urlPath":"env"},{"anchor":"function-env-keys","kind":"function","line":39,"name":"keys","qualifiedName":"ENV.keys","signatures":["keys"],"summary":"","types":[],"urlPath":"env"},{"anchor":"function-env-values","kind":"function","line":40,"name":"values","qualifiedName":"ENV.values","signatures":["values"],"summary":"","types":[],"urlPath":"env"},{"anchor":"function-env-count","kind":"function","line":41,"name":"count","qualifiedName":"ENV.count","signatures":["count"],"summary":"","types":[],"urlPath":"env"},{"anchor":"function-env-each","kind":"function","line":42,"name":"each","qualifiedName":"ENV.each","signatures":["each(f)"],"summary":"","types":[],"urlPath":"env"},{"anchor":"function-env-entries","kind":"function","line":43,"name":"entries","qualifiedName":"ENV.entries","signatures":["entries"],"summary":"","types":[],"urlPath":"env"},{"anchor":"function-env-set","kind":"function","line":52,"name":"set","qualifiedName":"ENV.set","signatures":["set(name, value)"],"summary":"Sets a variable for THIS process and every child it starts. `ENV` is a snapshot, so it is rebuilt by the write — a later `ENV.get` answers what was set, not what the process started with.\n\nThis is how a program decides what a child sees: `Kex.AST` shells out to the compiler named by `$KEX`, so a tool that knows which compiler it means says so here rather than hoping PATH agrees.","types":[],"urlPath":"env"},{"anchor":"function-env-unset","kind":"function","line":55,"name":"unset","qualifiedName":"ENV.unset","signatures":["unset(name)"],"summary":"Removes a variable from this process and its children.","types":[],"urlPath":"env"},{"anchor":"trait-errorable","kind":"trait","line":5,"name":"Errorable","qualifiedName":"Errorable","signatures":["message : String"],"summary":"Errorable — the trait for values that describe a failure. Implemented by error types that carry a human-readable message, so generic handlers can display or log any error uniformly (independent of the concrete error type's structured fields).","types":["String"],"urlPath":"errorable"},{"anchor":"errorable-message","kind":"function","line":6,"name":"message","qualifiedName":"Errorable.message","signatures":["message : String"],"summary":"","types":["String"],"urlPath":"errorable"},{"anchor":"record-parseerror","kind":"record","line":14,"name":"ParseError","qualifiedName":"ParseError","signatures":[],"summary":"ParseError — a typed parse failure. Carries the original `input`, the byte `position` where parsing stopped (and from which it can be continued), the successfully parsed `value` (if any prefix was consumed — typed `Any` so it works across Integer / Float / Number), a diagnostic `message`, and the remaining unconsumed suffix `rest` so the caller can resume parsing.","types":["String","Integer","Any"],"urlPath":"errorable"},{"anchor":"module-evaluator","kind":"module","line":5,"name":"Evaluator","qualifiedName":"Evaluator","signatures":["run(source: String) -> Result<Any, String>","run(source: String, opts: EvaluatorOptions) -> Result<Any, String>","runExpression(source: String) -> Result<Any, String>","runExpression(source: String, opts: EvaluatorOptions) -> Result<Any, String>"],"summary":"Sandboxed evaluation of Kex source code at runtime.\n\nCreates a fresh, isolated evaluator for each call — the caller's environment is never shared. Returns `Result<Any, String>`.","types":["String","Result<Any, String>","(EvaluatorOptions) -> Result<Any, String>","[Atom]","{String: {String: (Any) -> Any}}","Int"],"urlPath":"evaluator"},{"anchor":"function-evaluator-run","kind":"function","line":7,"name":"run","qualifiedName":"Evaluator.run","signatures":["run(source: String) -> Result<Any, String>","run(source: String, opts: EvaluatorOptions) -> Result<Any, String>"],"summary":"Evaluates a full Kex program string.","types":["String","Result<Any, String>","(EvaluatorOptions) -> Result<Any, String>"],"urlPath":"evaluator"},{"anchor":"function-evaluator-runexpression","kind":"function","line":13,"name":"runExpression","qualifiedName":"Evaluator.runExpression","signatures":["runExpression(source: String) -> Result<Any, String>","runExpression(source: String, opts: EvaluatorOptions) -> Result<Any, String>"],"summary":"Evaluates a single Kex expression.","types":["String","Result<Any, String>","(EvaluatorOptions) -> Result<Any, String>"],"urlPath":"evaluator"},{"anchor":"record-evaluator-evaluatoroptions","kind":"record","line":18,"name":"EvaluatorOptions","qualifiedName":"Evaluator.EvaluatorOptions","signatures":[],"summary":"","types":["[Atom]","{String: {String: (Any) -> Any}}","Int"],"urlPath":"evaluator"},{"anchor":"type-filehandle","kind":"type","line":1,"name":"FileHandle","qualifiedName":"FileHandle","signatures":[],"summary":"","types":[],"urlPath":"filehandle"},{"anchor":"make-filehandle-canread","kind":"make","line":3,"name":"FileHandle<CanRead, W>","qualifiedName":"FileHandle<CanRead, W>","signatures":["getLine : String?","get : String?","readLine : String?","read : String?","eof? : Bool","atEnd? : Bool","feed : Stream<String>?"],"summary":"","types":[],"urlPath":"filehandle"},{"anchor":"filehandle-canread-getline","kind":"function","line":5,"name":"getLine","qualifiedName":"FileHandle.getLine","signatures":["getLine : String?"],"summary":"Compatibility names matching IO-style handle operations.","types":[],"urlPath":"filehandle"},{"anchor":"filehandle-canread-get","kind":"function","line":8,"name":"get","qualifiedName":"FileHandle.get","signatures":["get : String?"],"summary":"","types":[],"urlPath":"filehandle"},{"anchor":"filehandle-canread-readline","kind":"function","line":11,"name":"readLine","qualifiedName":"FileHandle.readLine","signatures":["readLine : String?"],"summary":"","types":[],"urlPath":"filehandle"},{"anchor":"filehandle-canread-read","kind":"function","line":14,"name":"read","qualifiedName":"FileHandle.read","signatures":["read : String?"],"summary":"","types":[],"urlPath":"filehandle"},{"anchor":"filehandle-canread-eof?","kind":"function","line":17,"name":"eof?","qualifiedName":"FileHandle.eof?","signatures":["eof? : Bool"],"summary":"","types":[],"urlPath":"filehandle"},{"anchor":"filehandle-canread-atend?","kind":"function","line":20,"name":"atEnd?","qualifiedName":"FileHandle.atEnd?","signatures":["atEnd? : Bool"],"summary":"","types":[],"urlPath":"filehandle"},{"anchor":"filehandle-canread-feed","kind":"function","line":23,"name":"feed","qualifiedName":"FileHandle.feed","signatures":["feed : Stream<String>?"],"summary":"","types":[],"urlPath":"filehandle"},{"anchor":"make-filehandle-canwrite","kind":"make","line":27,"name":"FileHandle<R, CanWrite>","qualifiedName":"FileHandle<R, CanWrite>","signatures":["printLine(content: String) -> Bool","print(content: String) -> Bool","writeLine(content: String) -> Bool","write(content: String) -> Bool"],"summary":"","types":["String","Bool"],"urlPath":"filehandle"},{"anchor":"filehandle-canwrite-printline","kind":"function","line":28,"name":"printLine","qualifiedName":"FileHandle.printLine","signatures":["printLine(content: String) -> Bool"],"summary":"","types":["String","Bool"],"urlPath":"filehandle"},{"anchor":"filehandle-canwrite-print","kind":"function","line":31,"name":"print","qualifiedName":"FileHandle.print","signatures":["print(content: String) -> Bool"],"summary":"","types":["String","Bool"],"urlPath":"filehandle"},{"anchor":"filehandle-canwrite-writeline","kind":"function","line":34,"name":"writeLine","qualifiedName":"FileHandle.writeLine","signatures":["writeLine(content: String) -> Bool"],"summary":"","types":["String","Bool"],"urlPath":"filehandle"},{"anchor":"filehandle-canwrite-write","kind":"function","line":37,"name":"write","qualifiedName":"FileHandle.write","signatures":["write(content: String) -> Bool"],"summary":"","types":["String","Bool"],"urlPath":"filehandle"},{"anchor":"make-filehandle","kind":"make","line":41,"name":"FileHandle<R, W>","qualifiedName":"FileHandle<R, W>","signatures":["close : Void"],"summary":"","types":[],"urlPath":"filehandle"},{"anchor":"filehandle-close","kind":"function","line":42,"name":"close","qualifiedName":"FileHandle.close","signatures":["close : Void"],"summary":"","types":[],"urlPath":"filehandle"},{"anchor":"module-fs","kind":"module","line":1,"name":"FS","qualifiedName":"FS","signatures":["open(path: FilePath, mode: Read) -> Result<FileHandle<CanRead, CannotWrite>, FileError>","open(path: FilePath, mode: Write) -> Result<FileHandle<CannotRead, CanWrite>, FileError>","open(path: FilePath, mode: Append) -> Result<FileHandle<CannotRead, CanWrite>, FileError>","open(path: FilePath, mode: ReadWrite) -> Result<FileHandle<CanRead, CanWrite>, FileError>","read(path: FilePath) -> String?","write(path: FilePath, content: String) -> Bool","append(path: FilePath, content: String) -> Bool","exists?(path: FilePath) -> Bool","file?(path: FilePath) -> Bool","directory?(path: FilePath) -> Bool","delete(path: FilePath) -> Bool","copy(src: FilePath, dst: FilePath) -> Bool","rename(src: FilePath, dst: FilePath) -> Bool","readLines(path: FilePath) -> [String]?","feed(path: FilePath) -> Stream<String>?","size(path: FilePath) -> Integer?","absolute(path: FilePath) -> String?","join(a: FilePath, b: FilePath) -> String","join(a: FilePath, b: FilePath) -> FilePath -> String","joinAll(parts: [FilePath]) -> String","normalize(path: FilePath) -> String","segments(path: FilePath) -> [String]","absolute?(path: FilePath) -> Bool","relative?(path: FilePath) -> Bool","dirname(path: FilePath) -> String","basename(path: FilePath) -> String","extension(path: FilePath) -> String","stem(path: FilePath) -> String","withExtension(path: FilePath, wanted: String) -> String","relativeTo(path: FilePath, base: FilePath) -> String","exists?(path: FilePath) -> Bool","directory?(path: FilePath) -> Bool","file?(path: FilePath) -> Bool","create(path: FilePath) -> Bool","delete(path: FilePath) -> Bool","deleteAll(path: FilePath) -> Bool","list(path: FilePath) -> [String]?","files(path: FilePath) -> [String]?","directories(path: FilePath) -> [String]?","current : String","home : String?"],"summary":"","types":["FilePath","Read","Result<FileHandle<CanRead, CannotWrite>, FileError>","Write","Result<FileHandle<CannotRead, CanWrite>, FileError>","Append","ReadWrite","Result<FileHandle<CanRead, CanWrite>, FileError>","String?","String","Bool","[String]?","Stream<String>?","Integer?","(FilePath) -> String","[FilePath]","[String]"],"urlPath":"fs"},{"anchor":"type-fs-filepath","kind":"type","line":2,"name":"FilePath","qualifiedName":"FS.FilePath","signatures":[],"summary":"","types":[],"urlPath":"fs"},{"anchor":"type-fs-filemodes","kind":"type","line":3,"name":"FileModes","qualifiedName":"FS.FileModes","signatures":[],"summary":"","types":[],"urlPath":"fs"},{"anchor":"type-fs-readpermission","kind":"type","line":4,"name":"ReadPermission","qualifiedName":"FS.ReadPermission","signatures":[],"summary":"","types":[],"urlPath":"fs"},{"anchor":"type-fs-writepermission","kind":"type","line":5,"name":"WritePermission","qualifiedName":"FS.WritePermission","signatures":[],"summary":"","types":[],"urlPath":"fs"},{"anchor":"type-fs-fileerror","kind":"type","line":6,"name":"FileError","qualifiedName":"FS.FileError","signatures":[],"summary":"","types":["FilePath"],"urlPath":"fs"},{"anchor":"module-fs-file","kind":"module","line":13,"name":"FS.File","qualifiedName":"FS.File","signatures":["open(path: FilePath, mode: Read) -> Result<FileHandle<CanRead, CannotWrite>, FileError>","open(path: FilePath, mode: Write) -> Result<FileHandle<CannotRead, CanWrite>, FileError>","open(path: FilePath, mode: Append) -> Result<FileHandle<CannotRead, CanWrite>, FileError>","open(path: FilePath, mode: ReadWrite) -> Result<FileHandle<CanRead, CanWrite>, FileError>","read(path: FilePath) -> String?","write(path: FilePath, content: String) -> Bool","append(path: FilePath, content: String) -> Bool","exists?(path: FilePath) -> Bool","file?(path: FilePath) -> Bool","directory?(path: FilePath) -> Bool","delete(path: FilePath) -> Bool","copy(src: FilePath, dst: FilePath) -> Bool","rename(src: FilePath, dst: FilePath) -> Bool","readLines(path: FilePath) -> [String]?","feed(path: FilePath) -> Stream<String>?","size(path: FilePath) -> Integer?","absolute(path: FilePath) -> String?"],"summary":"A capability: every member reaches the real filesystem, so a test can replace the whole thing for a lexical region with `with FS.File = ...` instead of mutating global mock state (kexhq/kex#143). The boundary is here rather than on `FS`, because `FS.Path` below is pure string work with no implementation to substitute.","types":["FilePath","Read","Result<FileHandle<CanRead, CannotWrite>, FileError>","Write","Result<FileHandle<CannotRead, CanWrite>, FileError>","Append","ReadWrite","Result<FileHandle<CanRead, CanWrite>, FileError>","String?","String","Bool","[String]?","Stream<String>?","Integer?"],"urlPath":"fs"},{"anchor":"function-fs-file-open","kind":"function","line":14,"name":"open","qualifiedName":"FS.File.open","signatures":["open(path: FilePath, mode: Read) -> Result<FileHandle<CanRead, CannotWrite>, FileError>","open(path: FilePath, mode: Write) -> Result<FileHandle<CannotRead, CanWrite>, FileError>","open(path: FilePath, mode: Append) -> Result<FileHandle<CannotRead, CanWrite>, FileError>","open(path: FilePath, mode: ReadWrite) -> Result<FileHandle<CanRead, CanWrite>, FileError>"],"summary":"","types":["FilePath","Read","Result<FileHandle<CanRead, CannotWrite>, FileError>","Write","Result<FileHandle<CannotRead, CanWrite>, FileError>","Append","ReadWrite","Result<FileHandle<CanRead, CanWrite>, FileError>"],"urlPath":"fs"},{"anchor":"function-fs-file-read","kind":"function","line":20,"name":"read","qualifiedName":"FS.File.read","signatures":["read(path: FilePath) -> String?"],"summary":"","types":["FilePath","String?"],"urlPath":"fs"},{"anchor":"function-fs-file-write","kind":"function","line":23,"name":"write","qualifiedName":"FS.File.write","signatures":["write(path: FilePath, content: String) -> Bool"],"summary":"","types":["FilePath","String","Bool"],"urlPath":"fs"},{"anchor":"function-fs-file-append","kind":"function","line":26,"name":"append","qualifiedName":"FS.File.append","signatures":["append(path: FilePath, content: String) -> Bool"],"summary":"","types":["FilePath","String","Bool"],"urlPath":"fs"},{"anchor":"function-fs-file-exists?","kind":"function","line":29,"name":"exists?","qualifiedName":"FS.File.exists?","signatures":["exists?(path: FilePath) -> Bool"],"summary":"","types":["FilePath","Bool"],"urlPath":"fs"},{"anchor":"function-fs-file-file?","kind":"function","line":32,"name":"file?","qualifiedName":"FS.File.file?","signatures":["file?(path: FilePath) -> Bool"],"summary":"","types":["FilePath","Bool"],"urlPath":"fs"},{"anchor":"function-fs-file-directory?","kind":"function","line":35,"name":"directory?","qualifiedName":"FS.File.directory?","signatures":["directory?(path: FilePath) -> Bool"],"summary":"","types":["FilePath","Bool"],"urlPath":"fs"},{"anchor":"function-fs-file-delete","kind":"function","line":38,"name":"delete","qualifiedName":"FS.File.delete","signatures":["delete(path: FilePath) -> Bool"],"summary":"","types":["FilePath","Bool"],"urlPath":"fs"},{"anchor":"function-fs-file-copy","kind":"function","line":41,"name":"copy","qualifiedName":"FS.File.copy","signatures":["copy(src: FilePath, dst: FilePath) -> Bool"],"summary":"","types":["FilePath","Bool"],"urlPath":"fs"},{"anchor":"function-fs-file-rename","kind":"function","line":44,"name":"rename","qualifiedName":"FS.File.rename","signatures":["rename(src: FilePath, dst: FilePath) -> Bool"],"summary":"","types":["FilePath","Bool"],"urlPath":"fs"},{"anchor":"function-fs-file-readlines","kind":"function","line":51,"name":"readLines","qualifiedName":"FS.File.readLines","signatures":["readLines(path: FilePath) -> [String]?"],"summary":"NOT `lines`: FilePath is an alias for String, so a receiver function named `lines` here is indistinguishable from String's own `lines` at every call site, and merely saying `using FS` made `text.lines` ambiguous. `readLines` also says what it does — it reads the file.","types":["FilePath","[String]?"],"urlPath":"fs"},{"anchor":"function-fs-file-feed","kind":"function","line":54,"name":"feed","qualifiedName":"FS.File.feed","signatures":["feed(path: FilePath) -> Stream<String>?"],"summary":"","types":["FilePath","Stream<String>?"],"urlPath":"fs"},{"anchor":"function-fs-file-size","kind":"function","line":57,"name":"size","qualifiedName":"FS.File.size","signatures":["size(path: FilePath) -> Integer?"],"summary":"","types":["FilePath","Integer?"],"urlPath":"fs"},{"anchor":"function-fs-file-absolute","kind":"function","line":65,"name":"absolute","qualifiedName":"FS.File.absolute","signatures":["absolute(path: FilePath) -> String?"],"summary":"Path manipulation lives in FS.Path — `basename`, `dirname`, `extension` and `join` used to be here too, but a name cannot sit in both modules: FilePath IS String, so two same-named receiver functions on it are indistinguishable at every call site. `absolute` stays because it is not lexical — it asks the process where it is.","types":["FilePath","String?"],"urlPath":"fs"},{"anchor":"module-fs-path","kind":"module","line":72,"name":"FS.Path","qualifiedName":"FS.Path","signatures":["join(a: FilePath, b: FilePath) -> String","join(a: FilePath, b: FilePath) -> FilePath -> String","joinAll(parts: [FilePath]) -> String","normalize(path: FilePath) -> String","segments(path: FilePath) -> [String]","absolute?(path: FilePath) -> Bool","relative?(path: FilePath) -> Bool","dirname(path: FilePath) -> String","basename(path: FilePath) -> String","extension(path: FilePath) -> String","stem(path: FilePath) -> String","withExtension(path: FilePath, wanted: String) -> String","relativeTo(path: FilePath, base: FilePath) -> String"],"summary":"Lexical path algebra: pure string manipulation, no filesystem access, so every answer is the same whether or not the path exists. POSIX separators only for now.","types":["String","FilePath","(FilePath) -> String","[FilePath]","[String]","Bool"],"urlPath":"fs"},{"anchor":"constant-fs-path-separator","kind":"constant","line":73,"name":"separator","qualifiedName":"FS.Path.separator","signatures":[],"summary":"","types":["String"],"urlPath":"fs"},{"anchor":"function-fs-path-join","kind":"function","line":80,"name":"join","qualifiedName":"FS.Path.join","signatures":["join(a: FilePath, b: FilePath) -> String","join(a: FilePath, b: FilePath) -> FilePath -> String"],"summary":"Joins parts with a single separator and normalizes the result, the way Node's path.join and Ruby's File.join do. An absolute part does NOT restart the path (that is Pathname#join's behaviour) — use the part on its own if that is what you mean.","types":["FilePath","String","(FilePath) -> String"],"urlPath":"fs"},{"anchor":"function-fs-path-joinall","kind":"function","line":89,"name":"joinAll","qualifiedName":"FS.Path.joinAll","signatures":["joinAll(parts: [FilePath]) -> String"],"summary":"The list form is `joinAll`, not another `join` overload: a list receiver already has `List.join`, and a second one-argument `join` on the same receiver would be indistinguishable from it.","types":["[FilePath]","String"],"urlPath":"fs"},{"anchor":"function-fs-path-normalize","kind":"function","line":99,"name":"normalize","qualifiedName":"FS.Path.normalize","signatures":["normalize(path: FilePath) -> String"],"summary":"Resolves `.` and `..` lexically. A leading `..` in a RELATIVE path is kept (there is no way to know what it escapes to); one in an absolute path is dropped, since `/` has no parent.","types":["FilePath","String"],"urlPath":"fs"},{"anchor":"function-fs-path-segments","kind":"function","line":115,"name":"segments","qualifiedName":"FS.Path.segments","signatures":["segments(path: FilePath) -> [String]"],"summary":"The non-empty parts of the normalized path. `/` and `.` have none.","types":["FilePath","[String]"],"urlPath":"fs"},{"anchor":"function-fs-path-absolute?","kind":"function","line":122,"name":"absolute?","qualifiedName":"FS.Path.absolute?","signatures":["absolute?(path: FilePath) -> Bool"],"summary":"","types":["FilePath","Bool"],"urlPath":"fs"},{"anchor":"function-fs-path-relative?","kind":"function","line":125,"name":"relative?","qualifiedName":"FS.Path.relative?","signatures":["relative?(path: FilePath) -> Bool"],"summary":"","types":["FilePath","Bool"],"urlPath":"fs"},{"anchor":"function-fs-path-dirname","kind":"function","line":129,"name":"dirname","qualifiedName":"FS.Path.dirname","signatures":["dirname(path: FilePath) -> String"],"summary":"The parent of a path: `/` for a root child, `.` for a bare name.","types":["FilePath","String"],"urlPath":"fs"},{"anchor":"function-fs-path-basename","kind":"function","line":143,"name":"basename","qualifiedName":"FS.Path.basename","signatures":["basename(path: FilePath) -> String"],"summary":"The last segment: `/` for the root itself, `.` for an empty path.","types":["FilePath","String"],"urlPath":"fs"},{"anchor":"function-fs-path-extension","kind":"function","line":154,"name":"extension","qualifiedName":"FS.Path.extension","signatures":["extension(path: FilePath) -> String"],"summary":"The dot-prefixed extension, or \"\" when there is none. A leading dot is part of the NAME, so `.gitignore` has no extension.","types":["FilePath","String"],"urlPath":"fs"},{"anchor":"function-fs-path-stem","kind":"function","line":168,"name":"stem","qualifiedName":"FS.Path.stem","signatures":["stem(path: FilePath) -> String"],"summary":"The basename without its extension. A name that IS its extension — `.gitignore` — keeps it, because it has none to drop.","types":["FilePath","String"],"urlPath":"fs"},{"anchor":"function-fs-path-withextension","kind":"function","line":178,"name":"withExtension","qualifiedName":"FS.Path.withExtension","signatures":["withExtension(path: FilePath, wanted: String) -> String"],"summary":"Same path with a different extension. The new one may be written with or without its dot; an empty one removes the extension.","types":["FilePath","String"],"urlPath":"fs"},{"anchor":"function-fs-path-relativeto","kind":"function","line":192,"name":"relativeTo","qualifiedName":"FS.Path.relativeTo","signatures":["relativeTo(path: FilePath, base: FilePath) -> String"],"summary":"`path` expressed relative to `base`, walking up with `..` as needed. Purely lexical, so it answers only when both sides are anchored the same way; a relative path against an absolute base (or the reverse) comes back unchanged.","types":["FilePath","String"],"urlPath":"fs"},{"anchor":"module-fs-directory","kind":"module","line":237,"name":"FS.Directory","qualifiedName":"FS.Directory","signatures":["exists?(path: FilePath) -> Bool","directory?(path: FilePath) -> Bool","file?(path: FilePath) -> Bool","create(path: FilePath) -> Bool","delete(path: FilePath) -> Bool","deleteAll(path: FilePath) -> Bool","list(path: FilePath) -> [String]?","files(path: FilePath) -> [String]?","directories(path: FilePath) -> [String]?","current : String","home : String?"],"summary":"","types":["FilePath","Bool","[String]?"],"urlPath":"fs"},{"anchor":"function-fs-directory-exists?","kind":"function","line":238,"name":"exists?","qualifiedName":"FS.Directory.exists?","signatures":["exists?(path: FilePath) -> Bool"],"summary":"","types":["FilePath","Bool"],"urlPath":"fs"},{"anchor":"function-fs-directory-directory?","kind":"function","line":241,"name":"directory?","qualifiedName":"FS.Directory.directory?","signatures":["directory?(path: FilePath) -> Bool"],"summary":"","types":["FilePath","Bool"],"urlPath":"fs"},{"anchor":"function-fs-directory-file?","kind":"function","line":244,"name":"file?","qualifiedName":"FS.Directory.file?","signatures":["file?(path: FilePath) -> Bool"],"summary":"","types":["FilePath","Bool"],"urlPath":"fs"},{"anchor":"function-fs-directory-create","kind":"function","line":247,"name":"create","qualifiedName":"FS.Directory.create","signatures":["create(path: FilePath) -> Bool"],"summary":"","types":["FilePath","Bool"],"urlPath":"fs"},{"anchor":"function-fs-directory-delete","kind":"function","line":250,"name":"delete","qualifiedName":"FS.Directory.delete","signatures":["delete(path: FilePath) -> Bool"],"summary":"","types":["FilePath","Bool"],"urlPath":"fs"},{"anchor":"function-fs-directory-deleteall","kind":"function","line":253,"name":"deleteAll","qualifiedName":"FS.Directory.deleteAll","signatures":["deleteAll(path: FilePath) -> Bool"],"summary":"","types":["FilePath","Bool"],"urlPath":"fs"},{"anchor":"function-fs-directory-list","kind":"function","line":256,"name":"list","qualifiedName":"FS.Directory.list","signatures":["list(path: FilePath) -> [String]?"],"summary":"","types":["FilePath","[String]?"],"urlPath":"fs"},{"anchor":"function-fs-directory-files","kind":"function","line":259,"name":"files","qualifiedName":"FS.Directory.files","signatures":["files(path: FilePath) -> [String]?"],"summary":"","types":["FilePath","[String]?"],"urlPath":"fs"},{"anchor":"function-fs-directory-directories","kind":"function","line":262,"name":"directories","qualifiedName":"FS.Directory.directories","signatures":["directories(path: FilePath) -> [String]?"],"summary":"","types":["FilePath","[String]?"],"urlPath":"fs"},{"anchor":"function-fs-directory-current","kind":"function","line":265,"name":"current","qualifiedName":"FS.Directory.current","signatures":["current : String"],"summary":"","types":[],"urlPath":"fs"},{"anchor":"function-fs-directory-home","kind":"function","line":268,"name":"home","qualifiedName":"FS.Directory.home","signatures":["home : String?"],"summary":"","types":[],"urlPath":"fs"},{"anchor":"type-networkerror","kind":"type","line":1,"name":"NetworkError","qualifiedName":"NetworkError","signatures":[],"summary":"","types":[],"urlPath":"http"},{"anchor":"record-httpresponse","kind":"record","line":3,"name":"HttpResponse","qualifiedName":"HttpResponse","signatures":[],"summary":"","types":["Integer","String","Map<String, String>"],"urlPath":"http"},{"anchor":"record-httperror","kind":"record","line":9,"name":"HttpError","qualifiedName":"HttpError","signatures":[],"summary":"","types":["NetworkError","String"],"urlPath":"http"},{"anchor":"record-httpoptions","kind":"record","line":14,"name":"HttpOptions","qualifiedName":"HttpOptions","signatures":[],"summary":"","types":["Map<String, String>","Integer"],"urlPath":"http"},{"anchor":"module-http","kind":"module","line":22,"name":"Http","qualifiedName":"Http","signatures":["get(url: String) -> Result<HttpResponse, HttpError>","get(url: String, opts: HttpOptions) -> Result<HttpResponse, HttpError>","post(url: String, body: String) -> Result<HttpResponse, HttpError>","post(url: String, body: String) -> HttpOptions -> Result<HttpResponse, HttpError>","put(url: String, body: String) -> Result<HttpResponse, HttpError>","put(url: String, body: String) -> HttpOptions -> Result<HttpResponse, HttpError>","patch(url: String, body: String) -> Result<HttpResponse, HttpError>","patch(url: String, body: String) -> HttpOptions -> Result<HttpResponse, HttpError>","delete(url: String) -> Result<HttpResponse, HttpError>","delete(url: String, opts: HttpOptions) -> Result<HttpResponse, HttpError>","head(url: String) -> Result<HttpResponse, HttpError>","head(url: String, opts: HttpOptions) -> Result<HttpResponse, HttpError>","options(url: String) -> Result<HttpResponse, HttpError>","options(url: String, opts: HttpOptions) -> Result<HttpResponse, HttpError>"],"summary":"A capability: every member performs a real network request, so a test can replace it for a lexical region with `with Http = ...` rather than mutating global mock state (kexhq/kex#143).","types":["String","Result<HttpResponse, HttpError>","(HttpOptions) -> Result<HttpResponse, HttpError>"],"urlPath":"http"},{"anchor":"function-http-get","kind":"function","line":23,"name":"get","qualifiedName":"Http.get","signatures":["get(url: String) -> Result<HttpResponse, HttpError>","get(url: String, opts: HttpOptions) -> Result<HttpResponse, HttpError>"],"summary":"","types":["String","Result<HttpResponse, HttpError>","(HttpOptions) -> Result<HttpResponse, HttpError>"],"urlPath":"http"},{"anchor":"function-http-post","kind":"function","line":28,"name":"post","qualifiedName":"Http.post","signatures":["post(url: String, body: String) -> Result<HttpResponse, HttpError>","post(url: String, body: String) -> HttpOptions -> Result<HttpResponse, HttpError>"],"summary":"","types":["String","Result<HttpResponse, HttpError>","(HttpOptions) -> Result<HttpResponse, HttpError>"],"urlPath":"http"},{"anchor":"function-http-put","kind":"function","line":33,"name":"put","qualifiedName":"Http.put","signatures":["put(url: String, body: String) -> Result<HttpResponse, HttpError>","put(url: String, body: String) -> HttpOptions -> Result<HttpResponse, HttpError>"],"summary":"","types":["String","Result<HttpResponse, HttpError>","(HttpOptions) -> Result<HttpResponse, HttpError>"],"urlPath":"http"},{"anchor":"function-http-patch","kind":"function","line":38,"name":"patch","qualifiedName":"Http.patch","signatures":["patch(url: String, body: String) -> Result<HttpResponse, HttpError>","patch(url: String, body: String) -> HttpOptions -> Result<HttpResponse, HttpError>"],"summary":"","types":["String","Result<HttpResponse, HttpError>","(HttpOptions) -> Result<HttpResponse, HttpError>"],"urlPath":"http"},{"anchor":"function-http-delete","kind":"function","line":43,"name":"delete","qualifiedName":"Http.delete","signatures":["delete(url: String) -> Result<HttpResponse, HttpError>","delete(url: String, opts: HttpOptions) -> Result<HttpResponse, HttpError>"],"summary":"","types":["String","Result<HttpResponse, HttpError>","(HttpOptions) -> Result<HttpResponse, HttpError>"],"urlPath":"http"},{"anchor":"function-http-head","kind":"function","line":48,"name":"head","qualifiedName":"Http.head","signatures":["head(url: String) -> Result<HttpResponse, HttpError>","head(url: String, opts: HttpOptions) -> Result<HttpResponse, HttpError>"],"summary":"","types":["String","Result<HttpResponse, HttpError>","(HttpOptions) -> Result<HttpResponse, HttpError>"],"urlPath":"http"},{"anchor":"function-http-options","kind":"function","line":53,"name":"options","qualifiedName":"Http.options","signatures":["options(url: String) -> Result<HttpResponse, HttpError>","options(url: String, opts: HttpOptions) -> Result<HttpResponse, HttpError>"],"summary":"","types":["String","Result<HttpResponse, HttpError>","(HttpOptions) -> Result<HttpResponse, HttpError>"],"urlPath":"http"},{"anchor":"module-io","kind":"module","line":1,"name":"IO","qualifiedName":"IO","signatures":["printLine(msg: Showable) -> Void","print(msg: Showable) -> Void","inspect(val: A) -> A","getLine : String?","get : String?","printError(msg: Showable) -> Void","warn(msg: Showable) -> Void","warning(msg: Showable) -> Void"],"summary":"","types":["Showable","Void","A","Inspectable"],"urlPath":"io"},{"anchor":"function-io-printline","kind":"function","line":8,"name":"printLine","qualifiedName":"IO.printLine","signatures":["printLine(msg: Showable) -> Void"],"summary":"Writes each argument to stdout followed by a newline. Multiple arguments are printed consecutively with no separator.","types":["Showable","Void"],"urlPath":"io"},{"anchor":"function-io-print","kind":"function","line":17,"name":"print","qualifiedName":"IO.print","signatures":["print(msg: Showable) -> Void"],"summary":"Writes each argument to stdout without a trailing newline.","types":["Showable","Void"],"urlPath":"io"},{"anchor":"function-io-inspect","kind":"function","line":27,"name":"inspect","qualifiedName":"IO.inspect","signatures":["inspect(val: A) -> A"],"summary":"Pretty-prints a colored inspect representation of `val` to stderr. Returns `val` unchanged so it can be inserted into any pipeline. Treated as pure by the type checker — purity checking ignores this call.","types":["A","Inspectable"],"urlPath":"io"},{"anchor":"function-io-getline","kind":"function","line":39,"name":"getLine","qualifiedName":"IO.getLine","signatures":["getLine : String?"],"summary":"Reads one line from stdin. Returns `None` at end-of-input.","types":[],"urlPath":"io"},{"anchor":"function-io-get","kind":"function","line":43,"name":"get","qualifiedName":"IO.get","signatures":["get : String?"],"summary":"Reads a single character from stdin. Returns `None` at end-of-input.","types":[],"urlPath":"io"},{"anchor":"function-io-printerror","kind":"function","line":50,"name":"printError","qualifiedName":"IO.printError","signatures":["printError(msg: Showable) -> Void"],"summary":"Writes a line to stderr. Does not exit. Use for error messages that should not go to stdout.","types":["Showable","Void"],"urlPath":"io"},{"anchor":"function-io-warn","kind":"function","line":55,"name":"warn","qualifiedName":"IO.warn","signatures":["warn(msg: Showable) -> Void"],"summary":"Alias for `printError` — use when signalling a non-fatal condition.","types":["Showable","Void"],"urlPath":"io"},{"anchor":"function-io-warning","kind":"function","line":59,"name":"warning","qualifiedName":"IO.warning","signatures":["warning(msg: Showable) -> Void"],"summary":"Alias for `printError` — longer form of `warn`.","types":["Showable","Void"],"urlPath":"io"},{"anchor":"trait-inspectable","kind":"trait","line":1,"name":"Inspectable","qualifiedName":"Inspectable","signatures":["inspectValue : Bool -> String"],"summary":"","types":["(Bool) -> String"],"urlPath":"kex"},{"anchor":"inspectable-inspectvalue","kind":"function","line":2,"name":"inspectValue","qualifiedName":"Inspectable.inspectValue","signatures":["inspectValue : Bool -> String"],"summary":"","types":["(Bool) -> String"],"urlPath":"kex"},{"anchor":"trait-showable","kind":"trait","line":5,"name":"Showable","qualifiedName":"Showable","signatures":["showValue : String"],"summary":"","types":["String"],"urlPath":"kex"},{"anchor":"showable-showvalue","kind":"function","line":6,"name":"showValue","qualifiedName":"Showable.showValue","signatures":["showValue : String"],"summary":"","types":["String"],"urlPath":"kex"},{"anchor":"make-inspectable","kind":"make","line":11,"name":"Inspectable","qualifiedName":"Inspectable","signatures":["inspectValue(colors: Bool) -> String"],"summary":"Structural fallback: the runtime only decomposes the value; implementation selection and overrides remain ordinary Kex trait dispatch.","types":["Bool","String"],"urlPath":"kex"},{"anchor":"inspectable-inspectvalue","kind":"function","line":12,"name":"inspectValue","qualifiedName":"Inspectable.inspectValue","signatures":["inspectValue(colors: Bool) -> String"],"summary":"","types":["Bool","String"],"urlPath":"kex"},{"anchor":"make-showable","kind":"make","line":18,"name":"Showable","qualifiedName":"Showable","signatures":["showValue : String","to(_)"],"summary":"Current non-colored presentation for the primitive and standard compound types registered as Showable. Domain types can replace this with what their users care about (Time, Date, and DateTime do so in time.kex).","types":[],"urlPath":"kex"},{"anchor":"showable-showvalue","kind":"function","line":19,"name":"showValue","qualifiedName":"Showable.showValue","signatures":["showValue : String"],"summary":"","types":[],"urlPath":"kex"},{"anchor":"showable-to","kind":"function","line":20,"name":"to","qualifiedName":"Showable.to","signatures":["to(_)"],"summary":"","types":[],"urlPath":"kex"},{"anchor":"make-optional-showable","kind":"make","line":23,"name":"Optional<Showable>","qualifiedName":"Optional<Showable>","signatures":["showValue(_)"],"summary":"","types":[],"urlPath":"kex"},{"anchor":"optional-showable-showvalue","kind":"function","line":24,"name":"showValue","qualifiedName":"Optional.showValue","signatures":["showValue(_)"],"summary":"","types":[],"urlPath":"kex"},{"anchor":"make-result","kind":"make","line":42,"name":"Result<X, E>","qualifiedName":"Result<X, E>","signatures":["showValue(_)"],"summary":"The same for Result, with one deliberate asymmetry: SHOWING a result shows what it carries, so `Ok(42)` reads as `42` rather than leaking the wrapper into text — but an `Error` keeps its marker. Dropping it made a failure and a success print identically, and unlike `None` (which shows as \"\", visibly not a value) there would be nothing left to tell them apart.\n\nThe marker is spelled `Error(...)`, matching how the same value renders as an ELEMENT of a collection — `[1, Error(Bad(no))]`. Elements render structurally rather than through showValue (as in Ruby, where `nil.to_s` is \"\" but `[nil].to_s` is \"[nil]\"), so this is the one spelling that reads the same at both levels.\n\nWhat functions RETURN is unchanged: `Integer.parse` still answers with a Result, `IO.inspect` still shows `Ok(42)`, and both arms are still matchable.","types":[],"urlPath":"kex"},{"anchor":"result-showvalue","kind":"function","line":43,"name":"showValue","qualifiedName":"Result.showValue","signatures":["showValue(_)"],"summary":"","types":[],"urlPath":"kex"},{"anchor":"module-kex","kind":"module","line":47,"name":"Kex","qualifiedName":"Kex","signatures":["tuple : (Integer, Integer, Integer, String?)","release : String","number : String","has?(f: Feature) -> Bool"],"summary":"","types":["Backend","","Integer","String?","String","Version","Feature","Bool","[Feature]"],"urlPath":"kex"},{"anchor":"type-kex-backend","kind":"type","line":48,"name":"Backend","qualifiedName":"Kex.Backend","signatures":[],"summary":"","types":[],"urlPath":"kex"},{"anchor":"type-kex-feature","kind":"type","line":50,"name":"Feature","qualifiedName":"Kex.Feature","signatures":[],"summary":"","types":[],"urlPath":"kex"},{"anchor":"constant-kex-backend","kind":"constant","line":52,"name":"BACKEND","qualifiedName":"Kex.BACKEND","signatures":[],"summary":"","types":["Backend"],"urlPath":"kex"},{"anchor":"constant-kex-interpreted?","kind":"constant","line":55,"name":"interpreted?","qualifiedName":"Kex.interpreted?","signatures":[],"summary":"","types":[""],"urlPath":"kex"},{"anchor":"constant-kex-underbeam?","kind":"constant","line":56,"name":"underBeam?","qualifiedName":"Kex.underBeam?","signatures":[],"summary":"","types":[""],"urlPath":"kex"},{"anchor":"module-kex-kernel","kind":"module","line":58,"name":"Kex.Kernel","qualifiedName":"Kex.Kernel","signatures":["tuple : (Integer, Integer, Integer, String?)","release : String","number : String"],"summary":"","types":["Integer","String?","String","Version"],"urlPath":"kex"},{"anchor":"record-kex-kernel-version","kind":"record","line":70,"name":"Version","qualifiedName":"Kex.Kernel.Version","signatures":[],"summary":"The toolchain a program is running on. `kex --version` and the REPL banner report the same numbers.\n\n`revision` is the git commit the compiler was built from — `None` when it was built from a source archive rather than a checkout, which is why it is an Optional rather than a String.","types":["Integer","String?","String"],"urlPath":"kex"},{"anchor":"make-version","kind":"make","line":80,"name":"Version","qualifiedName":"Version","signatures":["tuple : (Integer, Integer, Integer, String?)","release : String","number : String"],"summary":"","types":[],"urlPath":"kex"},{"anchor":"version-tuple","kind":"function","line":99,"name":"tuple","qualifiedName":"Version.tuple","signatures":["tuple : (Integer, Integer, Integer, String?)"],"summary":"The three numbers, without the revision.\n\n`to(String)` — the language's conversion protocol, and what this should really be — is deliberately NOT defined here: a second `to(String)` implementation anywhere in the prelude breaks type-directed `to` dispatch for every prelude type on BEAM, so adding one here silently broke `3.kilo.watt.to(String)`. Pinned by spec/prelude_to_string_dispatch.kex; restore this as `to(String)` once that dispatcher is fixed.\n\nThe same four values as a tuple, for destructuring. A tuple cannot carry accessors of its own — there is no named type for a `make` block to target — so the record is the value and this is the view.","types":[],"urlPath":"kex"},{"anchor":"version-release","kind":"function","line":104,"name":"release","qualifiedName":"Version.release","signatures":["release : String"],"summary":"`0.4.0`, or `0.4.0-rc.1` on a pre-release build. What a version RANGE is matched against, so the channel has to be in it.","types":[],"urlPath":"kex"},{"anchor":"version-number","kind":"function","line":107,"name":"number","qualifiedName":"Version.number","signatures":["number : String"],"summary":"","types":[],"urlPath":"kex"},{"anchor":"constant-kex-kernel-version","kind":"constant","line":114,"name":"VERSION","qualifiedName":"Kex.Kernel.VERSION","signatures":[],"summary":"","types":["Version"],"urlPath":"kex"},{"anchor":"module-kex-feature","kind":"module","line":122,"name":"Kex.Feature","qualifiedName":"Kex.Feature","signatures":["has?(f: Feature) -> Bool"],"summary":"","types":["Feature","Bool","[Feature]"],"urlPath":"kex"},{"anchor":"function-kex-feature-has?","kind":"function","line":123,"name":"has?","qualifiedName":"Kex.Feature.has?","signatures":["has?(f: Feature) -> Bool"],"summary":"","types":["Feature","Bool"],"urlPath":"kex"},{"anchor":"constant-kex-feature-list","kind":"constant","line":126,"name":"list","qualifiedName":"Kex.Feature.list","signatures":[],"summary":"","types":["[Feature]"],"urlPath":"kex"},{"anchor":"module-kex-interface","kind":"module","line":147,"name":"Kex.Interface","qualifiedName":"Kex.Interface","signatures":["read(path: FS.FilePath) -> Any?"],"summary":"Returns the pretty-printed representation of any value as a STRING — the same form the REPL echoes. Universal: reachable on every type through UFCS.\n\nNamed apart from `inspect`, which prints and returns its INPUT so it can be dropped into a pipeline. Both spellings used to be called `inspect`, and which one a call reached depended on whether it was written `x.inspect` or `IO.inspect(x)` — so `[1, 2].inspect.count` answered 24, the length of the rendered string, rather than 2.","types":["FS.FilePath","Any?"],"urlPath":"kex"},{"anchor":"function-kex-interface-read","kind":"function","line":162,"name":"read","qualifiedName":"Kex.Interface.read","signatures":["read(path: FS.FilePath) -> Any?"],"summary":"Reads the KexI interface chunk of a compiled Kex module — its typed public surface — and answers the decoded term, or None when the file has no such chunk, does not exist, or is not a BEAM artifact.\n\nThe term is an ordinary tree of tuples, lists, atoms, integers and strings, so it is walked with normal pattern matching and `Tuple.items`. This exists so that reading it needs no `Erlang.*` interop: it is the one intentional entry point rather than a general term decoder.","types":["FS.FilePath","Any?"],"urlPath":"kex"},{"anchor":"function-inspected","kind":"function","line":166,"name":"inspected","qualifiedName":"inspected","signatures":["inspected(value: Inspectable)"],"summary":"","types":["Inspectable"],"urlPath":"kex"},{"anchor":"function-inspect","kind":"function","line":177,"name":"inspect","qualifiedName":"inspect","signatures":["inspect(value: A) -> A"],"summary":"Prints the pretty-printed form of `value` to stderr and returns `value` unchanged, so it can be dropped into any pipeline without changing what flows through it. The same operation as `IO.inspect`, reachable by UFCS.","types":["A"],"urlPath":"kex"},{"anchor":"type-list","kind":"type","line":1,"name":"List","qualifiedName":"List","signatures":[],"summary":"","types":[],"urlPath":"list"},{"anchor":"make-list-number","kind":"make","line":3,"name":"[Number]","qualifiedName":"[Number]","signatures":["sum : Number","product : Number","product(f: (X -> Number)) -> Number","min : X?","max : X?"],"summary":"","types":["(X) -> Number","Number"],"urlPath":"list"},{"anchor":"list-number-sum","kind":"function","line":11,"name":"sum","qualifiedName":"List.sum","signatures":["sum : Number"],"summary":"Sums all elements. Returns `0` for an empty list.","types":[],"urlPath":"list"},{"anchor":"list-number-product","kind":"function","line":21,"name":"product","qualifiedName":"List.product","signatures":["product : Number"],"summary":"Multiplies all elements. Returns `1` for an empty list.","types":[],"urlPath":"list"},{"anchor":"list-number-product","kind":"function","line":31,"name":"product","qualifiedName":"List.product","signatures":["product(f: (X -> Number)) -> Number"],"summary":"Maps each element through `f` and multiplies the results.","types":["(X) -> Number","Number"],"urlPath":"list"},{"anchor":"list-number-min","kind":"function","line":41,"name":"min","qualifiedName":"List.min","signatures":["min : X?"],"summary":"Returns the smallest element wrapped in `Just`, or `None` for an empty list.","types":[],"urlPath":"list"},{"anchor":"list-number-max","kind":"function","line":51,"name":"max","qualifiedName":"List.max","signatures":["max : X?"],"summary":"Returns the largest element wrapped in `Just`, or `None` for an empty list.","types":[],"urlPath":"list"},{"anchor":"make-list","kind":"make","line":55,"name":"[X]","qualifiedName":"[X]","signatures":["first : X?","second : X?","third : X?","rest : [X]","last : X?","count : Integer","length : Integer","count(pred: (X -> Bool)) -> Integer","empty? : Bool","find(pred: (X -> Bool)) -> X?","any?(pred: (X -> Bool)) -> Bool","all?(pred: (X -> Bool)) -> Bool","map(f: (X -> Y)) -> [Y]","filter(pred: (X -> Bool)) -> [X]","reject(pred: (X -> Bool)) -> [X]","each(f: (X -> Void)) -> Void","reduce(acc: A, f: (A -> X -> A)) -> A","flatMap(f: (X -> [Y])) -> [Y]","at(i: Integer) -> X?","get(i: Integer) -> X?","get(i: Integer, default: X) -> X","contains?(elem: X) -> Bool","indexOf(elem: X) -> Integer?","findIndex(pred: (X -> Bool)) -> Integer?","takeWhile(pred: (X -> Bool)) -> [X]","dropWhile(pred: (X -> Bool)) -> [X]","uniq : [X]","partition(pred: (X -> Bool)) -> ([X], [X])","collect(f: (X -> Y?)) -> [Y]","take(n: Integer) -> [X]","drop(n: Integer) -> [X]","push(x: X) -> [X]","reverse : [X]","zip(other: [Y]) -> [(X, Y)]","flatten : [X]","sort : [X]","sort(comp: (X -> X -> Bool)) -> [X]","min(f: (X -> Y)) -> X?","max(f: (X -> Y)) -> X?","sum(f: (X -> Number)) -> Number","join(sep: String) -> String","join : String"],"summary":"","types":["(X) -> Bool","Integer","Bool","X?","(X) -> Y","[Y]","[X]","(X) -> Void","Void","A","(A) -> (X) -> A","(X) -> [Y]","(X) -> X","X","Integer?","((X) -> Bool) -> [X]","([X], [X])","((X) -> Y?) -> [Y]","[(X, Y)]","(X) -> (X) -> Bool","(X) -> Number","Number","String"],"urlPath":"list"},{"anchor":"list-first","kind":"function","line":63,"name":"first","qualifiedName":"List.first","signatures":["first : X?"],"summary":"Returns the first element wrapped in `Just`, or `None` if the list is empty.","types":[],"urlPath":"list"},{"anchor":"list-second","kind":"function","line":74,"name":"second","qualifiedName":"List.second","signatures":["second : X?"],"summary":"Returns the second element wrapped in `Just`, or `None` if the list has fewer than two elements.","types":[],"urlPath":"list"},{"anchor":"list-third","kind":"function","line":85,"name":"third","qualifiedName":"List.third","signatures":["third : X?"],"summary":"Returns the third element wrapped in `Just`, or `None` if the list has fewer than three elements.","types":[],"urlPath":"list"},{"anchor":"list-rest","kind":"function","line":97,"name":"rest","qualifiedName":"List.rest","signatures":["rest : [X]"],"summary":"Returns all elements after the first. Returns `[]` for an empty or single-element list.","types":[],"urlPath":"list"},{"anchor":"list-last","kind":"function","line":107,"name":"last","qualifiedName":"List.last","signatures":["last : X?"],"summary":"Returns the last element wrapped in `Just`, or `None` if the list is empty.","types":[],"urlPath":"list"},{"anchor":"list-count","kind":"function","line":118,"name":"count","qualifiedName":"List.count","signatures":["count : Integer"],"summary":"Returns the number of elements. When given a predicate, returns the count of elements for which it holds.","types":[],"urlPath":"list"},{"anchor":"list-length","kind":"function","line":122,"name":"length","qualifiedName":"List.length","signatures":["length : Integer"],"summary":"Compatibility spelling shared with String.","types":[],"urlPath":"list"},{"anchor":"list-count","kind":"function","line":126,"name":"count","qualifiedName":"List.count","signatures":["count(pred: (X -> Bool)) -> Integer"],"summary":"count(pred) is provided by the Enumerable trait.","types":["(X) -> Bool","Integer"],"urlPath":"list"},{"anchor":"list-empty?","kind":"function","line":135,"name":"empty?","qualifiedName":"List.empty?","signatures":["empty? : Bool"],"summary":"Returns `true` if the list contains no elements.","types":["Bool"],"urlPath":"list"},{"anchor":"list-find","kind":"function","line":149,"name":"find","qualifiedName":"List.find","signatures":["find(pred: (X -> Bool)) -> X?"],"summary":"Returns the first element satisfying the predicate wrapped in `Just`, or `None` if no element matches.\n\nfind/any?/all? are provided by the Enumerable trait.","types":["(X) -> Bool","X?"],"urlPath":"list"},{"anchor":"list-any?","kind":"function","line":159,"name":"any?","qualifiedName":"List.any?","signatures":["any?(pred: (X -> Bool)) -> Bool"],"summary":"Returns `true` if at least one element satisfies the predicate.","types":["(X) -> Bool","Bool"],"urlPath":"list"},{"anchor":"list-all?","kind":"function","line":169,"name":"all?","qualifiedName":"List.all?","signatures":["all?(pred: (X -> Bool)) -> Bool"],"summary":"Returns `true` if every element satisfies the predicate.","types":["(X) -> Bool","Bool"],"urlPath":"list"},{"anchor":"list-map","kind":"function","line":179,"name":"map","qualifiedName":"List.map","signatures":["map(f: (X -> Y)) -> [Y]"],"summary":"Transforms each element by applying `f`.\n\nmap/filter/each are provided by the Enumerable trait (in terms of reduce).","types":["(X) -> Y","[Y]"],"urlPath":"list"},{"anchor":"list-filter","kind":"function","line":188,"name":"filter","qualifiedName":"List.filter","signatures":["filter(pred: (X -> Bool)) -> [X]"],"summary":"Returns a new list containing only the elements for which `pred` is `true`.","types":["(X) -> Bool","[X]"],"urlPath":"list"},{"anchor":"list-reject","kind":"function","line":198,"name":"reject","qualifiedName":"List.reject","signatures":["reject(pred: (X -> Bool)) -> [X]"],"summary":"Returns a new list with all elements for which `pred` is `true` removed. The inverse of `filter`.","types":["(X) -> Bool","[X]"],"urlPath":"list"},{"anchor":"list-each","kind":"function","line":207,"name":"each","qualifiedName":"List.each","signatures":["each(f: (X -> Void)) -> Void"],"summary":"Calls `f` with each element for its side effects. Returns unit.","types":["(X) -> Void","Void"],"urlPath":"list"},{"anchor":"list-reduce","kind":"function","line":219,"name":"reduce","qualifiedName":"List.reduce","signatures":["reduce(acc: A, f: (A -> X -> A)) -> A"],"summary":"Folds the list from the left, starting with `acc` and combining each element via `f`.","types":["A","(A) -> (X) -> A"],"urlPath":"list"},{"anchor":"list-flatmap","kind":"function","line":226,"name":"flatMap","qualifiedName":"List.flatMap","signatures":["flatMap(f: (X -> [Y])) -> [Y]"],"summary":"Maps each element to a list and concatenates the results.","types":["(X) -> [Y]","[Y]"],"urlPath":"list"},{"anchor":"list-at","kind":"function","line":241,"name":"at","qualifiedName":"List.at","signatures":["at(i: Integer) -> X?"],"summary":"Returns the element at position `i` (0-based) wrapped in `Just`, or `None` if the index is out of range.","types":["Integer","X?"],"urlPath":"list"},{"anchor":"list-get","kind":"function","line":244,"name":"get","qualifiedName":"List.get","signatures":["get(i: Integer) -> X?","get(i: Integer, default: X) -> X"],"summary":"","types":["Integer","X?","(X) -> X"],"urlPath":"list"},{"anchor":"list-contains?","kind":"function","line":258,"name":"contains?","qualifiedName":"List.contains?","signatures":["contains?(elem: X) -> Bool"],"summary":"Returns `true` if `elem` is present in the list.","types":["X","Bool"],"urlPath":"list"},{"anchor":"list-indexof","kind":"function","line":270,"name":"indexOf","qualifiedName":"List.indexOf","signatures":["indexOf(elem: X) -> Integer?"],"summary":"Returns `true` if the first index at which `elem` appears, wrapped in `Just`, or `None` if the element is not present.","types":["X","Integer?"],"urlPath":"list"},{"anchor":"list-findindex","kind":"function","line":283,"name":"findIndex","qualifiedName":"List.findIndex","signatures":["findIndex(pred: (X -> Bool)) -> Integer?"],"summary":"Returns the index of the first element satisfying `pred`, wrapped in `Just`, or `None` if none does. The predicate counterpart of `indexOf`, which searches by value.","types":["(X) -> Bool","Integer?"],"urlPath":"list"},{"anchor":"list-takewhile","kind":"function","line":300,"name":"takeWhile","qualifiedName":"List.takeWhile","signatures":["takeWhile(pred: (X -> Bool)) -> [X]"],"summary":"Returns the longest leading run of elements satisfying `pred`. Stops at the first element that does not, so it is not `filter` — later matches are dropped with everything after the first failure.","types":["((X) -> Bool) -> [X]"],"urlPath":"list"},{"anchor":"list-dropwhile","kind":"function","line":314,"name":"dropWhile","qualifiedName":"List.dropWhile","signatures":["dropWhile(pred: (X -> Bool)) -> [X]"],"summary":"Returns what is left after `takeWhile` — everything from the first element that does not satisfy `pred` onwards.","types":["((X) -> Bool) -> [X]"],"urlPath":"list"},{"anchor":"list-uniq","kind":"function","line":327,"name":"uniq","qualifiedName":"List.uniq","signatures":["uniq : [X]"],"summary":"Returns a new list with duplicate elements removed, preserving the first occurrence of each element.","types":[],"urlPath":"list"},{"anchor":"list-partition","kind":"function","line":338,"name":"partition","qualifiedName":"List.partition","signatures":["partition(pred: (X -> Bool)) -> ([X], [X])"],"summary":"Splits the list into two lists: those for which `pred` is `true` (first) and those for which it is `false` (second).","types":["(X) -> Bool","([X], [X])"],"urlPath":"list"},{"anchor":"list-collect","kind":"function","line":358,"name":"collect","qualifiedName":"List.collect","signatures":["collect(f: (X -> Y?)) -> [Y]"],"summary":"Maps each element through `f` (which returns an `Optional`), keeping and unwrapping the `Just(y)` results and dropping `None`. Filter + map fused.","types":["((X) -> Y?) -> [Y]"],"urlPath":"list"},{"anchor":"list-take","kind":"function","line":367,"name":"take","qualifiedName":"List.take","signatures":["take(n: Integer) -> [X]"],"summary":"Returns the first `n` elements.","types":["Integer","[X]"],"urlPath":"list"},{"anchor":"list-drop","kind":"function","line":377,"name":"drop","qualifiedName":"List.drop","signatures":["drop(n: Integer) -> [X]"],"summary":"Drops the first `n` elements.","types":["Integer","[X]"],"urlPath":"list"},{"anchor":"list-push","kind":"function","line":387,"name":"push","qualifiedName":"List.push","signatures":["push(x: X) -> [X]"],"summary":"Returns a new list with `x` appended at the end.","types":["X","[X]"],"urlPath":"list"},{"anchor":"list-reverse","kind":"function","line":396,"name":"reverse","qualifiedName":"List.reverse","signatures":["reverse : [X]"],"summary":"Returns the elements in reverse order.","types":[],"urlPath":"list"},{"anchor":"list-zip","kind":"function","line":407,"name":"zip","qualifiedName":"List.zip","signatures":["zip(other: [Y]) -> [(X, Y)]"],"summary":"Pairs each element of this list with the corresponding element of `other`. Stops at the end of the shorter list.","types":["[Y]","[(X, Y)]"],"urlPath":"list"},{"anchor":"list-flatten","kind":"function","line":416,"name":"flatten","qualifiedName":"List.flatten","signatures":["flatten : [X]"],"summary":"Flattens exactly one level of nesting. Only valid on lists of lists.","types":[],"urlPath":"list"},{"anchor":"list-sort","kind":"function","line":425,"name":"sort","qualifiedName":"List.sort","signatures":["sort : [X]"],"summary":"Returns the elements sorted in ascending natural order.","types":[],"urlPath":"list"},{"anchor":"list-sort","kind":"function","line":437,"name":"sort","qualifiedName":"List.sort","signatures":["sort(comp: (X -> X -> Bool)) -> [X]"],"summary":"Returns the elements sorted using a custom comparator. `comp` should return `true` when its first argument should come before its second.","types":["(X) -> (X) -> Bool","[X]"],"urlPath":"list"},{"anchor":"list-min","kind":"function","line":448,"name":"min","qualifiedName":"List.min","signatures":["min(f: (X -> Y)) -> X?"],"summary":"Returns the element with the smallest `f` key wrapped in `Just`, or `None` for an empty list.","types":["(X) -> Y","X?"],"urlPath":"list"},{"anchor":"list-max","kind":"function","line":459,"name":"max","qualifiedName":"List.max","signatures":["max(f: (X -> Y)) -> X?"],"summary":"Returns the element with the largest `f` key wrapped in `Just`, or `None` for an empty list.","types":["(X) -> Y","X?"],"urlPath":"list"},{"anchor":"list-sum","kind":"function","line":469,"name":"sum","qualifiedName":"List.sum","signatures":["sum(f: (X -> Number)) -> Number"],"summary":"Maps each element through `f` and sums the results.","types":["(X) -> Number","Number"],"urlPath":"list"},{"anchor":"list-join","kind":"function","line":486,"name":"join","qualifiedName":"List.join","signatures":["join(sep: String) -> String","join : String"],"summary":"Receiver is `[X]`, not `[String | Char]`: the intrinsic renders whatever it is given, so `[1, 2].join(\", \")` is \"1, 2\" on both backends. The narrower receiver only ever fired once element types became precise enough to catch it — until then `map`/`filter` handed `join` an unknown element type and the restriction checked nothing. Concatenates all elements, placing `sep` between each adjacent pair. With no separator the elements are joined directly.","types":["String"],"urlPath":"list"},{"anchor":"type-map","kind":"type","line":8,"name":"Map","qualifiedName":"Map","signatures":[],"summary":"Declared for the same reason list.kex declares `type List<X> = [X]`: it gives the name `Map` a source declaration, so it resolves as a type through the collected interfaces rather than needing to be known to the compiler.","types":[],"urlPath":"map"},{"anchor":"make-map","kind":"make","line":10,"name":"Map<K, V>","qualifiedName":"Map<K, V>","signatures":["reduce(acc, g)","combine(other: This) -> This","get(key: K) -> V?","get(key: K, default: V) -> V","put(k: K, v: V) -> Map<K, V>","delete(key: K) -> Map<K, V>","has?(key: K) -> Bool","empty? : Bool","count : Integer","count : (K -> V -> Bool) -> Integer","keys : [K]","values : [V]","entries : [(K, V)]","each : (K -> V -> Void) -> Void","map : (K -> V -> R) -> [R]","mapValues(f: (V -> W)) -> Map<K, W>","mapKeys(f: (K -> J)) -> Map<J, V>","filter(pred: (K -> V -> Bool)) -> Map<K, V>","reject(pred: (K -> V -> Bool)) -> Map<K, V>","merge(other: Map<K, V>) -> Map<K, V>","any? : (K -> V -> Bool) -> Bool","all? : (K -> V -> Bool) -> Bool","find : (K -> V -> Bool) -> (K, V)?","blank? : Bool"],"summary":"","types":["This","K","V?","(V) -> V","V","Map<K, V>","Bool","((K) -> (V) -> Bool) -> Integer","((K) -> (V) -> Void) -> Void","((K) -> (V) -> R) -> [R]","(V) -> W","Map<K, W>","(K) -> J","Map<J, V>","(K) -> (V) -> Bool","((K) -> (V) -> Bool) -> Bool","((K) -> (V) -> Bool) -> (K, V)?"],"urlPath":"map"},{"anchor":"map-reduce","kind":"function","line":14,"name":"reduce","qualifiedName":"Map.reduce","signatures":["reduce(acc, g)"],"summary":"Enumerable primitive: fold over (key, value) pairs in canonical (sorted) order. Collection-producing operations come from Enumerable and traversal queries come from Foldable; their two-arg blocks auto-splat each pair.","types":[],"urlPath":"map"},{"anchor":"map-identity","kind":"function","line":17,"name":"identity","qualifiedName":"Map.identity","signatures":[],"summary":"Maps form a right-biased Monoid under merge.","types":[],"urlPath":"map"},{"anchor":"map-combine","kind":"function","line":18,"name":"combine","qualifiedName":"Map.combine","signatures":["combine(other: This) -> This"],"summary":"","types":["This"],"urlPath":"map"},{"anchor":"map-get","kind":"function","line":27,"name":"get","qualifiedName":"Map.get","signatures":["get(key: K) -> V?","get(key: K, default: V) -> V"],"summary":"Returns the value for `key` wrapped in `Just`, or `None` if absent. When a `default` is supplied, returns the raw unwrapped value instead.","types":["K","V?","(V) -> V"],"urlPath":"map"},{"anchor":"map-put","kind":"function","line":38,"name":"put","qualifiedName":"Map.put","signatures":["put(k: K, v: V) -> Map<K, V>"],"summary":"Returns a new map with `key` mapped to `value`. Use `put!` to rebind the receiver variable.","types":["K","V","Map<K, V>"],"urlPath":"map"},{"anchor":"map-delete","kind":"function","line":46,"name":"delete","qualifiedName":"Map.delete","signatures":["delete(key: K) -> Map<K, V>"],"summary":"Returns a new map without `key`. No-op if the key is absent. Use `delete!` to rebind the receiver variable.","types":["K","Map<K, V>"],"urlPath":"map"},{"anchor":"map-has?","kind":"function","line":53,"name":"has?","qualifiedName":"Map.has?","signatures":["has?(key: K) -> Bool"],"summary":"Returns `true` if `key` exists in the map.","types":["K","Bool"],"urlPath":"map"},{"anchor":"map-empty?","kind":"function","line":60,"name":"empty?","qualifiedName":"Map.empty?","signatures":["empty? : Bool"],"summary":"Returns `true` if the map has no entries.","types":[],"urlPath":"map"},{"anchor":"map-count","kind":"function","line":69,"name":"count","qualifiedName":"Map.count","signatures":["count : Integer"],"summary":"Returns the number of key-value pairs. When given a predicate, counts only matching entries.","types":[],"urlPath":"map"},{"anchor":"map-count","kind":"function","line":71,"name":"count","qualifiedName":"Map.count","signatures":["count : (K -> V -> Bool) -> Integer"],"summary":"","types":["((K) -> (V) -> Bool) -> Integer"],"urlPath":"map"},{"anchor":"map-keys","kind":"function","line":77,"name":"keys","qualifiedName":"Map.keys","signatures":["keys : [K]"],"summary":"Returns all keys as a list, in insertion order.","types":[],"urlPath":"map"},{"anchor":"map-values","kind":"function","line":84,"name":"values","qualifiedName":"Map.values","signatures":["values : [V]"],"summary":"Returns all values as a list, in insertion order.","types":[],"urlPath":"map"},{"anchor":"map-entries","kind":"function","line":91,"name":"entries","qualifiedName":"Map.entries","signatures":["entries : [(K, V)]"],"summary":"Returns all key-value pairs as a list of tuples, in insertion order.","types":[],"urlPath":"map"},{"anchor":"map-each","kind":"function","line":98,"name":"each","qualifiedName":"Map.each","signatures":["each : (K -> V -> Void) -> Void"],"summary":"Calls `f` with each key-value pair for its side effects.","types":["((K) -> (V) -> Void) -> Void"],"urlPath":"map"},{"anchor":"map-map","kind":"function","line":104,"name":"map","qualifiedName":"Map.map","signatures":["map : (K -> V -> R) -> [R]"],"summary":"Transforms each entry by calling `f(k, v)`. Returns a list of results.","types":["((K) -> (V) -> R) -> [R]"],"urlPath":"map"},{"anchor":"map-mapvalues","kind":"function","line":110,"name":"mapValues","qualifiedName":"Map.mapValues","signatures":["mapValues(f: (V -> W)) -> Map<K, W>"],"summary":"Returns a new map with all values transformed by `f`.","types":["(V) -> W","Map<K, W>"],"urlPath":"map"},{"anchor":"map-mapkeys","kind":"function","line":120,"name":"mapKeys","qualifiedName":"Map.mapKeys","signatures":["mapKeys(f: (K -> J)) -> Map<J, V>"],"summary":"Returns a new map with all keys transformed by `f`.","types":["(K) -> J","Map<J, V>"],"urlPath":"map"},{"anchor":"map-filter","kind":"function","line":131,"name":"filter","qualifiedName":"Map.filter","signatures":["filter(pred: (K -> V -> Bool)) -> Map<K, V>"],"summary":"Returns a new map keeping only entries for which `pred` returns `true`.\n\nMap overrides the map-returning HOFs (Enumerable's default returns a list).","types":["(K) -> (V) -> Bool","Map<K, V>"],"urlPath":"map"},{"anchor":"map-reject","kind":"function","line":141,"name":"reject","qualifiedName":"Map.reject","signatures":["reject(pred: (K -> V -> Bool)) -> Map<K, V>"],"summary":"Returns a new map with all entries for which `pred` returns `true` removed.","types":["(K) -> (V) -> Bool","Map<K, V>"],"urlPath":"map"},{"anchor":"map-merge","kind":"function","line":152,"name":"merge","qualifiedName":"Map.merge","signatures":["merge(other: Map<K, V>) -> Map<K, V>"],"summary":"Returns a new map combining `this` and `other`. On key conflict, `other`'s value wins.","types":["Map<K, V>"],"urlPath":"map"},{"anchor":"map-any?","kind":"function","line":159,"name":"any?","qualifiedName":"Map.any?","signatures":["any? : (K -> V -> Bool) -> Bool"],"summary":"Returns `true` if at least one entry satisfies `pred`.","types":["((K) -> (V) -> Bool) -> Bool"],"urlPath":"map"},{"anchor":"map-all?","kind":"function","line":165,"name":"all?","qualifiedName":"Map.all?","signatures":["all? : (K -> V -> Bool) -> Bool"],"summary":"Returns `true` if every entry satisfies `pred`.","types":["((K) -> (V) -> Bool) -> Bool"],"urlPath":"map"},{"anchor":"map-find","kind":"function","line":172,"name":"find","qualifiedName":"Map.find","signatures":["find : (K -> V -> Bool) -> (K, V)?"],"summary":"Returns the first entry satisfying `pred` as a tuple wrapped in `Just`, or `None` if no entry matches.","types":["((K) -> (V) -> Bool) -> (K, V)?"],"urlPath":"map"},{"anchor":"map-blank?","kind":"function","line":176,"name":"blank?","qualifiedName":"Map.blank?","signatures":["blank? : Bool"],"summary":"","types":[],"urlPath":"map"},{"anchor":"module-math","kind":"module","line":6,"name":"Math","qualifiedName":"Math","signatures":["sqrt(x: Number) -> Float","cbrt(x: Number) -> Float","sin(x: Number) -> Float","cos(x: Number) -> Float","tan(x: Number) -> Float","asin(x: Number) -> Float","acos(x: Number) -> Float","atan(x: Number) -> Float","atan2(y: Number, x: Number) -> Float","sinh(x: Number) -> Float","cosh(x: Number) -> Float","tanh(x: Number) -> Float","log(x: Number) -> Float","log(x: Number, base: Number) -> Float","log2(x: Number) -> Float","log10(x: Number) -> Float","exp(x: Number) -> Float","pow(x: Number, y: Number) -> Float","abs(x: Number) -> Number","floor(x: Number) -> Integer","ceil(x: Number) -> Integer","hypot(x: Number, y: Number) -> Float"],"summary":"The `Math` module provides standard mathematical constants and functions. All trigonometric functions operate in radians. A Kex `Float` is always finite, so a domain error (`Math.sqrt(-1.0)`) or an overflow (`Math.exp(1000.0)`) raises rather than producing `NaN` or `Infinity` — the same rule BEAM enforces, where those two values cannot exist at all.","types":["","Number","Float","(Number) -> Float","Integer"],"urlPath":"math"},{"anchor":"constant-math-pi","kind":"constant","line":12,"name":"PI","qualifiedName":"Math.PI","signatures":[],"summary":"Math.PI : Float Ratio of a circle's circumference to its diameter.","types":[""],"urlPath":"math"},{"anchor":"constant-math-e","kind":"constant","line":19,"name":"E","qualifiedName":"Math.E","signatures":[],"summary":"Math.E : Float Base of the natural logarithm.","types":[""],"urlPath":"math"},{"anchor":"function-math-sqrt","kind":"function","line":29,"name":"sqrt","qualifiedName":"Math.sqrt","signatures":["sqrt(x: Number) -> Float"],"summary":"Square root of `x`. Raises for negative input, which has no real root.","types":["Number","Float"],"urlPath":"math"},{"anchor":"function-math-cbrt","kind":"function","line":39,"name":"cbrt","qualifiedName":"Math.cbrt","signatures":["cbrt(x: Number) -> Float"],"summary":"Cube root of `x`.","types":["Number","Float"],"urlPath":"math"},{"anchor":"function-math-sin","kind":"function","line":49,"name":"sin","qualifiedName":"Math.sin","signatures":["sin(x: Number) -> Float"],"summary":"Sine of `x` (radians).","types":["Number","Float"],"urlPath":"math"},{"anchor":"function-math-cos","kind":"function","line":59,"name":"cos","qualifiedName":"Math.cos","signatures":["cos(x: Number) -> Float"],"summary":"Cosine of `x` (radians).","types":["Number","Float"],"urlPath":"math"},{"anchor":"function-math-tan","kind":"function","line":69,"name":"tan","qualifiedName":"Math.tan","signatures":["tan(x: Number) -> Float"],"summary":"Tangent of `x` (radians).","types":["Number","Float"],"urlPath":"math"},{"anchor":"function-math-asin","kind":"function","line":79,"name":"asin","qualifiedName":"Math.asin","signatures":["asin(x: Number) -> Float"],"summary":"Inverse sine (arc sine) of `x`, result in radians.","types":["Number","Float"],"urlPath":"math"},{"anchor":"function-math-acos","kind":"function","line":89,"name":"acos","qualifiedName":"Math.acos","signatures":["acos(x: Number) -> Float"],"summary":"Inverse cosine (arc cosine) of `x`, result in radians.","types":["Number","Float"],"urlPath":"math"},{"anchor":"function-math-atan","kind":"function","line":99,"name":"atan","qualifiedName":"Math.atan","signatures":["atan(x: Number) -> Float"],"summary":"Inverse tangent (arc tangent) of `x`, result in radians in (-π/2, π/2).","types":["Number","Float"],"urlPath":"math"},{"anchor":"function-math-atan2","kind":"function","line":112,"name":"atan2","qualifiedName":"Math.atan2","signatures":["atan2(y: Number, x: Number) -> Float"],"summary":"Two-argument arc tangent. Returns the angle of vector (`x`, `y`) in (-π, π]. Handles the sign of both arguments to place the result in the correct quadrant.","types":["Number","Float"],"urlPath":"math"},{"anchor":"function-math-sinh","kind":"function","line":119,"name":"sinh","qualifiedName":"Math.sinh","signatures":["sinh(x: Number) -> Float"],"summary":"Hyperbolic sine.","types":["Number","Float"],"urlPath":"math"},{"anchor":"function-math-cosh","kind":"function","line":126,"name":"cosh","qualifiedName":"Math.cosh","signatures":["cosh(x: Number) -> Float"],"summary":"Hyperbolic cosine.","types":["Number","Float"],"urlPath":"math"},{"anchor":"function-math-tanh","kind":"function","line":133,"name":"tanh","qualifiedName":"Math.tanh","signatures":["tanh(x: Number) -> Float"],"summary":"Hyperbolic tangent.","types":["Number","Float"],"urlPath":"math"},{"anchor":"function-math-log","kind":"function","line":146,"name":"log","qualifiedName":"Math.log","signatures":["log(x: Number) -> Float","log(x: Number, base: Number) -> Float"],"summary":"Natural logarithm of `x` (base e). With two arguments, computes log base `base`.","types":["Number","Float","(Number) -> Float"],"urlPath":"math"},{"anchor":"function-math-log2","kind":"function","line":158,"name":"log2","qualifiedName":"Math.log2","signatures":["log2(x: Number) -> Float"],"summary":"Base-2 logarithm of `x`.","types":["Number","Float"],"urlPath":"math"},{"anchor":"function-math-log10","kind":"function","line":168,"name":"log10","qualifiedName":"Math.log10","signatures":["log10(x: Number) -> Float"],"summary":"Base-10 logarithm of `x`.","types":["Number","Float"],"urlPath":"math"},{"anchor":"function-math-exp","kind":"function","line":178,"name":"exp","qualifiedName":"Math.exp","signatures":["exp(x: Number) -> Float"],"summary":"`e` raised to the power `x`.","types":["Number","Float"],"urlPath":"math"},{"anchor":"function-math-pow","kind":"function","line":189,"name":"pow","qualifiedName":"Math.pow","signatures":["pow(x: Number, y: Number) -> Float"],"summary":"`x` raised to the power `y`.","types":["Number","Float"],"urlPath":"math"},{"anchor":"function-math-abs","kind":"function","line":196,"name":"abs","qualifiedName":"Math.abs","signatures":["abs(x: Number) -> Number"],"summary":"Absolute value of `x`.","types":["Number"],"urlPath":"math"},{"anchor":"function-math-floor","kind":"function","line":203,"name":"floor","qualifiedName":"Math.floor","signatures":["floor(x: Number) -> Integer"],"summary":"Floor of `x` — largest integer not greater than `x`.","types":["Number","Integer"],"urlPath":"math"},{"anchor":"function-math-ceil","kind":"function","line":210,"name":"ceil","qualifiedName":"Math.ceil","signatures":["ceil(x: Number) -> Integer"],"summary":"Ceiling of `x` — smallest integer not less than `x`.","types":["Number","Integer"],"urlPath":"math"},{"anchor":"function-math-hypot","kind":"function","line":222,"name":"hypot","qualifiedName":"Math.hypot","signatures":["hypot(x: Number, y: Number) -> Float"],"summary":"Euclidean distance — equivalent to +sqrt(x*x + y*y)+ but avoids intermediate overflow for large values.","types":["Number","Float"],"urlPath":"math"},{"anchor":"type-reader","kind":"type","line":27,"name":"Reader","qualifiedName":"Reader","signatures":[],"summary":"Mock — deterministic stand-ins for the world outside the program: the filesystem, the network, the environment, the console.\n\nThese are STATEFUL: `Mock.FS.File(path, content)` writes into a store the real `FS.File` then reads back, so a test can write and read again, and `clear()` undoes it. That state is global and lives until cleared, which is what makes hook ordering and write/read round trips testable — and also what makes two tests able to interfere.\n\nWhen a test only needs canned ANSWERS, replacing the capability is the better tool: `with FS.File = MyFake { ... } do ... end` swaps the implementation for one lexical region, holds no global state, needs no clearing, and cannot leak into another test. See spec/capability_stdlib_fs.kex for the shape of a stand-in (kexhq/kex#143).\n\nOpt-in on purpose (issue #144): this module used to ride along inside http.kex, so `using HTTP` in the prelude made every Mock.* reachable from every program without anyone asking for it. Reachable is still not callable — the runtime denies the mock intrinsics outside spec files, the REPL, and --allow-mocks — but it should also not be in scope by accident. A qualified `Mock.FS.File(...)` auto-loads this file like any other opt-in module.\n\nAll Mock.* sub-modules live in a single `module Mock` block so merged compilation units never see duplicate top-level `Mock` modules. A stand-in's read hook: a path in, its content or `None` out.","types":[],"urlPath":"mock"},{"anchor":"type-lookup","kind":"type","line":30,"name":"Lookup","qualifiedName":"Lookup","signatures":[],"summary":"An environment stand-in's lookup hook: a name in, its value or `None` out.","types":[],"urlPath":"mock"},{"anchor":"type-writer","kind":"type","line":38,"name":"Writer","qualifiedName":"Writer","signatures":[],"summary":"An environment stand-in's WRITE hook: the name and the value a program set. A `Mock.Env` is an immutable record, so a write cannot land in its `vars` — and it must not reach the real environment, or a test would leak a variable into the next one and into anything the suite starts. The hook is how a test observes the write instead: record it, assert on it, or ignore it, which is what `None` does.","types":[],"urlPath":"mock"},{"anchor":"module-mock","kind":"module","line":40,"name":"Mock","qualifiedName":"Mock","signatures":["File(path: FS.FilePath, content: String) -> Void","Directory(path: FS.FilePath) -> Void","clear : Void","files(entries: Map<FS.FilePath, String>) -> Void","onRead(reader: Reader) -> Void","start : Void","respond(status: Integer, body: String) -> Void","respond(status: Integer, body: String) -> Map<String, String> -> Void","stop : Void","set(name: String, value: String) -> Void","unset(name: String) -> Void","clear : Void","vars(entries: Map<String, String>) -> Void","start : Void","stop : Void","output : String","clear : Void","input(first, second, third, fourth) -> Void","cannedRead(path)","read(path)","readLines(path)","feed(path)","size(path)","exists?(path)","file?(path)","directory?(path)","absolute(path)","open(path, mode)","write(path, content)","append(path, content)","delete(path)","copy(src, dst)","rename(src, dst)","lookup(key)","get(key, default)","has?(key)","keys","values","count","each(f)","entries","set(name, value)","unset(name)","get(url, opts)","post(url, body, opts)","put(url, body, opts)","patch(url, body, opts)","delete(url, opts)","head(url, opts)","options(url, opts)"],"summary":"","types":["Map<FS.FilePath, String>","Reader?","Map<String, String>","Lookup?","Writer?","Integer","String","FS.FilePath","Void","Reader","(Map<String, String>) -> Void"],"urlPath":"mock"},{"anchor":"record-mock-files","kind":"record","line":55,"name":"Files","qualifiedName":"Mock.Files","signatures":[],"summary":"A stand-in for the `FS.File` capability, for `with FS.File = ...`. Unlike the `Mock.*` functions below it holds no global state, needs no `clear()`, and cannot leak past its block. What it cannot do is change: `write` then `read` back is not something a value does, so a test needing that round trip still wants `Mock.FS` (kexhq/kex#143).\n\n```kex\nwith FS.File = Mock.Files { files: {\"kex.toml\": \"name = \\\"demo\\\"\"} } do\n  assert(loadConfig() == \"demo\")\nend\n```\n\n`onRead` takes over when a test needs an ANSWER rather than a fixture — content derived from the path, a failure on the third call, a record of what was asked for. It is consulted first and its `None` means \"no such file\", so a callback can model absence too.","types":["Map<FS.FilePath, String>","Reader?"],"urlPath":"mock"},{"anchor":"record-mock-env","kind":"record","line":68,"name":"Env","qualifiedName":"Mock.Env","signatures":[],"summary":"A stand-in for the `ENV` capability. A name simply left out of `vars` reads as unset, which is the whole reason `Mock.ENV.unset` exists — absence is an answer programs act on. `onGet` answers instead of the map when a test wants a rule rather than a fixture.\n\n```kex\nwith ENV = Mock.Env { vars: {\"HOME\": \"/fake\"} } do\n  assert(configHome() == \"/fake/.config\")\nend\n```","types":["Map<String, String>","Lookup?","Writer?"],"urlPath":"mock"},{"anchor":"record-mock-response","kind":"record","line":82,"name":"Response","qualifiedName":"Mock.Response","signatures":[],"summary":"A stand-in for the `Http` capability: one canned response for every request, whatever the verb, URL or body. That is what a client test needs, being about what the program does WITH a response.\n\nNOT named `Http`: a record of that name is indistinguishable from the capability itself at a call site, and the `make` block binds to the capability rather than the record — every request then reaches the real network while the test looks like it is faking one.","types":["Integer","String","Map<String, String>"],"urlPath":"mock"},{"anchor":"module-mock-fs","kind":"module","line":88,"name":"Mock.FS","qualifiedName":"Mock.FS","signatures":["File(path: FS.FilePath, content: String) -> Void","Directory(path: FS.FilePath) -> Void","clear : Void","files(entries: Map<FS.FilePath, String>) -> Void","onRead(reader: Reader) -> Void"],"summary":"","types":["FS.FilePath","String","Void","Map<FS.FilePath, String>","Reader"],"urlPath":"mock"},{"anchor":"function-mock-fs-file","kind":"function","line":89,"name":"File","qualifiedName":"Mock.FS.File","signatures":["File(path: FS.FilePath, content: String) -> Void"],"summary":"","types":["FS.FilePath","String","Void"],"urlPath":"mock"},{"anchor":"function-mock-fs-directory","kind":"function","line":90,"name":"Directory","qualifiedName":"Mock.FS.Directory","signatures":["Directory(path: FS.FilePath) -> Void"],"summary":"","types":["FS.FilePath","Void"],"urlPath":"mock"},{"anchor":"function-mock-fs-clear","kind":"function","line":91,"name":"clear","qualifiedName":"Mock.FS.clear","signatures":["clear : Void"],"summary":"","types":["Void"],"urlPath":"mock"},{"anchor":"function-mock-fs-files","kind":"function","line":95,"name":"files","qualifiedName":"Mock.FS.files","signatures":["files(entries: Map<FS.FilePath, String>) -> Void"],"summary":"The whole fixture in one call, the same shape `Mock.Files { files: ... }` takes — one line instead of one per file (kexhq/kex#143).","types":["Map<FS.FilePath, String>","Void"],"urlPath":"mock"},{"anchor":"function-mock-fs-onread","kind":"function","line":101,"name":"onRead","qualifiedName":"Mock.FS.onRead","signatures":["onRead(reader: Reader) -> Void"],"summary":"Answer reads by RULE rather than from a fixture: content derived from the path, a failure on the third call, a record of what was asked for. Consulted before the map, and returning `None` means \"no such file\", so absence is expressible too.","types":["Reader","Void"],"urlPath":"mock"},{"anchor":"module-mock-http","kind":"module","line":124,"name":"Mock.Http","qualifiedName":"Mock.Http","signatures":["start : Void","respond(status: Integer, body: String) -> Void","respond(status: Integer, body: String) -> Map<String, String> -> Void","stop : Void"],"summary":"","types":["Void","Integer","String","(Map<String, String>) -> Void","Map<String, String>"],"urlPath":"mock"},{"anchor":"function-mock-http-start","kind":"function","line":125,"name":"start","qualifiedName":"Mock.Http.start","signatures":["start : Void"],"summary":"","types":["Void"],"urlPath":"mock"},{"anchor":"function-mock-http-respond","kind":"function","line":126,"name":"respond","qualifiedName":"Mock.Http.respond","signatures":["respond(status: Integer, body: String) -> Void","respond(status: Integer, body: String) -> Map<String, String> -> Void"],"summary":"","types":["Integer","String","Void","(Map<String, String>) -> Void","Map<String, String>"],"urlPath":"mock"},{"anchor":"function-mock-http-stop","kind":"function","line":128,"name":"stop","qualifiedName":"Mock.Http.stop","signatures":["stop : Void"],"summary":"","types":["Void"],"urlPath":"mock"},{"anchor":"module-mock-env","kind":"module","line":150,"name":"Mock.ENV","qualifiedName":"Mock.ENV","signatures":["set(name: String, value: String) -> Void","unset(name: String) -> Void","clear : Void","vars(entries: Map<String, String>) -> Void"],"summary":"Overlays the process environment, so a test can say what `ENV` holds instead of depending on how it was launched. `unset` is separate because a variable being ABSENT is an answer programs act on.","types":["String","Void","Map<String, String>"],"urlPath":"mock"},{"anchor":"function-mock-env-set","kind":"function","line":151,"name":"set","qualifiedName":"Mock.ENV.set","signatures":["set(name: String, value: String) -> Void"],"summary":"","types":["String","Void"],"urlPath":"mock"},{"anchor":"function-mock-env-unset","kind":"function","line":152,"name":"unset","qualifiedName":"Mock.ENV.unset","signatures":["unset(name: String) -> Void"],"summary":"","types":["String","Void"],"urlPath":"mock"},{"anchor":"function-mock-env-clear","kind":"function","line":153,"name":"clear","qualifiedName":"Mock.ENV.clear","signatures":["clear : Void"],"summary":"","types":["Void"],"urlPath":"mock"},{"anchor":"function-mock-env-vars","kind":"function","line":159,"name":"vars","qualifiedName":"Mock.ENV.vars","signatures":["vars(entries: Map<String, String>) -> Void"],"summary":"The whole overlay in one call, the same shape `Mock.Env { vars: ... }` takes (kexhq/kex#143). There is no `onGet` here: global `ENV` is a materialised Map, so there is nothing for a callback to intercept — use `with ENV = Mock.Env { onGet: ... }` when a rule is what you want.","types":["Map<String, String>","Void"],"urlPath":"mock"},{"anchor":"module-mock-io","kind":"module","line":178,"name":"Mock.IO","qualifiedName":"Mock.IO","signatures":["start : Void","stop : Void","output : String","clear : Void","input(first, second, third, fourth) -> Void"],"summary":"","types":["Void","String"],"urlPath":"mock"},{"anchor":"function-mock-io-start","kind":"function","line":179,"name":"start","qualifiedName":"Mock.IO.start","signatures":["start : Void"],"summary":"","types":["Void"],"urlPath":"mock"},{"anchor":"function-mock-io-stop","kind":"function","line":183,"name":"stop","qualifiedName":"Mock.IO.stop","signatures":["stop : Void"],"summary":"","types":["Void"],"urlPath":"mock"},{"anchor":"function-mock-io-output","kind":"function","line":187,"name":"output","qualifiedName":"Mock.IO.output","signatures":["output : String"],"summary":"","types":["String"],"urlPath":"mock"},{"anchor":"function-mock-io-clear","kind":"function","line":191,"name":"clear","qualifiedName":"Mock.IO.clear","signatures":["clear : Void"],"summary":"","types":["Void"],"urlPath":"mock"},{"anchor":"function-mock-io-input","kind":"function","line":195,"name":"input","qualifiedName":"Mock.IO.input","signatures":["input(first, second, third, fourth) -> Void"],"summary":"","types":["Void"],"urlPath":"mock"},{"anchor":"make-files","kind":"make","line":212,"name":"Files","qualifiedName":"Files","signatures":["cannedRead(path)","read(path)","readLines(path)","feed(path)","size(path)","exists?(path)","file?(path)","directory?(path)","absolute(path)","open(path, mode)","write(path, content)","append(path, content)","delete(path)","copy(src, dst)","rename(src, dst)"],"summary":"","types":[],"urlPath":"mock"},{"anchor":"files-cannedread","kind":"function","line":215,"name":"cannedRead","qualifiedName":"Files.cannedRead","signatures":["cannedRead(path)"],"summary":"Named apart from `read`: `this.read(path)` would bind to the capability's own `read : FilePath -> String?`, not to this method.","types":[],"urlPath":"mock"},{"anchor":"files-read","kind":"function","line":220,"name":"read","qualifiedName":"Files.read","signatures":["read(path)"],"summary":"","types":[],"urlPath":"mock"},{"anchor":"files-readlines","kind":"function","line":221,"name":"readLines","qualifiedName":"Files.readLines","signatures":["readLines(path)"],"summary":"","types":[],"urlPath":"mock"},{"anchor":"files-feed","kind":"function","line":222,"name":"feed","qualifiedName":"Files.feed","signatures":["feed(path)"],"summary":"","types":[],"urlPath":"mock"},{"anchor":"files-size","kind":"function","line":223,"name":"size","qualifiedName":"Files.size","signatures":["size(path)"],"summary":"","types":[],"urlPath":"mock"},{"anchor":"files-exists?","kind":"function","line":224,"name":"exists?","qualifiedName":"Files.exists?","signatures":["exists?(path)"],"summary":"","types":[],"urlPath":"mock"},{"anchor":"files-file?","kind":"function","line":225,"name":"file?","qualifiedName":"Files.file?","signatures":["file?(path)"],"summary":"","types":[],"urlPath":"mock"},{"anchor":"files-directory?","kind":"function","line":226,"name":"directory?","qualifiedName":"Files.directory?","signatures":["directory?(path)"],"summary":"","types":[],"urlPath":"mock"},{"anchor":"files-absolute","kind":"function","line":227,"name":"absolute","qualifiedName":"Files.absolute","signatures":["absolute(path)"],"summary":"","types":[],"urlPath":"mock"},{"anchor":"files-open","kind":"function","line":232,"name":"open","qualifiedName":"Files.open","signatures":["open(path, mode)"],"summary":"A fake is a value, so there is nowhere for a write to go. Refusing is the honest answer and the useful one: a test that did not expect a write sees it fail rather than silently succeed.","types":[],"urlPath":"mock"},{"anchor":"files-write","kind":"function","line":233,"name":"write","qualifiedName":"Files.write","signatures":["write(path, content)"],"summary":"","types":[],"urlPath":"mock"},{"anchor":"files-append","kind":"function","line":234,"name":"append","qualifiedName":"Files.append","signatures":["append(path, content)"],"summary":"","types":[],"urlPath":"mock"},{"anchor":"files-delete","kind":"function","line":235,"name":"delete","qualifiedName":"Files.delete","signatures":["delete(path)"],"summary":"","types":[],"urlPath":"mock"},{"anchor":"files-copy","kind":"function","line":236,"name":"copy","qualifiedName":"Files.copy","signatures":["copy(src, dst)"],"summary":"","types":[],"urlPath":"mock"},{"anchor":"files-rename","kind":"function","line":237,"name":"rename","qualifiedName":"Files.rename","signatures":["rename(src, dst)"],"summary":"","types":[],"urlPath":"mock"},{"anchor":"make-env","kind":"make","line":240,"name":"Env","qualifiedName":"Env","signatures":["lookup(key)","get(key, default)","has?(key)","keys","values","count","each(f)","entries","set(name, value)","unset(name)"],"summary":"","types":[],"urlPath":"mock"},{"anchor":"env-lookup","kind":"function","line":243,"name":"lookup","qualifiedName":"Env.lookup","signatures":["lookup(key)"],"summary":"Named apart from `get`: `this.get(key)` would bind to the capability's own `get`, not to this method.","types":[],"urlPath":"mock"},{"anchor":"env-get","kind":"function","line":248,"name":"get","qualifiedName":"Env.get","signatures":["get(key, default)"],"summary":"","types":[],"urlPath":"mock"},{"anchor":"env-has?","kind":"function","line":250,"name":"has?","qualifiedName":"Env.has?","signatures":["has?(key)"],"summary":"","types":[],"urlPath":"mock"},{"anchor":"env-keys","kind":"function","line":251,"name":"keys","qualifiedName":"Env.keys","signatures":["keys"],"summary":"","types":[],"urlPath":"mock"},{"anchor":"env-values","kind":"function","line":252,"name":"values","qualifiedName":"Env.values","signatures":["values"],"summary":"","types":[],"urlPath":"mock"},{"anchor":"env-count","kind":"function","line":253,"name":"count","qualifiedName":"Env.count","signatures":["count"],"summary":"","types":[],"urlPath":"mock"},{"anchor":"env-each","kind":"function","line":254,"name":"each","qualifiedName":"Env.each","signatures":["each(f)"],"summary":"","types":[],"urlPath":"mock"},{"anchor":"env-entries","kind":"function","line":255,"name":"entries","qualifiedName":"Env.entries","signatures":["entries"],"summary":"","types":[],"urlPath":"mock"},{"anchor":"env-set","kind":"function","line":263,"name":"set","qualifiedName":"Env.set","signatures":["set(name, value)"],"summary":"A write goes to `onSet` or nowhere. It must NOT reach the real environment: a substituted ENV is the whole point of the mock, and a test that set a variable would otherwise leak it into the next one and into every process the suite starts. `vars` cannot take it either — a record is immutable — so a test that cares about writes supplies the hook, and one that does not gets a write that goes quietly nowhere.","types":[],"urlPath":"mock"},{"anchor":"env-unset","kind":"function","line":267,"name":"unset","qualifiedName":"Env.unset","signatures":["unset(name)"],"summary":"","types":[],"urlPath":"mock"},{"anchor":"make-response","kind":"make","line":273,"name":"Response","qualifiedName":"Response","signatures":["get(url, opts)","post(url, body, opts)","put(url, body, opts)","patch(url, body, opts)","delete(url, opts)","head(url, opts)","options(url, opts)"],"summary":"","types":[],"urlPath":"mock"},{"anchor":"response-canned","kind":"function","line":275,"name":"canned","qualifiedName":"Response.canned","signatures":[],"summary":"The one canned response, built once and returned for every request.","types":[],"urlPath":"mock"},{"anchor":"response-get","kind":"function","line":281,"name":"get","qualifiedName":"Response.get","signatures":["get(url, opts)"],"summary":"","types":[],"urlPath":"mock"},{"anchor":"response-post","kind":"function","line":283,"name":"post","qualifiedName":"Response.post","signatures":["post(url, body, opts)"],"summary":"","types":[],"urlPath":"mock"},{"anchor":"response-put","kind":"function","line":285,"name":"put","qualifiedName":"Response.put","signatures":["put(url, body, opts)"],"summary":"","types":[],"urlPath":"mock"},{"anchor":"response-patch","kind":"function","line":287,"name":"patch","qualifiedName":"Response.patch","signatures":["patch(url, body, opts)"],"summary":"","types":[],"urlPath":"mock"},{"anchor":"response-delete","kind":"function","line":289,"name":"delete","qualifiedName":"Response.delete","signatures":["delete(url, opts)"],"summary":"","types":[],"urlPath":"mock"},{"anchor":"response-head","kind":"function","line":291,"name":"head","qualifiedName":"Response.head","signatures":["head(url, opts)"],"summary":"","types":[],"urlPath":"mock"},{"anchor":"response-options","kind":"function","line":293,"name":"options","qualifiedName":"Response.options","signatures":["options(url, opts)"],"summary":"","types":[],"urlPath":"mock"},{"anchor":"make-integer","kind":"make","line":1,"name":"Integer","qualifiedName":"Integer","signatures":["even? : Bool","odd? : Bool","abs : Integer","sqrt : Float","modulo(n: Integer) -> Integer","in?(range: Range<Integer>) -> Bool","times(block: (Integer -> Void)) -> Void","floor : Integer","ceil : Integer","round : Integer"],"summary":"","types":["Integer","Range<Integer>","Bool","(Integer) -> Void","Void"],"urlPath":"number"},{"anchor":"integer-even?","kind":"function","line":9,"name":"even?","qualifiedName":"Integer.even?","signatures":["even? : Bool"],"summary":"Returns `true` if the integer is even.","types":[],"urlPath":"number"},{"anchor":"integer-odd?","kind":"function","line":19,"name":"odd?","qualifiedName":"Integer.odd?","signatures":["odd? : Bool"],"summary":"Returns `true` if the integer is odd.","types":[],"urlPath":"number"},{"anchor":"integer-abs","kind":"function","line":29,"name":"abs","qualifiedName":"Integer.abs","signatures":["abs : Integer"],"summary":"Returns the absolute value.","types":[],"urlPath":"number"},{"anchor":"integer-sqrt","kind":"function","line":38,"name":"sqrt","qualifiedName":"Integer.sqrt","signatures":["sqrt : Float"],"summary":"Returns the square root as a Float.","types":[],"urlPath":"number"},{"anchor":"integer-modulo","kind":"function","line":50,"name":"modulo","qualifiedName":"Integer.modulo","signatures":["modulo(n: Integer) -> Integer"],"summary":"Returns `this` modulo `n`. The result has the same sign as `n`, consistent with mathematical modulo (not C remainder).","types":["Integer"],"urlPath":"number"},{"anchor":"integer-in?","kind":"function","line":61,"name":"in?","qualifiedName":"Integer.in?","signatures":["in?(range: Range<Integer>) -> Bool"],"summary":"Returns `true` if the integer falls within `range` (inclusive).","types":["Range<Integer>","Bool"],"urlPath":"number"},{"anchor":"integer-times","kind":"function","line":71,"name":"times","qualifiedName":"Integer.times","signatures":["times(block: (Integer -> Void)) -> Void"],"summary":"Calls `f` exactly `this` times, passing the current index (0-based).","types":["(Integer) -> Void","Void"],"urlPath":"number"},{"anchor":"integer-floor","kind":"function","line":75,"name":"floor","qualifiedName":"Integer.floor","signatures":["floor : Integer"],"summary":"Returns the greatest integer ≤ this. No-op on integers.","types":[],"urlPath":"number"},{"anchor":"integer-ceil","kind":"function","line":79,"name":"ceil","qualifiedName":"Integer.ceil","signatures":["ceil : Integer"],"summary":"Returns the smallest integer ≥ this. No-op on integers.","types":[],"urlPath":"number"},{"anchor":"integer-round","kind":"function","line":83,"name":"round","qualifiedName":"Integer.round","signatures":["round : Integer"],"summary":"Rounds to the nearest integer. No-op on integers.","types":[],"urlPath":"number"},{"anchor":"make-float","kind":"make","line":88,"name":"Float","qualifiedName":"Float","signatures":["abs : Float","sqrt : Float","in?(range: Range<Float>) -> Bool","floor : Integer","ceil : Integer","round : Integer","toInteger : Integer"],"summary":"","types":["Range<Float>","Bool"],"urlPath":"number"},{"anchor":"float-abs","kind":"function","line":95,"name":"abs","qualifiedName":"Float.abs","signatures":["abs : Float"],"summary":"Returns the absolute value.","types":[],"urlPath":"number"},{"anchor":"float-sqrt","kind":"function","line":104,"name":"sqrt","qualifiedName":"Float.sqrt","signatures":["sqrt : Float"],"summary":"Returns the square root.","types":[],"urlPath":"number"},{"anchor":"float-in?","kind":"function","line":114,"name":"in?","qualifiedName":"Float.in?","signatures":["in?(range: Range<Float>) -> Bool"],"summary":"Returns `true` if the float falls within `range` (inclusive).","types":["Range<Float>","Bool"],"urlPath":"number"},{"anchor":"float-floor","kind":"function","line":118,"name":"floor","qualifiedName":"Float.floor","signatures":["floor : Integer"],"summary":"Returns the greatest integer ≤ this.","types":[],"urlPath":"number"},{"anchor":"float-ceil","kind":"function","line":122,"name":"ceil","qualifiedName":"Float.ceil","signatures":["ceil : Integer"],"summary":"Returns the smallest integer ≥ this.","types":[],"urlPath":"number"},{"anchor":"float-round","kind":"function","line":126,"name":"round","qualifiedName":"Float.round","signatures":["round : Integer"],"summary":"Rounds to the nearest integer.","types":[],"urlPath":"number"},{"anchor":"float-tointeger","kind":"function","line":130,"name":"toInteger","qualifiedName":"Float.toInteger","signatures":["toInteger : Integer"],"summary":"Truncates toward zero, converting to an `Integer`.","types":[],"urlPath":"number"},{"anchor":"module-integer","kind":"module","line":134,"name":"Integer","qualifiedName":"Integer","signatures":["parse(s: String) -> Result<Integer, ParseError>","parse(s: String, radix: Integer) -> Result<Integer, ParseError>","parsePrefix(s: String) -> (Integer, String)?"],"summary":"","types":["String","Result<Integer, ParseError>","(Integer) -> Result<Integer, ParseError>","Integer","(Integer, String)?"],"urlPath":"number"},{"anchor":"function-integer-parse","kind":"function","line":135,"name":"parse","qualifiedName":"Integer.parse","signatures":["parse(s: String) -> Result<Integer, ParseError>","parse(s: String, radix: Integer) -> Result<Integer, ParseError>"],"summary":"Parses `s` in base `radix` (2..36), e.g. `Integer.parse(\"ff\", radix: 16)`. Digits above 9 are accepted in either case.","types":["String","Result<Integer, ParseError>","(Integer) -> Result<Integer, ParseError>","Integer"],"urlPath":"number"},{"anchor":"function-integer-parseprefix","kind":"function","line":143,"name":"parsePrefix","qualifiedName":"Integer.parsePrefix","signatures":["parsePrefix(s: String) -> (Integer, String)?"],"summary":"","types":["String","(Integer, String)?"],"urlPath":"number"},{"anchor":"module-float","kind":"module","line":147,"name":"Float","qualifiedName":"Float","signatures":["parse(s: String) -> Result<Float, ParseError>","parsePrefix(s: String) -> (Float, String)?"],"summary":"","types":["String","Result<Float, ParseError>","(Float, String)?"],"urlPath":"number"},{"anchor":"function-float-parse","kind":"function","line":148,"name":"parse","qualifiedName":"Float.parse","signatures":["parse(s: String) -> Result<Float, ParseError>"],"summary":"","types":["String","Result<Float, ParseError>"],"urlPath":"number"},{"anchor":"function-float-parseprefix","kind":"function","line":151,"name":"parsePrefix","qualifiedName":"Float.parsePrefix","signatures":["parsePrefix(s: String) -> (Float, String)?"],"summary":"","types":["String","(Float, String)?"],"urlPath":"number"},{"anchor":"module-number","kind":"module","line":155,"name":"Number","qualifiedName":"Number","signatures":["parse(s: String) -> Result<Number, ParseError>"],"summary":"","types":["String","Result<Number, ParseError>"],"urlPath":"number"},{"anchor":"function-number-parse","kind":"function","line":156,"name":"parse","qualifiedName":"Number.parse","signatures":["parse(s: String) -> Result<Number, ParseError>"],"summary":"","types":["String","Result<Number, ParseError>"],"urlPath":"number"},{"anchor":"type-optional","kind":"type","line":3,"name":"Optional","qualifiedName":"Optional","signatures":[],"summary":"`X?` is shorthand for `Optional<X>`. `Just(x)` wraps a value; `None` represents absence.","types":["X"],"urlPath":"optional"},{"anchor":"type-result","kind":"type","line":7,"name":"Result","qualifiedName":"Result","signatures":[],"summary":"`Result<X, E>` represents a computation that either succeeded with `Ok(x)` or failed with `Error(e)`.","types":["X","E"],"urlPath":"optional"},{"anchor":"type-either","kind":"type","line":10,"name":"Either","qualifiedName":"Either","signatures":[],"summary":"`Either<L, R>` holds one of two possible value types.","types":["L","R"],"urlPath":"optional"},{"anchor":"trait-optionable","kind":"trait","line":14,"name":"Optionable","qualifiedName":"Optionable","signatures":[],"summary":"Marker traits used by generic code that accepts one of these ADT families. Their conformances are exported through KexI like any user-defined trait.","types":[],"urlPath":"optional"},{"anchor":"trait-resultable","kind":"trait","line":17,"name":"Resultable","qualifiedName":"Resultable","signatures":[],"summary":"","types":[],"urlPath":"optional"},{"anchor":"trait-eitherable","kind":"trait","line":20,"name":"Eitherable","qualifiedName":"Eitherable","signatures":[],"summary":"","types":[],"urlPath":"optional"},{"anchor":"make-optional","kind":"make","line":23,"name":"Optional<X>","qualifiedName":"Optional<X>","signatures":["set? : Bool","none? : Bool","or(default: X) -> X","map(f: (X -> Y)) -> Y?","flatMap(f: (X -> Y?)) -> Y?"],"summary":"","types":["Bool","(X) -> X","((X) -> Y) -> Y?","((X) -> Y?) -> Y?"],"urlPath":"optional"},{"anchor":"optional-set?","kind":"function","line":31,"name":"set?","qualifiedName":"Optional.set?","signatures":["set? : Bool"],"summary":"Returns `true` if this optional has value.","types":["Bool"],"urlPath":"optional"},{"anchor":"optional-none?","kind":"function","line":42,"name":"none?","qualifiedName":"Optional.none?","signatures":["none? : Bool"],"summary":"Returns `true` if this optional is empty.","types":["Bool"],"urlPath":"optional"},{"anchor":"optional-or","kind":"function","line":54,"name":"or","qualifiedName":"Optional.or","signatures":["or(default: X) -> X"],"summary":"Unwraps the value, returning `default` when `None`.","types":["(X) -> X"],"urlPath":"optional"},{"anchor":"optional-map","kind":"function","line":66,"name":"map","qualifiedName":"Optional.map","signatures":["map(f: (X -> Y)) -> Y?"],"summary":"Applies `f` to the wrapped value, leaving `None` unchanged.","types":["((X) -> Y) -> Y?"],"urlPath":"optional"},{"anchor":"optional-flatmap","kind":"function","line":78,"name":"flatMap","qualifiedName":"Optional.flatMap","signatures":["flatMap(f: (X -> Y?)) -> Y?"],"summary":"Chains optional-returning functions, short-circuiting on `None`.","types":["((X) -> Y?) -> Y?"],"urlPath":"optional"},{"anchor":"make-result","kind":"make","line":83,"name":"Result<X, E>","qualifiedName":"Result<X, E>","signatures":["ok? : Bool","error? : Bool","or(default: X) -> X","map(f: (X -> Y)) -> Result<Y, E>","flatMap(f: (X -> Result<Y, E>)) -> Result<Y, E>","optional : X?"],"summary":"","types":["Bool","(X) -> X","((X) -> Y) -> Result<Y, E>","((X) -> Result<Y, E>) -> Result<Y, E>","X?"],"urlPath":"optional"},{"anchor":"result-ok?","kind":"function","line":91,"name":"ok?","qualifiedName":"Result.ok?","signatures":["ok? : Bool"],"summary":"Returns `true` if the result is `Ok`.","types":["Bool"],"urlPath":"optional"},{"anchor":"result-error?","kind":"function","line":102,"name":"error?","qualifiedName":"Result.error?","signatures":["error? : Bool"],"summary":"Returns `true` if the result is `Error`.","types":["Bool"],"urlPath":"optional"},{"anchor":"result-or","kind":"function","line":114,"name":"or","qualifiedName":"Result.or","signatures":["or(default: X) -> X"],"summary":"Unwraps the `Ok` value, returning `default` on `Error`.","types":["(X) -> X"],"urlPath":"optional"},{"anchor":"result-map","kind":"function","line":126,"name":"map","qualifiedName":"Result.map","signatures":["map(f: (X -> Y)) -> Result<Y, E>"],"summary":"Applies `f` to the `Ok` value, passing `Error` through unchanged.","types":["((X) -> Y) -> Result<Y, E>"],"urlPath":"optional"},{"anchor":"result-flatmap","kind":"function","line":137,"name":"flatMap","qualifiedName":"Result.flatMap","signatures":["flatMap(f: (X -> Result<Y, E>)) -> Result<Y, E>"],"summary":"Chains result-returning functions, propagating `Error`.","types":["((X) -> Result<Y, E>) -> Result<Y, E>"],"urlPath":"optional"},{"anchor":"result-optional","kind":"function","line":148,"name":"optional","qualifiedName":"Result.optional","signatures":["optional : X?"],"summary":"Converts to `Optional`, discarding the error value on failure.","types":["X?"],"urlPath":"optional"},{"anchor":"function-or","kind":"function","line":155,"name":"or","qualifiedName":"or","signatures":["or(value, _)"],"summary":"Universal `.or(default)` catch-all: a value that is neither Optional nor Result is already a successful result — return it unchanged.","types":[],"urlPath":"optional"},{"anchor":"function-to","kind":"function","line":175,"name":"to","qualifiedName":"to","signatures":["to(value, t, radix: Integer)"],"summary":"Universal `.to(Type)` conversion. The type argument is a runtime Type value (e.g. String, Integer, Float, List). Returns an Optional result.\n\nOptional, NOT Result, and deliberately: `to` is the everyday conversion, and what it can report on failure is almost always derivable from the types alone — `x.to(List)` on a non-list fails because a non-list is not a list, which an error payload saying \"cannot convert Int to List\" does not improve. When the reason IS information — where a parse gave up and on what — `Integer.parse`/`Float.parse` answer with `Result<_, ParseError>`. So: `to` for every day, `parse` when the failure needs handling.\n\nA String target goes through the Showable protocol, exactly as `make Showable do let to(String) = Just(this.showValue)` says it does. The intrinsic below renders the raw runtime term instead, which on BEAM never reached the `Optional` implementation of showValue: `Just(42).to(String)` answered `Just(\"Just(42)\")` there and `Just(\"42\")` on the tree walker, which dispatches to the Showable clause. Intrinsics cannot call back into the prelude (dependency_layering_test), so the protocol has to be honoured here.","types":["Integer"],"urlPath":"optional"},{"anchor":"make-either","kind":"make","line":187,"name":"Either<L, R>","qualifiedName":"Either<L, R>","signatures":[],"summary":"","types":[],"urlPath":"optional"},{"anchor":"type-optionkind","kind":"type","line":2,"name":"OptionKind","qualifiedName":"OptionKind","signatures":[],"summary":"Declarative command-line parsing shared by Kex tools and applications.","types":[],"urlPath":"optionparser"},{"anchor":"record-optionspec","kind":"record","line":4,"name":"OptionSpec","qualifiedName":"OptionSpec","signatures":[],"summary":"","types":["String","Char?","OptionKind","String?","Bool"],"urlPath":"optionparser"},{"anchor":"type-commandhandler","kind":"type","line":16,"name":"CommandHandler","qualifiedName":"CommandHandler","signatures":[],"summary":"What a command does once the line has been parsed. It receives the parsed options with the command's own words already removed, so `tey add greet` hands its handler `[\"greet\"]`, and returns the process exit code.","types":[],"urlPath":"optionparser"},{"anchor":"record-commandspec","kind":"record","line":18,"name":"CommandSpec","qualifiedName":"CommandSpec","signatures":[],"summary":"","types":["String","CommandHandler"],"urlPath":"optionparser"},{"anchor":"record-optionconfig","kind":"record","line":33,"name":"OptionConfig","qualifiedName":"OptionConfig","signatures":[],"summary":"","types":["String","[OptionSpec]","[CommandSpec]"],"urlPath":"optionparser"},{"anchor":"record-parsedoptions","kind":"record","line":40,"name":"ParsedOptions","qualifiedName":"ParsedOptions","signatures":[],"summary":"","types":["{String: String}","[String]"],"urlPath":"optionparser"},{"anchor":"type-optionparseerror","kind":"type","line":45,"name":"OptionParseError","qualifiedName":"OptionParseError","signatures":[],"summary":"","types":["String","String","String","String","String","String"],"urlPath":"optionparser"},{"anchor":"make-parsedoptions","kind":"make","line":51,"name":"ParsedOptions","qualifiedName":"ParsedOptions","signatures":["value(name: String, default: String) -> String?","flagEnabled?(name: String) -> Bool","integerValue(name: String) -> Integer?"],"summary":"","types":["String","String?","Bool","Integer?"],"urlPath":"optionparser"},{"anchor":"parsedoptions-value","kind":"function","line":52,"name":"value","qualifiedName":"ParsedOptions.value","signatures":["value(name: String, default: String) -> String?"],"summary":"","types":["String","String?"],"urlPath":"optionparser"},{"anchor":"parsedoptions-flagenabled?","kind":"function","line":54,"name":"flagEnabled?","qualifiedName":"ParsedOptions.flagEnabled?","signatures":["flagEnabled?(name: String) -> Bool"],"summary":"","types":["String","Bool"],"urlPath":"optionparser"},{"anchor":"parsedoptions-integervalue","kind":"function","line":55,"name":"integerValue","qualifiedName":"ParsedOptions.integerValue","signatures":["integerValue(name: String) -> Integer?"],"summary":"","types":["String","Integer?"],"urlPath":"optionparser"},{"anchor":"make-optionconfig","kind":"make","line":66,"name":"OptionConfig","qualifiedName":"OptionConfig","signatures":["string(long: String, short: Char?, description: String, default: String?, required?: Bool) -> OptionConfig","integer(long: String, short: Char?, description: String, default: String?, required?: Bool) -> OptionConfig","flag(long: String, short: Char?, description: String) -> OptionConfig","command(name: String, usage: String, description: String, section: String, handler: CommandHandler) -> OptionConfig","parse(args: [String]) -> Result<ParsedOptions, OptionParseError>","run(args: [String]) -> Integer","printHelp : Integer","help : String"],"summary":"","types":["String","Char?","String?","Bool","OptionConfig","CommandHandler","[String]","Result<ParsedOptions, OptionParseError>","Integer"],"urlPath":"optionparser"},{"anchor":"optionconfig-string","kind":"function","line":67,"name":"string","qualifiedName":"OptionConfig.string","signatures":["string(long: String, short: Char?, description: String, default: String?, required?: Bool) -> OptionConfig"],"summary":"","types":["String","Char?","String?","Bool","OptionConfig"],"urlPath":"optionparser"},{"anchor":"optionconfig-integer","kind":"function","line":75,"name":"integer","qualifiedName":"OptionConfig.integer","signatures":["integer(long: String, short: Char?, description: String, default: String?, required?: Bool) -> OptionConfig"],"summary":"","types":["String","Char?","String?","Bool","OptionConfig"],"urlPath":"optionparser"},{"anchor":"optionconfig-flag","kind":"function","line":83,"name":"flag","qualifiedName":"OptionConfig.flag","signatures":["flag(long: String, short: Char?, description: String) -> OptionConfig"],"summary":"","types":["String","Char?","OptionConfig"],"urlPath":"optionparser"},{"anchor":"optionconfig-command","kind":"function","line":91,"name":"command","qualifiedName":"OptionConfig.command","signatures":["command(name: String, usage: String, description: String, section: String, handler: CommandHandler) -> OptionConfig"],"summary":"Declares a command. `usage` is what the help line shows after the name (`<name>`, `[args...]`); leave it empty for a command that takes none.","types":["String","CommandHandler","OptionConfig"],"urlPath":"optionparser"},{"anchor":"optionconfig-parse","kind":"function","line":113,"name":"parse","qualifiedName":"OptionConfig.parse","signatures":["parse(args: [String]) -> Result<ParsedOptions, OptionParseError>"],"summary":"","types":["[String]","Result<ParsedOptions, OptionParseError>"],"urlPath":"optionparser"},{"anchor":"optionconfig-run","kind":"function","line":121,"name":"run","qualifiedName":"OptionConfig.run","signatures":["run(args: [String]) -> Integer"],"summary":"Parses `args` and runs the command they name, returning its exit code. A parse failure, an unknown command, or a line with no command at all reports the problem with the help text and returns 1 — the one place that policy has to live for every tool to behave the same way.","types":["[String]","Integer"],"urlPath":"optionparser"},{"anchor":"optionconfig-printhelp","kind":"function","line":147,"name":"printHelp","qualifiedName":"OptionConfig.printHelp","signatures":["printHelp : Integer"],"summary":"","types":["Integer"],"urlPath":"optionparser"},{"anchor":"optionconfig-help","kind":"function","line":159,"name":"help","qualifiedName":"OptionConfig.help","signatures":["help : String"],"summary":"The help text, styled. Every escape comes from `Console`, which the runtime blanks under `--no-colors` and `KEX_COLORS=0`, so the same code produces plain text down a pipe and this needs no second rendering path.\n\nWidths are measured on the UNSTYLED label throughout: an escape sequence has a length that a terminal does not draw, so padding computed from a coloured string lines the columns up on paper and nowhere else.","types":[],"urlPath":"optionparser"},{"anchor":"module-optionparser","kind":"module","line":201,"name":"OptionParser","qualifiedName":"OptionParser","signatures":["define(name: String, description: String) -> OptionConfig","commandLabel(command: CommandSpec) -> String","commandFor(commands: [CommandSpec], arguments: [String]) -> (CommandSpec, [String])?","opensWith?(arguments: [String], name: String) -> Bool","errorMessage(error: OptionParseError) -> String","parse(options: [OptionSpec], args: [String]) -> Result<ParsedOptions, OptionParseError>"],"summary":"","types":["String","OptionConfig","CommandSpec","[CommandSpec]","[String]","(CommandSpec, [String])?","Bool","OptionParseError","[OptionSpec]","Result<ParsedOptions, OptionParseError>"],"urlPath":"optionparser"},{"anchor":"function-optionparser-define","kind":"function","line":202,"name":"define","qualifiedName":"OptionParser.define","signatures":["define(name: String, description: String) -> OptionConfig"],"summary":"","types":["String","OptionConfig"],"urlPath":"optionparser"},{"anchor":"function-optionparser-commandlabel","kind":"function","line":206,"name":"commandLabel","qualifiedName":"OptionParser.commandLabel","signatures":["commandLabel(command: CommandSpec) -> String"],"summary":"","types":["CommandSpec","String"],"urlPath":"optionparser"},{"anchor":"function-optionparser-commandfor","kind":"function","line":214,"name":"commandFor","qualifiedName":"OptionParser.commandFor","signatures":["commandFor(commands: [CommandSpec], arguments: [String]) -> (CommandSpec, [String])?"],"summary":"The declared command whose words open `arguments`, with what is left after them. Longest match first, so `kex install` is preferred over a `kex` that also exists.","types":["[CommandSpec]","[String]","(CommandSpec, [String])?"],"urlPath":"optionparser"},{"anchor":"function-optionparser-openswith?","kind":"function","line":226,"name":"opensWith?","qualifiedName":"OptionParser.opensWith?","signatures":["opensWith?(arguments: [String], name: String) -> Bool"],"summary":"","types":["[String]","String","Bool"],"urlPath":"optionparser"},{"anchor":"function-optionparser-errormessage","kind":"function","line":232,"name":"errorMessage","qualifiedName":"OptionParser.errorMessage","signatures":["errorMessage(error: OptionParseError) -> String"],"summary":"","types":["OptionParseError","String"],"urlPath":"optionparser"},{"anchor":"function-optionparser-parse","kind":"function","line":240,"name":"parse","qualifiedName":"OptionParser.parse","signatures":["parse(options: [OptionSpec], args: [String]) -> Result<ParsedOptions, OptionParseError>"],"summary":"","types":["[OptionSpec]","[String]","Result<ParsedOptions, OptionParseError>"],"urlPath":"optionparser"},{"anchor":"module-parsing","kind":"module","line":5,"name":"Parsing","qualifiedName":"Parsing","signatures":["peekAt(offset: Integer) -> Char?","advanceBy(count: Integer) -> Input","charWhen(pred: (Char -> Bool)) -> Result<(Char, Input), ParseError>","char(expected: Char) -> Result<(Char, Input), ParseError>","whiteSpaces : Input","many(f: (Input -> Result<(T, Input), ParseError>)) -> ([T], Input)","some(f: (Input -> Result<(T, Input), ParseError>)) -> Result<([T], Input), ParseError>","string(expected: String) -> Result<(String, Input), ParseError>","takeWhile(pred: (Char -> Bool)) -> (String, Input)","choice(alts: ([(Input) -> Result<(T, Input), ParseError>])) -> Result<(T, Input), ParseError>"],"summary":"Parser combinators for user-defined text formats.\n\nAn Input is immutable: successful parsers return the parsed value together with an advanced cursor. Failure leaves the caller free to try an alternative.","types":["String","Integer","Char?","Input","(Char -> Bool)","Result<(Char, Input), ParseError>","Char","(Input -> Result<(T, Input), ParseError>)","([T], Input)","Result<([T], Input), ParseError>","Result<(String, Input), ParseError>","(String, Input)","[(Input) -> Result<(T, Input), ParseError>]","Result<(T, Input), ParseError>"],"urlPath":"parsing"},{"anchor":"type-parsing-parseerror","kind":"type","line":10,"name":"ParseError","qualifiedName":"Parsing.ParseError","signatures":[],"summary":"`Expected` carries what the grammar WANTED rather than what it found — the difference between \"unexpected `d`\" and \"expected `version(`\". It is what `label` and `string` report.","types":["String","Integer","String","Integer","Integer"],"urlPath":"parsing"},{"anchor":"record-parsing-input","kind":"record","line":14,"name":"Input","qualifiedName":"Parsing.Input","signatures":[],"summary":"","types":["String","Integer"],"urlPath":"parsing"},{"anchor":"make-input","kind":"make","line":19,"name":"Input","qualifiedName":"Input","signatures":["peekAt(offset: Integer) -> Char?","advanceBy(count: Integer) -> Input","charWhen(pred: (Char -> Bool)) -> Result<(Char, Input), ParseError>","char(expected: Char) -> Result<(Char, Input), ParseError>","whiteSpaces : Input","many(f: (Input -> Result<(T, Input), ParseError>)) -> ([T], Input)","some(f: (Input -> Result<(T, Input), ParseError>)) -> Result<([T], Input), ParseError>","string(expected: String) -> Result<(String, Input), ParseError>","takeWhile(pred: (Char -> Bool)) -> (String, Input)","choice(alts: ([(Input) -> Result<(T, Input), ParseError>])) -> Result<(T, Input), ParseError>"],"summary":"","types":["Integer","Char?","Input","(Char -> Bool)","Result<(Char, Input), ParseError>","Char","(Input -> Result<(T, Input), ParseError>)","([T], Input)","Result<([T], Input), ParseError>","String","Result<(String, Input), ParseError>","(String, Input)","[(Input) -> Result<(T, Input), ParseError>]","Result<(T, Input), ParseError>"],"urlPath":"parsing"},{"anchor":"input-peek","kind":"function","line":20,"name":"peek","qualifiedName":"Input.peek","signatures":[],"summary":"","types":[],"urlPath":"parsing"},{"anchor":"input-peekat","kind":"function","line":22,"name":"peekAt","qualifiedName":"Input.peekAt","signatures":["peekAt(offset: Integer) -> Char?"],"summary":"","types":["Integer","Char?"],"urlPath":"parsing"},{"anchor":"input-atend?","kind":"function","line":28,"name":"atEnd?","qualifiedName":"Input.atEnd?","signatures":[],"summary":"","types":[],"urlPath":"parsing"},{"anchor":"input-advance","kind":"function","line":30,"name":"advance","qualifiedName":"Input.advance","signatures":[],"summary":"","types":[],"urlPath":"parsing"},{"anchor":"input-advanceby","kind":"function","line":32,"name":"advanceBy","qualifiedName":"Input.advanceBy","signatures":["advanceBy(count: Integer) -> Input"],"summary":"","types":["Integer","Input"],"urlPath":"parsing"},{"anchor":"input-remaining","kind":"function","line":34,"name":"remaining","qualifiedName":"Input.remaining","signatures":[],"summary":"","types":[],"urlPath":"parsing"},{"anchor":"input-charwhen","kind":"function","line":36,"name":"charWhen","qualifiedName":"Input.charWhen","signatures":["charWhen(pred: (Char -> Bool)) -> Result<(Char, Input), ParseError>"],"summary":"","types":["(Char -> Bool)","Result<(Char, Input), ParseError>"],"urlPath":"parsing"},{"anchor":"input-char","kind":"function","line":44,"name":"char","qualifiedName":"Input.char","signatures":["char(expected: Char) -> Result<(Char, Input), ParseError>"],"summary":"","types":["Char","Result<(Char, Input), ParseError>"],"urlPath":"parsing"},{"anchor":"input-whitespaces","kind":"function","line":48,"name":"whiteSpaces","qualifiedName":"Input.whiteSpaces","signatures":["whiteSpaces : Input"],"summary":"","types":[],"urlPath":"parsing"},{"anchor":"input-many","kind":"function","line":59,"name":"many","qualifiedName":"Input.many","signatures":["many(f: (Input -> Result<(T, Input), ParseError>)) -> ([T], Input)"],"summary":"","types":["(Input -> Result<(T, Input), ParseError>)","([T], Input)"],"urlPath":"parsing"},{"anchor":"input-some","kind":"function","line":73,"name":"some","qualifiedName":"Input.some","signatures":["some(f: (Input -> Result<(T, Input), ParseError>)) -> Result<([T], Input), ParseError>"],"summary":"","types":["(Input -> Result<(T, Input), ParseError>)","Result<([T], Input), ParseError>"],"urlPath":"parsing"},{"anchor":"input-string","kind":"function","line":83,"name":"string","qualifiedName":"Input.string","signatures":["string(expected: String) -> Result<(String, Input), ParseError>"],"summary":"An exact literal. A keyword grammar is mostly literals — `version(` is one token to a reader and eight calls to `char` — and matching it here reports the failure at the START of the literal, which is where a person looking at the error expects the caret.","types":["String","Result<(String, Input), ParseError>"],"urlPath":"parsing"},{"anchor":"input-takewhile","kind":"function","line":98,"name":"takeWhile","qualifiedName":"Input.takeWhile","signatures":["takeWhile(pred: (Char -> Bool)) -> (String, Input)"],"summary":"Every character while `pred` holds, as a String. `many(charWhen(...))` gives a [Char] the caller has to join, and a run of characters is almost always wanted as text. Cannot fail: an empty run is an empty String, which is what makes it safe for the optional parts of a grammar.","types":["(Char -> Bool)","(String, Input)"],"urlPath":"parsing"},{"anchor":"input-choice","kind":"function","line":111,"name":"choice","qualifiedName":"Input.choice","signatures":["choice(alts: ([(Input) -> Result<(T, Input), ParseError>])) -> Result<(T, Input), ParseError>"],"summary":"","types":["[(Input) -> Result<(T, Input), ParseError>]","Result<(T, Input), ParseError>"],"urlPath":"parsing"},{"anchor":"type-pid","kind":"type","line":5,"name":"Pid","qualifiedName":"Pid","signatures":[],"summary":"","types":[],"urlPath":"process"},{"anchor":"type-task","kind":"type","line":6,"name":"Task","qualifiedName":"Task","signatures":[],"summary":"","types":[],"urlPath":"process"},{"anchor":"type-reference","kind":"type","line":7,"name":"Reference","qualifiedName":"Reference","signatures":[],"summary":"","types":[],"urlPath":"process"},{"anchor":"type-process","kind":"type","line":8,"name":"Process","qualifiedName":"Process","signatures":[],"summary":"","types":[],"urlPath":"process"},{"anchor":"type-processexitreason","kind":"type","line":13,"name":"ProcessExitReason","qualifiedName":"ProcessExitReason","signatures":[],"summary":"A process termination reason. This remains open because the BEAM permits any term as an exit reason; conventional values include `:normal`, `:shutdown`, and structured application errors.","types":[],"urlPath":"process"},{"anchor":"record-reply","kind":"record","line":22,"name":"Reply","qualifiedName":"Reply","signatures":[],"summary":"Describes the transition returned by a synchronous serving slot.\n\n`reply` answers the caller immediately. A slot may omit it only when it sends a deferred response with `from.reply(...)`. `new` installs the next serving state; omitting it preserves the current state. `stop` terminates the server after applying the transition. Within a `serving X` block, the checker narrows `new` from `Any?` to `X?`.","types":["A","Any?","ProcessExitReason?"],"urlPath":"process"},{"anchor":"type-from","kind":"type","line":28,"name":"From","qualifiedName":"From","signatures":[],"summary":"","types":[],"urlPath":"process"},{"anchor":"type-callerror","kind":"type","line":30,"name":"CallError","qualifiedName":"CallError","signatures":[],"summary":"","types":[],"urlPath":"process"},{"anchor":"record-server","kind":"record","line":32,"name":"Server","qualifiedName":"Server","signatures":[],"summary":"","types":["Process<X>","Integer"],"urlPath":"process"},{"anchor":"module-process","kind":"module","line":37,"name":"Process","qualifiedName":"Process","signatures":["spawn(state: X) -> Server<X>","run(command: String, args: [String]) -> Result<ProcessResult, String>","stream(command: String, args: [String]) -> Result<Integer, String>","exec(command: String, args: [String]) -> Integer","self : Pid","exit(pid: Pid, reason: X) -> Void","register(pid: Pid, name: Atom) -> Void","whereis(name: Atom) -> Pid?"],"summary":"","types":["X","Server<X>","String","[String]","Result<ProcessResult, String>","Result<Integer, String>","Integer","Pid","Void","Atom","Pid?"],"urlPath":"process"},{"anchor":"function-process-spawn","kind":"function","line":39,"name":"spawn","qualifiedName":"Process.spawn","signatures":["spawn(state: X) -> Server<X>"],"summary":"Starts a process-backed server for the serving implementation attached to X.","types":["X","Server<X>"],"urlPath":"process"},{"anchor":"function-process-run","kind":"function","line":45,"name":"run","qualifiedName":"Process.run","signatures":["run(command: String, args: [String]) -> Result<ProcessResult, String>"],"summary":"Run an executable directly with an argv vector. No shell is involved. Output is captured as UTF-8 strings; a non-zero child status is still a successful ProcessResult, while failure to start the child is Error.","types":["String","[String]","Result<ProcessResult, String>"],"urlPath":"process"},{"anchor":"function-process-stream","kind":"function","line":54,"name":"stream","qualifiedName":"Process.stream","signatures":["stream(command: String, args: [String]) -> Result<Integer, String>"],"summary":"Run an executable with the CALLER's stdout and stderr, so its output appears as it is produced rather than in one block when it exits. Answers the exit code; nothing is captured — that is the trade, and it is what a long-running child a person is watching needs (kexhq/kex#187).\n\n`run` remains the one to use when the output is data to be READ.","types":["String","[String]","Result<Integer, String>"],"urlPath":"process"},{"anchor":"function-process-exec","kind":"function","line":57,"name":"exec","qualifiedName":"Process.exec","signatures":["exec(command: String, args: [String]) -> Integer"],"summary":"","types":["String","[String]","Integer"],"urlPath":"process"},{"anchor":"function-process-self","kind":"function","line":64,"name":"self","qualifiedName":"Process.self","signatures":["self : Pid"],"summary":"Returns the calling process's Pid.","types":[],"urlPath":"process"},{"anchor":"function-process-exit","kind":"function","line":68,"name":"exit","qualifiedName":"Process.exit","signatures":["exit(pid: Pid, reason: X) -> Void"],"summary":"Sends an exit signal with `reason` to `pid`.","types":["Pid","X","Void"],"urlPath":"process"},{"anchor":"function-process-register","kind":"function","line":72,"name":"register","qualifiedName":"Process.register","signatures":["register(pid: Pid, name: Atom) -> Void"],"summary":"Registers `pid` under the given atom `name`.","types":["Pid","Atom","Void"],"urlPath":"process"},{"anchor":"function-process-whereis","kind":"function","line":76,"name":"whereis","qualifiedName":"Process.whereis","signatures":["whereis(name: Atom) -> Pid?"],"summary":"Returns the Pid registered under `name`, or None.","types":["Atom","Pid?"],"urlPath":"process"},{"anchor":"record-processresult","kind":"record","line":80,"name":"ProcessResult","qualifiedName":"ProcessResult","signatures":[],"summary":"","types":["Integer","String"],"urlPath":"process"},{"anchor":"make-pid","kind":"make","line":86,"name":"Pid","qualifiedName":"Pid","signatures":["send(msg: X) -> Void","sendFrom(msg: X) -> Void","link : Void","unlink : Void","monitor : Reference","alive? : Bool"],"summary":"","types":["X","Void"],"urlPath":"process"},{"anchor":"pid-send","kind":"function","line":88,"name":"send","qualifiedName":"Pid.send","signatures":["send(msg: X) -> Void"],"summary":"Sends `msg` unchanged as a raw BEAM term.","types":["X","Void"],"urlPath":"process"},{"anchor":"pid-sendfrom","kind":"function","line":92,"name":"sendFrom","qualifiedName":"Pid.sendFrom","signatures":["sendFrom(msg: X) -> Void"],"summary":"Sends the conventional Erlang sender-bearing pair {Process.self, msg}.","types":["X","Void"],"urlPath":"process"},{"anchor":"pid-link","kind":"function","line":96,"name":"link","qualifiedName":"Pid.link","signatures":["link : Void"],"summary":"Links the calling process to this one (bidirectional exit propagation).","types":[],"urlPath":"process"},{"anchor":"pid-unlink","kind":"function","line":100,"name":"unlink","qualifiedName":"Pid.unlink","signatures":["unlink : Void"],"summary":"Removes the link between the calling process and this one.","types":[],"urlPath":"process"},{"anchor":"pid-monitor","kind":"function","line":104,"name":"monitor","qualifiedName":"Pid.monitor","signatures":["monitor : Reference"],"summary":"Starts monitoring this process. Returns a reference for `demonitor`.","types":[],"urlPath":"process"},{"anchor":"pid-alive?","kind":"function","line":108,"name":"alive?","qualifiedName":"Pid.alive?","signatures":["alive? : Bool"],"summary":"Returns `true` if the process is currently alive.","types":[],"urlPath":"process"},{"anchor":"make-process","kind":"make","line":115,"name":"Process<X>","qualifiedName":"Process<X>","signatures":["send(msg: X) -> Void","sendFrom(msg: X) -> Void","link : Void","unlink : Void","monitor : Reference","alive? : Bool"],"summary":"A spawned Process<X> is a typed process handle backed by the same runtime pid. It therefore supports the ordinary pid lifecycle operations without erasing its message type.","types":["X","Void"],"urlPath":"process"},{"anchor":"process-send","kind":"function","line":116,"name":"send","qualifiedName":"Process.send","signatures":["send(msg: X) -> Void"],"summary":"","types":["X","Void"],"urlPath":"process"},{"anchor":"process-sendfrom","kind":"function","line":119,"name":"sendFrom","qualifiedName":"Process.sendFrom","signatures":["sendFrom(msg: X) -> Void"],"summary":"","types":["X","Void"],"urlPath":"process"},{"anchor":"process-link","kind":"function","line":122,"name":"link","qualifiedName":"Process.link","signatures":["link : Void"],"summary":"","types":[],"urlPath":"process"},{"anchor":"process-unlink","kind":"function","line":125,"name":"unlink","qualifiedName":"Process.unlink","signatures":["unlink : Void"],"summary":"","types":[],"urlPath":"process"},{"anchor":"process-monitor","kind":"function","line":128,"name":"monitor","qualifiedName":"Process.monitor","signatures":["monitor : Reference"],"summary":"","types":[],"urlPath":"process"},{"anchor":"process-alive?","kind":"function","line":131,"name":"alive?","qualifiedName":"Process.alive?","signatures":["alive? : Bool"],"summary":"","types":[],"urlPath":"process"},{"anchor":"make-server","kind":"make","line":135,"name":"Server<X>","qualifiedName":"Server<X>","signatures":["within(timeout: Integer) -> Server<X>","link : Void","unlink : Void","monitor : Reference","alive? : Bool"],"summary":"","types":["Integer","Server<X>"],"urlPath":"process"},{"anchor":"server-within","kind":"function","line":137,"name":"within","qualifiedName":"Server.within","signatures":["within(timeout: Integer) -> Server<X>"],"summary":"Return an immutable view of the same server with a new default call timeout.","types":["Integer","Server<X>"],"urlPath":"process"},{"anchor":"server-link","kind":"function","line":140,"name":"link","qualifiedName":"Server.link","signatures":["link : Void"],"summary":"","types":[],"urlPath":"process"},{"anchor":"server-unlink","kind":"function","line":143,"name":"unlink","qualifiedName":"Server.unlink","signatures":["unlink : Void"],"summary":"","types":[],"urlPath":"process"},{"anchor":"server-monitor","kind":"function","line":146,"name":"monitor","qualifiedName":"Server.monitor","signatures":["monitor : Reference"],"summary":"","types":[],"urlPath":"process"},{"anchor":"server-alive?","kind":"function","line":149,"name":"alive?","qualifiedName":"Server.alive?","signatures":["alive? : Bool"],"summary":"","types":[],"urlPath":"process"},{"anchor":"make-from","kind":"make","line":153,"name":"From<X>","qualifiedName":"From<X>","signatures":["reply(value: X) -> Void","pid : Pid"],"summary":"","types":["X","Void"],"urlPath":"process"},{"anchor":"from-reply","kind":"function","line":155,"name":"reply","qualifiedName":"From.reply","signatures":["reply(value: X) -> Void"],"summary":"Completes the pending call identified by this caller/reference pair.","types":["X","Void"],"urlPath":"process"},{"anchor":"from-pid","kind":"function","line":158,"name":"pid","qualifiedName":"From.pid","signatures":["pid : Pid"],"summary":"","types":[],"urlPath":"process"},{"anchor":"module-task","kind":"module","line":162,"name":"Task","qualifiedName":"Task","signatures":["start(f: Block<X>) -> Task","awaitAll(tasks: [Task]) -> [X]"],"summary":"","types":["Block<X>","Task","[Task]","[X]"],"urlPath":"process"},{"anchor":"function-task-start","kind":"function","line":164,"name":"start","qualifiedName":"Task.start","signatures":["start(f: Block<X>) -> Task"],"summary":"Spawns a new process that runs `f` and returns a Task handle.","types":["Block<X>","Task"],"urlPath":"process"},{"anchor":"function-task-awaitall","kind":"function","line":168,"name":"awaitAll","qualifiedName":"Task.awaitAll","signatures":["awaitAll(tasks: [Task]) -> [X]"],"summary":"Awaits all tasks in `tasks`, returning their results.","types":["[Task]","[X]"],"urlPath":"process"},{"anchor":"make-task","kind":"make","line":172,"name":"Task","qualifiedName":"Task","signatures":["await : X","await(timeout: Integer) -> X"],"summary":"","types":["Integer","X"],"urlPath":"process"},{"anchor":"task-await","kind":"function","line":174,"name":"await","qualifiedName":"Task.await","signatures":["await : X"],"summary":"Waits for the task's result indefinitely.","types":[],"urlPath":"process"},{"anchor":"task-await","kind":"function","line":179,"name":"await","qualifiedName":"Task.await","signatures":["await(timeout: Integer) -> X"],"summary":"Waits for the task's result, with a timeout in milliseconds. Returns `None` on timeout.","types":["Integer","X"],"urlPath":"process"},{"anchor":"function-worker","kind":"function","line":184,"name":"worker","qualifiedName":"worker","signatures":["worker : Block<Pid> -> (Atom, Block<Pid>)"],"summary":"Wraps a spawn block into a worker spec for Supervisor.start.","types":["(Block<Pid>) -> (Atom, Block<Pid>)"],"urlPath":"process"},{"anchor":"make-reference","kind":"make","line":186,"name":"Reference","qualifiedName":"Reference","signatures":["demonitor : Void"],"summary":"","types":[],"urlPath":"process"},{"anchor":"reference-demonitor","kind":"function","line":188,"name":"demonitor","qualifiedName":"Reference.demonitor","signatures":["demonitor : Void"],"summary":"Stops monitoring the process that produced this reference.","types":[],"urlPath":"process"},{"anchor":"type-range","kind":"type","line":3,"name":"Range","qualifiedName":"Range","signatures":[],"summary":"Range — a range computes everything from its two bounds; `items` materializes the elements into a real list when one is needed.","types":[],"urlPath":"range"},{"anchor":"make-range","kind":"make","line":5,"name":"Range","qualifiedName":"Range","signatures":["reduce(acc, f)","contains?(value)","sort(comparator)","join(separator)","at(index, fallback)","take(n)","drop(n)","indexOf(value)","zip(other)","partition(pred)","push(value)","reject(pred)"],"summary":"","types":[],"urlPath":"range"},{"anchor":"range-reduce","kind":"function","line":9,"name":"reduce","qualifiedName":"Range.reduce","signatures":["reduce(acc, f)"],"summary":"Shared primitive for Enumerable and Foldable. Range stays structurally minimal; inherited operations reduce over its materialized items in ascending range order.","types":[],"urlPath":"range"},{"anchor":"range-sum","kind":"function","line":13,"name":"sum","qualifiedName":"Range.sum","signatures":[],"summary":"Numeric range aggregates are expressed in terms of the Enumerable primitive rather than relying on the walker's historical List fallback.","types":[],"urlPath":"range"},{"anchor":"range-product","kind":"function","line":14,"name":"product","qualifiedName":"Range.product","signatures":[],"summary":"","types":[],"urlPath":"range"},{"anchor":"range-contains?","kind":"function","line":18,"name":"contains?","qualifiedName":"Range.contains?","signatures":["contains?(value)"],"summary":"Membership is a Range method, not a fallback into the bare String/List native dispatcher.","types":[],"urlPath":"range"},{"anchor":"range-items","kind":"function","line":25,"name":"items","qualifiedName":"Range.items","signatures":[],"summary":"The range's elements as a list.","types":[],"urlPath":"range"},{"anchor":"range-first","kind":"function","line":33,"name":"first","qualifiedName":"Range.first","signatures":[],"summary":"The list operations, over the materialized items. A range is an ordered collection, so `(1..5).first` and `(1..5).length` are questions it can answer — and on the BEAM backend, where a range IS its item list, they already worked. Only the walker rejected them (\"Undefined method: first for Range\"), so every one of these was a backend divergence rather than a deliberate restriction.","types":[],"urlPath":"range"},{"anchor":"range-second","kind":"function","line":34,"name":"second","qualifiedName":"Range.second","signatures":[],"summary":"","types":[],"urlPath":"range"},{"anchor":"range-third","kind":"function","line":35,"name":"third","qualifiedName":"Range.third","signatures":[],"summary":"","types":[],"urlPath":"range"},{"anchor":"range-last","kind":"function","line":36,"name":"last","qualifiedName":"Range.last","signatures":[],"summary":"","types":[],"urlPath":"range"},{"anchor":"range-rest","kind":"function","line":37,"name":"rest","qualifiedName":"Range.rest","signatures":[],"summary":"","types":[],"urlPath":"range"},{"anchor":"range-length","kind":"function","line":38,"name":"length","qualifiedName":"Range.length","signatures":[],"summary":"","types":[],"urlPath":"range"},{"anchor":"range-count","kind":"function","line":39,"name":"count","qualifiedName":"Range.count","signatures":[],"summary":"","types":[],"urlPath":"range"},{"anchor":"range-empty?","kind":"function","line":40,"name":"empty?","qualifiedName":"Range.empty?","signatures":[],"summary":"","types":[],"urlPath":"range"},{"anchor":"range-max","kind":"function","line":41,"name":"max","qualifiedName":"Range.max","signatures":[],"summary":"","types":[],"urlPath":"range"},{"anchor":"range-min","kind":"function","line":42,"name":"min","qualifiedName":"Range.min","signatures":[],"summary":"","types":[],"urlPath":"range"},{"anchor":"range-reverse","kind":"function","line":43,"name":"reverse","qualifiedName":"Range.reverse","signatures":[],"summary":"","types":[],"urlPath":"range"},{"anchor":"range-sort","kind":"function","line":44,"name":"sort","qualifiedName":"Range.sort","signatures":[],"summary":"","types":[],"urlPath":"range"},{"anchor":"range-sort","kind":"function","line":45,"name":"sort","qualifiedName":"Range.sort","signatures":["sort(comparator)"],"summary":"","types":[],"urlPath":"range"},{"anchor":"range-uniq","kind":"function","line":46,"name":"uniq","qualifiedName":"Range.uniq","signatures":[],"summary":"","types":[],"urlPath":"range"},{"anchor":"range-join","kind":"function","line":47,"name":"join","qualifiedName":"Range.join","signatures":["join(separator)"],"summary":"","types":[],"urlPath":"range"},{"anchor":"range-at","kind":"function","line":48,"name":"at","qualifiedName":"Range.at","signatures":["at(index, fallback)"],"summary":"","types":[],"urlPath":"range"},{"anchor":"range-take","kind":"function","line":50,"name":"take","qualifiedName":"Range.take","signatures":["take(n)"],"summary":"","types":[],"urlPath":"range"},{"anchor":"range-drop","kind":"function","line":51,"name":"drop","qualifiedName":"Range.drop","signatures":["drop(n)"],"summary":"","types":[],"urlPath":"range"},{"anchor":"range-indexof","kind":"function","line":52,"name":"indexOf","qualifiedName":"Range.indexOf","signatures":["indexOf(value)"],"summary":"","types":[],"urlPath":"range"},{"anchor":"range-zip","kind":"function","line":53,"name":"zip","qualifiedName":"Range.zip","signatures":["zip(other)"],"summary":"","types":[],"urlPath":"range"},{"anchor":"range-partition","kind":"function","line":54,"name":"partition","qualifiedName":"Range.partition","signatures":["partition(pred)"],"summary":"","types":[],"urlPath":"range"},{"anchor":"range-push","kind":"function","line":55,"name":"push","qualifiedName":"Range.push","signatures":["push(value)"],"summary":"","types":[],"urlPath":"range"},{"anchor":"range-reject","kind":"function","line":56,"name":"reject","qualifiedName":"Range.reject","signatures":["reject(pred)"],"summary":"","types":[],"urlPath":"range"},{"anchor":"module-regex","kind":"module","line":1,"name":"Regex","qualifiedName":"Regex","signatures":["regex(source: String) -> Result<Regex, RegexError>","regex(parts: [String], values: [Any]) -> Regex","validateRegex(source: String) -> [TaggedValidation.Issue]","re(parts, values)","validateRe(source: String) -> [TaggedValidation.Issue]","quote(s: String) -> String","get(key: Atom | Integer) -> String?","get(key: Atom | Integer, default: String) -> String","matches(s: String, re: Regex) -> Match?","matches?(s: String, re: Regex) -> Bool","scan(s: String, re: Regex) -> [Match]","replace(s: String, replacement: Regex) -> String | (Match) -> String -> String","splitLimit : String -> Regex -> Integer -> [String]"],"summary":"","types":["String","Integer","Result<Regex, RegexError>","[String]","([Any]) -> Regex","[TaggedValidation.Issue]","Map<Any, String>","Atom | Integer","String?","(String) -> String","Regex","Match?","Bool","[Match]","(String) -> (Regex) -> (String | (Match) -> String) -> String","(String) -> (Regex) -> (Integer) -> [String]"],"urlPath":"regex"},{"anchor":"record-regex-regex","kind":"record","line":20,"name":"Regex","qualifiedName":"Regex.Regex","signatures":[],"summary":"Regular expressions, backed by PCRE2 in the interpreter and Erlang's `re` on BEAM — the same PCRE pattern language on both.\n\nOpt-in, not prelude: nothing here is in scope until `using Regex`.\n\n`Regex` carries only its pattern source. The compiled engine object lives in a runtime cache keyed by that source, deliberately: a compiled pattern bakes in the host's PCRE version and must never be embedded in a distributed artifact, so the source string is the value's identity.","types":["String"],"urlPath":"regex"},{"anchor":"record-regex-regexerror","kind":"record","line":27,"name":"RegexError","qualifiedName":"Regex.RegexError","signatures":[],"summary":"`RegexError` describes a pattern that failed to compile. Mirrors `ParseError` — the `position` is a *character* offset into the pattern, not a byte offset, so it agrees across backends on patterns containing non-ASCII.","types":["String","Integer"],"urlPath":"regex"},{"anchor":"function-regex-regex","kind":"function","line":50,"name":"regex","qualifiedName":"Regex.regex","signatures":["regex(source: String) -> Result<Regex, RegexError>","regex(parts: [String], values: [Any]) -> Regex"],"summary":"NOTE: deliberately does NOT `implement: Errorable`, even though the trait exists for exactly this shape. Declaring a `message` method alongside the `message` field makes `e.message` dispatch to the method instead of reading the field, which fails with `undef` on the BEAM backend. `ParseError` — the prelude's equivalent error record — carries a bare `message` field for the same reason; nothing in the tree implements Errorable today.\n\nCompiles a pattern. Returns `Result` because an arbitrary string may not be a valid pattern; the tag form `regex`...`` returns a bare `Regex` instead, since a literal is validated at compile time and cannot fail.","types":["String","Result<Regex, RegexError>","[String]","([Any]) -> Regex"],"urlPath":"regex"},{"anchor":"function-regex-validateregex","kind":"function","line":82,"name":"validateRegex","qualifiedName":"Regex.validateRegex","signatures":["validateRegex(source: String) -> [TaggedValidation.Issue]"],"summary":"Companion validator for the `regex` tag, found by the compiler through the standard `validate<Tag>` naming convention (nothing about regex is special- cased). A raw `` regex`(` `` is a compile error, with the caret pointing at the byte offset PCRE2 reported inside the literal.\n\nMust stay pure: the compiler evaluates it on the tree-walk interpreter at compile time, so marking it `foul` would break builds, not just calls.","types":["String","[TaggedValidation.Issue]"],"urlPath":"regex"},{"anchor":"function-regex-re","kind":"function","line":96,"name":"re","qualifiedName":"Regex.re","signatures":["re(parts, values)"],"summary":"`re` is a short alias for `regex` — a second name bound to the same two functions, not a lexer synonym, so every property of `regex` (escaping, backend mapping, error shape) applies to it unchanged.","types":[],"urlPath":"regex"},{"anchor":"function-regex-validatere","kind":"function","line":101,"name":"validateRe","qualifiedName":"Regex.validateRe","signatures":["validateRe(source: String) -> [TaggedValidation.Issue]"],"summary":"Companion validator for the `re` tag, delegating to validateRegex. The compiler finds it by the same `validate<Tag>` convention.","types":["String","[TaggedValidation.Issue]"],"urlPath":"regex"},{"anchor":"function-regex-quote","kind":"function","line":114,"name":"quote","qualifiedName":"Regex.quote","signatures":["quote(s: String) -> String"],"summary":"Escapes every regex metacharacter in `s`, so the result matches `s` literally. Escapes per character rather than wrapping in `\\Q...\\E`, which a value containing `\\E` would break out of.","types":["String"],"urlPath":"regex"},{"anchor":"record-regex-match","kind":"record","line":124,"name":"Match","qualifiedName":"Regex.Match","signatures":[],"summary":"`Match` is the result of a successful match. It behaves like a map keyed by both group number (`0` is the whole match) and group name (`:year`), but is a named type so it can grow spans and surrounding context later without breaking existing `get` call sites.\n\nA group that did not participate is an absent key, so `get` returns `None` — distinct from a group that matched the empty string, which returns `Just(\"\")`.","types":["Map<Any, String>"],"urlPath":"regex"},{"anchor":"make-match","kind":"make","line":136,"name":"Match","qualifiedName":"Match","signatures":["get(key: Atom | Integer) -> String?","get(key: Atom | Integer, default: String) -> String"],"summary":"NOTE: the accessor is `get`, not `get`. A `make` block on a user type that defines a method name the prelude also uses breaks that name's dispatch for every OTHER type on the BEAM backend — with `get` here, merely saying `using Regex` made a plain `someMap.get(k)` fail with function_clause. `get` also matches Python's `m.get(1)` and Java's `matcher.get(1)`. A plain Map's `get` is unaffected: resolution picks a local method by receiver type, name and arity.","types":["Atom | Integer","String?","(String) -> String"],"urlPath":"regex"},{"anchor":"match-get","kind":"function","line":146,"name":"get","qualifiedName":"Match.get","signatures":["get(key: Atom | Integer) -> String?","get(key: Atom | Integer, default: String) -> String"],"summary":"Returns the captured text for a group, by number or by name.","types":["Atom | Integer","String?","(String) -> String"],"urlPath":"regex"},{"anchor":"function-regex-matches","kind":"function","line":167,"name":"matches","qualifiedName":"Regex.matches","signatures":["matches(s: String, re: Regex) -> Match?"],"summary":"Finds the first occurrence of `re` anywhere in `s`. Unanchored — anchor with `^...$` in the pattern if a whole-string match is wanted.","types":["String","Regex","Match?"],"urlPath":"regex"},{"anchor":"function-regex-matches?","kind":"function","line":179,"name":"matches?","qualifiedName":"Regex.matches?","signatures":["matches?(s: String, re: Regex) -> Bool"],"summary":"Reports whether `re` occurs anywhere in `s`. The boolean form of `matches`, and unanchored for the same reason.","types":["String","Regex","Bool"],"urlPath":"regex"},{"anchor":"function-regex-scan","kind":"function","line":193,"name":"scan","qualifiedName":"Regex.scan","signatures":["scan(s: String, re: Regex) -> [Match]"],"summary":"Every match of `re` in `s`, left to right.\n\nAlways returns `[Match]`, whether or not the pattern has capture groups — adding a group to a pattern must not change the type flowing out of `scan`.","types":["String","Regex","[Match]"],"urlPath":"regex"},{"anchor":"function-regex-replace","kind":"function","line":208,"name":"replace","qualifiedName":"Regex.replace","signatures":["replace(s: String, replacement: Regex) -> String | (Match) -> String -> String"],"summary":"Replaces **every** match of `re` in `s` — this is `gsub`, not `sub`.\n\nThe replacement is either a literal String, inserted verbatim with no `$1`/`\\1` backreference syntax, or a block receiving the `Match`.","types":["(String) -> (Regex) -> (String | (Match) -> String) -> String"],"urlPath":"regex"},{"anchor":"function-regex-splitlimit","kind":"function","line":241,"name":"splitLimit","qualifiedName":"Regex.splitLimit","signatures":["splitLimit : String -> Regex -> Integer -> [String]"],"summary":"Splits `s` on `re`, following Ruby's semantics: trailing empty fields are dropped (leading ones are kept), and any capture groups in the pattern are interleaved into the result.\n\nSplits with a field limit — the qualified-only companion to `s.split(re)`. A positive `limit` caps the number of fields, leaving the remainder unsplit in the last one; a negative `limit` keeps trailing empty fields instead of dropping them.\n\nPlain `s.split(re)` needs no function here at all: it resolves to `String.split`, which dispatches to this engine when handed a Regex (in both backends). Only the limit form needs a name, and it deliberately is NOT `split` — this module must not export that name. On BEAM, a module in scope via `using` captures a method name for EVERY receiver, so exporting `split` here would route `\"a,b\".split(\",\")` and even the no-argument `\"hi\".split` through this module and break them.","types":["(String) -> (Regex) -> (Integer) -> [String]"],"urlPath":"regex"},{"anchor":"record-set","kind":"record","line":34,"name":"Set","qualifiedName":"Set","signatures":[],"summary":"The invariant every Set method preserves: `items` is sorted and duplicate free. Build one with `Set.from` rather than by hand — the record literal does no deduplication. Reading `.items` back is the field itself, so handing a set's elements to list code costs nothing:\n\n```kex\nSet.from([3, 1, 2]).items   # => [1, 2, 3]\n```","types":["[A]"],"urlPath":"set"},{"anchor":"record-unorderedset","kind":"record","line":40,"name":"UnorderedSet","qualifiedName":"UnorderedSet","signatures":[],"summary":"The invariant every UnorderedSet method preserves: `slots` maps each member to `true` and holds nothing else. Its keys ARE the elements.","types":["{A: Bool}"],"urlPath":"set"},{"anchor":"module-set","kind":"module","line":44,"name":"Set","qualifiedName":"Set","signatures":["from(items: [A]) -> Set<A>"],"summary":"","types":["[A]","Set<A>"],"urlPath":"set"},{"anchor":"function-set-from","kind":"function","line":53,"name":"from","qualifiedName":"Set.from","signatures":["from(items: [A]) -> Set<A>"],"summary":"Builds a set from any list, discarding duplicates and sorting what is left. Deduplication goes through a Map rather than `List.uniq`: map keys are unique under exactly the structural equality a set wants, and each element costs one insertion instead of a scan of everything kept so far.","types":["[A]","Set<A>"],"urlPath":"set"},{"anchor":"constant-set-empty","kind":"constant","line":62,"name":"empty","qualifiedName":"Set.empty","signatures":[],"summary":"The empty set. Also the Monoid identity.","types":["Set<A>"],"urlPath":"set"},{"anchor":"module-unorderedset","kind":"module","line":65,"name":"UnorderedSet","qualifiedName":"UnorderedSet","signatures":["from(items: [A]) -> UnorderedSet<A>"],"summary":"","types":["[A]","UnorderedSet<A>"],"urlPath":"set"},{"anchor":"function-unorderedset-from","kind":"function","line":71,"name":"from","qualifiedName":"UnorderedSet.from","signatures":["from(items: [A]) -> UnorderedSet<A>"],"summary":"Builds an unordered set from any list, discarding duplicates. Nothing is sorted, so this does not require Orderable elements.","types":["[A]","UnorderedSet<A>"],"urlPath":"set"},{"anchor":"constant-unorderedset-empty","kind":"constant","line":76,"name":"empty","qualifiedName":"UnorderedSet.empty","signatures":[],"summary":"The empty unordered set. Also the Monoid identity.","types":["UnorderedSet<A>"],"urlPath":"set"},{"anchor":"make-set","kind":"make","line":79,"name":"Set<A>","qualifiedName":"Set<A>","signatures":["reduce(acc, f)","combine(other)","contains?(value: A) -> Bool","count : Integer","empty? : Bool","add(value: A) -> Set<A>","delete(value: A) -> Set<A>","union(other: Set<A>) -> Set<A>","intersect(other: Set<A>) -> Set<A>","difference(other: Set<A>) -> Set<A>","symmetricDifference(other: Set<A>) -> Set<A>","subset?(other: Set<A>) -> Bool","superset?(other: Set<A>) -> Bool","disjoint?(other: Set<A>) -> Bool","+(other: Set<A>) -> Set<A>","-(other: Set<A>) -> Set<A>","map(f: (A -> B)) -> Set<B>","filter(pred: (A -> Bool)) -> Set<A>","reject(pred: (A -> Bool)) -> Set<A>","showValue : String","blank? : Bool"],"summary":"","types":["A","Bool","Set<A>","[A]","(A) -> B","Set<B>","(A) -> Bool"],"urlPath":"set"},{"anchor":"set-reduce","kind":"function","line":84,"name":"reduce","qualifiedName":"Set.reduce","signatures":["reduce(acc, f)"],"summary":"Enumerable primitive: fold over the elements in ascending order. Collection-producing operations come from Enumerable and traversal queries from Foldable; the set-returning ones are overridden below, because Enumerable's defaults answer with a list.","types":[],"urlPath":"set"},{"anchor":"set-identity","kind":"function","line":87,"name":"identity","qualifiedName":"Set.identity","signatures":[],"summary":"Sets form a Monoid under union.","types":[],"urlPath":"set"},{"anchor":"set-combine","kind":"function","line":88,"name":"combine","qualifiedName":"Set.combine","signatures":["combine(other)"],"summary":"","types":[],"urlPath":"set"},{"anchor":"set-contains?","kind":"function","line":94,"name":"contains?","qualifiedName":"Set.contains?","signatures":["contains?(value: A) -> Bool"],"summary":"Returns `true` if `value` is a member.","types":["A","Bool"],"urlPath":"set"},{"anchor":"set-count","kind":"function","line":101,"name":"count","qualifiedName":"Set.count","signatures":["count : Integer"],"summary":"The number of distinct elements.","types":[],"urlPath":"set"},{"anchor":"set-empty?","kind":"function","line":105,"name":"empty?","qualifiedName":"Set.empty?","signatures":["empty? : Bool"],"summary":"Returns `true` if the set has no elements.","types":[],"urlPath":"set"},{"anchor":"set-add","kind":"function","line":113,"name":"add","qualifiedName":"Set.add","signatures":["add(value: A) -> Set<A>"],"summary":"Returns a new set with `value` added. No-op if it is already a member. Use `add!` to rebind the receiver variable.","types":["A","Set<A>"],"urlPath":"set"},{"anchor":"set-delete","kind":"function","line":121,"name":"delete","qualifiedName":"Set.delete","signatures":["delete(value: A) -> Set<A>"],"summary":"Returns a new set without `value`. No-op if it is not a member. Use `delete!` to rebind the receiver variable.","types":["A","Set<A>"],"urlPath":"set"},{"anchor":"set-union","kind":"function","line":128,"name":"union","qualifiedName":"Set.union","signatures":["union(other: Set<A>) -> Set<A>"],"summary":"Every element of either set.","types":["Set<A>"],"urlPath":"set"},{"anchor":"set-intersect","kind":"function","line":135,"name":"intersect","qualifiedName":"Set.intersect","signatures":["intersect(other: Set<A>) -> Set<A>"],"summary":"The elements both sets share.","types":["Set<A>"],"urlPath":"set"},{"anchor":"set-difference","kind":"function","line":145,"name":"difference","qualifiedName":"Set.difference","signatures":["difference(other: Set<A>) -> Set<A>"],"summary":"The elements of this set that `other` does not have.","types":["Set<A>"],"urlPath":"set"},{"anchor":"set-symmetricdifference","kind":"function","line":155,"name":"symmetricDifference","qualifiedName":"Set.symmetricDifference","signatures":["symmetricDifference(other: Set<A>) -> Set<A>"],"summary":"The elements in exactly one of the two sets.","types":["Set<A>"],"urlPath":"set"},{"anchor":"set-subset?","kind":"function","line":162,"name":"subset?","qualifiedName":"Set.subset?","signatures":["subset?(other: Set<A>) -> Bool"],"summary":"Returns `true` if every element of this set is in `other`.","types":["Set<A>","Bool"],"urlPath":"set"},{"anchor":"set-superset?","kind":"function","line":169,"name":"superset?","qualifiedName":"Set.superset?","signatures":["superset?(other: Set<A>) -> Bool"],"summary":"Returns `true` if this set has every element of `other`.","types":["Set<A>","Bool"],"urlPath":"set"},{"anchor":"set-disjoint?","kind":"function","line":176,"name":"disjoint?","qualifiedName":"Set.disjoint?","signatures":["disjoint?(other: Set<A>) -> Bool"],"summary":"Returns `true` if the two sets share no element.","types":["Set<A>","Bool"],"urlPath":"set"},{"anchor":"set-op-plus","kind":"function","line":188,"name":"+","qualifiedName":"Set.+","signatures":["+(other: Set<A>) -> Set<A>"],"summary":"`+` unions, with either another set or a plain list — `xs + [y]` is the everyday way to add one element without naming a method.","types":["Set<A>","[A]"],"urlPath":"set"},{"anchor":"set-op-minus","kind":"function","line":195,"name":"-","qualifiedName":"Set.-","signatures":["-(other: Set<A>) -> Set<A>"],"summary":"`-` removes, taking either another set or a plain list.","types":["Set<A>","[A]"],"urlPath":"set"},{"anchor":"set-map","kind":"function","line":204,"name":"map","qualifiedName":"Set.map","signatures":["map(f: (A -> B)) -> Set<B>"],"summary":"Set overrides the collection-returning HOFs: Enumerable's defaults answer with a list, and mapping a set should give back a set. `map` may collapse elements — `Set.from([1, -1]).map { |x| x.abs }` has one member, not two.","types":["(A) -> B","Set<B>"],"urlPath":"set"},{"anchor":"set-filter","kind":"function","line":211,"name":"filter","qualifiedName":"Set.filter","signatures":["filter(pred: (A -> Bool)) -> Set<A>"],"summary":"Returns a new set keeping only the elements `pred` accepts.","types":["(A) -> Bool","Set<A>"],"urlPath":"set"},{"anchor":"set-reject","kind":"function","line":215,"name":"reject","qualifiedName":"Set.reject","signatures":["reject(pred: (A -> Bool)) -> Set<A>"],"summary":"Returns a new set without the elements `pred` accepts.","types":["(A) -> Bool","Set<A>"],"urlPath":"set"},{"anchor":"set-showvalue","kind":"function","line":220,"name":"showValue","qualifiedName":"Set.showValue","signatures":["showValue : String"],"summary":"Sets print as `Set(...)` in element order rather than exposing the record layout behind them.","types":[],"urlPath":"set"},{"anchor":"set-blank?","kind":"function","line":225,"name":"blank?","qualifiedName":"Set.blank?","signatures":["blank? : Bool"],"summary":"","types":[],"urlPath":"set"},{"anchor":"make-unorderedset","kind":"make","line":229,"name":"UnorderedSet<A>","qualifiedName":"UnorderedSet<A>","signatures":["reduce(acc, f)","combine(other)","contains?(value: A) -> Bool","count : Integer","empty? : Bool","items : [A]","add(value: A) -> UnorderedSet<A>","delete(value: A) -> UnorderedSet<A>","union(other: UnorderedSet<A>) -> UnorderedSet<A>","intersect(other: UnorderedSet<A>) -> UnorderedSet<A>","difference(other: UnorderedSet<A>) -> UnorderedSet<A>","symmetricDifference(other: UnorderedSet<A>) -> UnorderedSet<A>","subset?(other: UnorderedSet<A>) -> Bool","superset?(other: UnorderedSet<A>) -> Bool","disjoint?(other: UnorderedSet<A>) -> Bool","+(other: UnorderedSet<A>) -> UnorderedSet<A>","-(other: UnorderedSet<A>) -> UnorderedSet<A>","map(f: (A -> B)) -> UnorderedSet<B>","filter(pred: (A -> Bool)) -> UnorderedSet<A>","reject(pred: (A -> Bool)) -> UnorderedSet<A>","showValue : String","blank? : Bool"],"summary":"","types":["A","Bool","UnorderedSet<A>","[A]","(A) -> B","UnorderedSet<B>","(A) -> Bool"],"urlPath":"set"},{"anchor":"unorderedset-reduce","kind":"function","line":232,"name":"reduce","qualifiedName":"UnorderedSet.reduce","signatures":["reduce(acc, f)"],"summary":"Enumerable primitive: fold over the elements. The order is whatever the underlying map hands back — unspecified, and not to be relied on.","types":[],"urlPath":"set"},{"anchor":"unorderedset-identity","kind":"function","line":235,"name":"identity","qualifiedName":"UnorderedSet.identity","signatures":[],"summary":"Unordered sets form a Monoid under union.","types":[],"urlPath":"set"},{"anchor":"unorderedset-combine","kind":"function","line":236,"name":"combine","qualifiedName":"UnorderedSet.combine","signatures":["combine(other)"],"summary":"","types":[],"urlPath":"set"},{"anchor":"unorderedset-contains?","kind":"function","line":243,"name":"contains?","qualifiedName":"UnorderedSet.contains?","signatures":["contains?(value: A) -> Bool"],"summary":"Returns `true` if `value` is a member. This is the operation the flavour exists for: a map lookup, with no ordering to maintain.","types":["A","Bool"],"urlPath":"set"},{"anchor":"unorderedset-count","kind":"function","line":247,"name":"count","qualifiedName":"UnorderedSet.count","signatures":["count : Integer"],"summary":"The number of distinct elements.","types":[],"urlPath":"set"},{"anchor":"unorderedset-empty?","kind":"function","line":251,"name":"empty?","qualifiedName":"UnorderedSet.empty?","signatures":["empty? : Bool"],"summary":"Returns `true` if the set has no elements.","types":[],"urlPath":"set"},{"anchor":"unorderedset-items","kind":"function","line":258,"name":"items","qualifiedName":"UnorderedSet.items","signatures":["items : [A]"],"summary":"The elements as a list, in unspecified order.","types":[],"urlPath":"set"},{"anchor":"unorderedset-add","kind":"function","line":262,"name":"add","qualifiedName":"UnorderedSet.add","signatures":["add(value: A) -> UnorderedSet<A>"],"summary":"Returns a new set with `value` added. Use `add!` to rebind the receiver.","types":["A","UnorderedSet<A>"],"urlPath":"set"},{"anchor":"unorderedset-delete","kind":"function","line":266,"name":"delete","qualifiedName":"UnorderedSet.delete","signatures":["delete(value: A) -> UnorderedSet<A>"],"summary":"Returns a new set without `value`. Use `delete!` to rebind the receiver.","types":["A","UnorderedSet<A>"],"urlPath":"set"},{"anchor":"unorderedset-union","kind":"function","line":270,"name":"union","qualifiedName":"UnorderedSet.union","signatures":["union(other: UnorderedSet<A>) -> UnorderedSet<A>"],"summary":"Every element of either set.","types":["UnorderedSet<A>"],"urlPath":"set"},{"anchor":"unorderedset-intersect","kind":"function","line":274,"name":"intersect","qualifiedName":"UnorderedSet.intersect","signatures":["intersect(other: UnorderedSet<A>) -> UnorderedSet<A>"],"summary":"The elements both sets share.","types":["UnorderedSet<A>"],"urlPath":"set"},{"anchor":"unorderedset-difference","kind":"function","line":278,"name":"difference","qualifiedName":"UnorderedSet.difference","signatures":["difference(other: UnorderedSet<A>) -> UnorderedSet<A>"],"summary":"The elements of this set that `other` does not have.","types":["UnorderedSet<A>"],"urlPath":"set"},{"anchor":"unorderedset-symmetricdifference","kind":"function","line":282,"name":"symmetricDifference","qualifiedName":"UnorderedSet.symmetricDifference","signatures":["symmetricDifference(other: UnorderedSet<A>) -> UnorderedSet<A>"],"summary":"The elements in exactly one of the two sets.","types":["UnorderedSet<A>"],"urlPath":"set"},{"anchor":"unorderedset-subset?","kind":"function","line":286,"name":"subset?","qualifiedName":"UnorderedSet.subset?","signatures":["subset?(other: UnorderedSet<A>) -> Bool"],"summary":"Returns `true` if every element of this set is in `other`.","types":["UnorderedSet<A>","Bool"],"urlPath":"set"},{"anchor":"unorderedset-superset?","kind":"function","line":290,"name":"superset?","qualifiedName":"UnorderedSet.superset?","signatures":["superset?(other: UnorderedSet<A>) -> Bool"],"summary":"Returns `true` if this set has every element of `other`.","types":["UnorderedSet<A>","Bool"],"urlPath":"set"},{"anchor":"unorderedset-disjoint?","kind":"function","line":294,"name":"disjoint?","qualifiedName":"UnorderedSet.disjoint?","signatures":["disjoint?(other: UnorderedSet<A>) -> Bool"],"summary":"Returns `true` if the two sets share no element.","types":["UnorderedSet<A>","Bool"],"urlPath":"set"},{"anchor":"unorderedset-op-plus","kind":"function","line":298,"name":"+","qualifiedName":"UnorderedSet.+","signatures":["+(other: UnorderedSet<A>) -> UnorderedSet<A>"],"summary":"`+` unions, with either another set or a plain list.","types":["UnorderedSet<A>","[A]"],"urlPath":"set"},{"anchor":"unorderedset-op-minus","kind":"function","line":302,"name":"-","qualifiedName":"UnorderedSet.-","signatures":["-(other: UnorderedSet<A>) -> UnorderedSet<A>"],"summary":"`-` removes, taking either another set or a plain list.","types":["UnorderedSet<A>","[A]"],"urlPath":"set"},{"anchor":"unorderedset-map","kind":"function","line":306,"name":"map","qualifiedName":"UnorderedSet.map","signatures":["map(f: (A -> B)) -> UnorderedSet<B>"],"summary":"The collection-returning HOFs answer with a set, not a list.","types":["(A) -> B","UnorderedSet<B>"],"urlPath":"set"},{"anchor":"unorderedset-filter","kind":"function","line":309,"name":"filter","qualifiedName":"UnorderedSet.filter","signatures":["filter(pred: (A -> Bool)) -> UnorderedSet<A>"],"summary":"","types":["(A) -> Bool","UnorderedSet<A>"],"urlPath":"set"},{"anchor":"unorderedset-reject","kind":"function","line":312,"name":"reject","qualifiedName":"UnorderedSet.reject","signatures":["reject(pred: (A -> Bool)) -> UnorderedSet<A>"],"summary":"","types":["(A) -> Bool","UnorderedSet<A>"],"urlPath":"set"},{"anchor":"unorderedset-showvalue","kind":"function","line":317,"name":"showValue","qualifiedName":"UnorderedSet.showValue","signatures":["showValue : String"],"summary":"Printed in sorted order where the elements allow it, so the rendering of a value is not at the mercy of map internals.","types":[],"urlPath":"set"},{"anchor":"unorderedset-blank?","kind":"function","line":322,"name":"blank?","qualifiedName":"UnorderedSet.blank?","signatures":["blank? : Bool"],"summary":"","types":[],"urlPath":"set"},{"anchor":"type-stream","kind":"type","line":1,"name":"Stream","qualifiedName":"Stream","signatures":[],"summary":"","types":[],"urlPath":"stream"},{"anchor":"module-stream","kind":"module","line":3,"name":"Stream","qualifiedName":"Stream","signatures":["Sequence(from: A, step: (A -> A)) -> Stream<A>","Iterate(seed: A, step) -> Stream<A>"],"summary":"","types":[],"urlPath":"stream"},{"anchor":"function-stream-sequence","kind":"function","line":17,"name":"Sequence","qualifiedName":"Stream.Sequence","signatures":["Sequence(from: A, step: (A -> A)) -> Stream<A>"],"summary":"Creates an infinite stream starting at `from`, applying `step` to produce each successive element.","types":[],"urlPath":"stream"},{"anchor":"function-stream-iterate","kind":"function","line":30,"name":"Iterate","qualifiedName":"Stream.Iterate","signatures":["Iterate(seed: A, step) -> Stream<A>"],"summary":"Creates an infinite stream seeded with `seed`, applying `f` to each element to produce the next. Equivalent to `Sequence`; use whichever reads more clearly at the call site.","types":[],"urlPath":"stream"},{"anchor":"make-stream","kind":"make","line":33,"name":"Stream<A>","qualifiedName":"Stream<A>","signatures":["take(n: Integer) -> [A]","drop(n: Integer) -> Stream<A>","map(f: (A -> B)) -> Stream<B>","filter(pred: (A -> Bool)) -> Stream<A>"],"summary":"","types":["Integer","[A]","Stream<A>","(A) -> B","Stream<B>","(A) -> Bool"],"urlPath":"stream"},{"anchor":"stream-take","kind":"function","line":42,"name":"take","qualifiedName":"Stream.take","signatures":["take(n: Integer) -> [A]"],"summary":"Returns the first `n` elements as a list. Evaluates the stream up to that point.","types":["Integer","[A]"],"urlPath":"stream"},{"anchor":"stream-drop","kind":"function","line":52,"name":"drop","qualifiedName":"Stream.drop","signatures":["drop(n: Integer) -> Stream<A>"],"summary":"Skips the first `n` elements and returns a new stream offset by `n`.","types":["Integer","Stream<A>"],"urlPath":"stream"},{"anchor":"stream-map","kind":"function","line":63,"name":"map","qualifiedName":"Stream.map","signatures":["map(f: (A -> B)) -> Stream<B>"],"summary":"Returns a new stream applying `f` to each element.","types":["(A) -> B","Stream<B>"],"urlPath":"stream"},{"anchor":"stream-filter","kind":"function","line":75,"name":"filter","qualifiedName":"Stream.filter","signatures":["filter(pred: (A -> Bool)) -> Stream<A>"],"summary":"Returns a new stream keeping only elements for which `pred` is `true`. Note: consuming `n` elements may require evaluating many upstream elements.","types":["(A) -> Bool","Stream<A>"],"urlPath":"stream"},{"anchor":"make-string","kind":"make","line":1,"name":"String","qualifiedName":"String","signatures":["reduce(acc: A, f: (A -> Char -> A)) -> A","mapChars(f: (Char -> Char)) -> String","filter(pred: (Char -> Bool)) -> String","uniq : String","first : Char?","last : Char?","get(i: Integer) -> Char?","get(i: Integer, default: Char) -> Char","take(n: Integer) -> String","drop(n: Integer) -> String","reject(pred: (Char -> Bool)) -> String","sort : String","indexOf(c: Char) -> Integer?","findIndex(pred: (Char -> Bool)) -> Integer?","zip(other: [Y]) -> [(Char, Y)]","partition(pred: (Char -> Bool)) -> (String, String)","count : Integer","length : Integer","empty? : Bool","enclose(wrapper: String) -> String","enclose(left: String, right: String) -> String","at(i: Integer) -> Char?","second : Char?","third : Char?","rest : String","chars : [Char]","bytes : [Byte]","split : [String]","split(sep: String | Regex) -> [String]","split : [String]","lines : [String]","indentRest(prefix: String) -> String","replace(pattern: String, replacement: String) -> String","substitute(replacements: {String: String}) -> String","trim : String","upperCase : String","lowerCase : String","capitalize : String","reverse : String","contains?(sub: String) -> Bool","startsWith?(prefix: String) -> Bool","endsWith?(suffix: String) -> Bool"],"summary":"","types":["A","(A) -> (Char) -> A","(Char) -> Char","String","(Char) -> Bool","Integer","Char?","Char","Integer?","[Y]","[(Char, Y)]","(String, String)","(String) -> String","String | Regex","[String]","{String: String}","Bool"],"urlPath":"string"},{"anchor":"string-reduce","kind":"function","line":5,"name":"reduce","qualifiedName":"String.reduce","signatures":["reduce(acc: A, f: (A -> Char -> A)) -> A"],"summary":"Enumerable primitive and string-preserving higher-order operations. The private List intrinsics understand String's [Char] representation; the public methods remain owned here in Kex source.","types":["A","(A) -> (Char) -> A"],"urlPath":"string"},{"anchor":"string-mapchars","kind":"function","line":18,"name":"mapChars","qualifiedName":"String.mapChars","signatures":["mapChars(f: (Char -> Char)) -> String"],"summary":"No `map` override: the Enumerable default collects into a list, which is what `(Char -> B) -> [B]` says. A String-in/String-out mapping is a different operation with a different type, so it gets its own name.","types":["(Char) -> Char","String"],"urlPath":"string"},{"anchor":"string-filter","kind":"function","line":21,"name":"filter","qualifiedName":"String.filter","signatures":["filter(pred: (Char -> Bool)) -> String"],"summary":"","types":["(Char) -> Bool","String"],"urlPath":"string"},{"anchor":"string-uniq","kind":"function","line":24,"name":"uniq","qualifiedName":"String.uniq","signatures":["uniq : String"],"summary":"","types":[],"urlPath":"string"},{"anchor":"string-first","kind":"function","line":41,"name":"first","qualifiedName":"String.first","signatures":["first : Char?"],"summary":"A String is its OWN type, not a [Char] — `chars` converts between them. So the sequence operations below are declared here rather than inherited from List, and they answer in String's terms: `take`/`drop`/`sort` hand back a String, while `first`/`last` hand back a Char. The List intrinsics they delegate to already understand the String representation, so there is one implementation for both backends.\n\nReturns the first character, or None when the string is empty.","types":[],"urlPath":"string"},{"anchor":"string-last","kind":"function","line":50,"name":"last","qualifiedName":"String.last","signatures":["last : Char?"],"summary":"Returns the last character, or None when the string is empty.","types":[],"urlPath":"string"},{"anchor":"string-get","kind":"function","line":60,"name":"get","qualifiedName":"String.get","signatures":["get(i: Integer) -> Char?","get(i: Integer, default: Char) -> Char"],"summary":"Returns the character at `i`, or None when out of range.","types":["Integer","Char?","(Char) -> Char"],"urlPath":"string"},{"anchor":"string-take","kind":"function","line":78,"name":"take","qualifiedName":"String.take","signatures":["take(n: Integer) -> String"],"summary":"Returns the first `n` characters.","types":["Integer","String"],"urlPath":"string"},{"anchor":"string-drop","kind":"function","line":88,"name":"drop","qualifiedName":"String.drop","signatures":["drop(n: Integer) -> String"],"summary":"Returns everything after the first `n` characters.","types":["Integer","String"],"urlPath":"string"},{"anchor":"string-reject","kind":"function","line":99,"name":"reject","qualifiedName":"String.reject","signatures":["reject(pred: (Char -> Bool)) -> String"],"summary":"Returns the characters that do NOT satisfy the predicate — filter's complement.","types":["(Char) -> Bool","String"],"urlPath":"string"},{"anchor":"string-sort","kind":"function","line":108,"name":"sort","qualifiedName":"String.sort","signatures":["sort : String"],"summary":"Returns the characters in ascending order.","types":[],"urlPath":"string"},{"anchor":"string-indexof","kind":"function","line":118,"name":"indexOf","qualifiedName":"String.indexOf","signatures":["indexOf(c: Char) -> Integer?"],"summary":"Returns the index of the first occurrence of `c`, or None.","types":["Char","Integer?"],"urlPath":"string"},{"anchor":"string-findindex","kind":"function","line":129,"name":"findIndex","qualifiedName":"String.findIndex","signatures":["findIndex(pred: (Char -> Bool)) -> Integer?"],"summary":"Returns the index of the first character satisfying the predicate, or None. Goes through `chars` because there is no direct intrinsic.","types":["(Char) -> Bool","Integer?"],"urlPath":"string"},{"anchor":"string-zip","kind":"function","line":140,"name":"zip","qualifiedName":"String.zip","signatures":["zip(other: [Y]) -> [(Char, Y)]"],"summary":"Pairs each character with the element at the same index in `other`, stopping at the shorter of the two.","types":["[Y]","[(Char, Y)]"],"urlPath":"string"},{"anchor":"string-partition","kind":"function","line":151,"name":"partition","qualifiedName":"String.partition","signatures":["partition(pred: (Char -> Bool)) -> (String, String)"],"summary":"Splits into the characters that satisfy the predicate and those that do not, in that order.","types":["(Char) -> Bool","(String, String)"],"urlPath":"string"},{"anchor":"string-count","kind":"function","line":161,"name":"count","qualifiedName":"String.count","signatures":["count : Integer"],"summary":"Returns the number of characters in the string.","types":[],"urlPath":"string"},{"anchor":"string-length","kind":"function","line":165,"name":"length","qualifiedName":"String.length","signatures":["length : Integer"],"summary":"Compatibility spelling retained as a source-owned String method.","types":[],"urlPath":"string"},{"anchor":"string-empty?","kind":"function","line":175,"name":"empty?","qualifiedName":"String.empty?","signatures":["empty? : Bool"],"summary":"Returns `true` if the string contains no characters.","types":[],"urlPath":"string"},{"anchor":"string-enclose","kind":"function","line":184,"name":"enclose","qualifiedName":"String.enclose","signatures":["enclose(wrapper: String) -> String","enclose(left: String, right: String) -> String"],"summary":"Returns an enclosed string, with `wrapper` on both ends.","types":["String","(String) -> String"],"urlPath":"string"},{"anchor":"string-at","kind":"function","line":205,"name":"at","qualifiedName":"String.at","signatures":["at(i: Integer) -> Char?"],"summary":"Returns the character at position `i` (0-based), or `None` if out of range.","types":["Integer","Char?"],"urlPath":"string"},{"anchor":"string-second","kind":"function","line":209,"name":"second","qualifiedName":"String.second","signatures":["second : Char?"],"summary":"Returns the second character wrapped in `Just`, or `None` when absent.","types":[],"urlPath":"string"},{"anchor":"string-third","kind":"function","line":213,"name":"third","qualifiedName":"String.third","signatures":["third : Char?"],"summary":"Returns the third character wrapped in `Just`, or `None` when absent.","types":[],"urlPath":"string"},{"anchor":"string-rest","kind":"function","line":217,"name":"rest","qualifiedName":"String.rest","signatures":["rest : String"],"summary":"Returns all characters after the first.","types":[],"urlPath":"string"},{"anchor":"string-chars","kind":"function","line":226,"name":"chars","qualifiedName":"String.chars","signatures":["chars : [Char]"],"summary":"Returns a list of the individual characters in the string.","types":[],"urlPath":"string"},{"anchor":"string-bytes","kind":"function","line":240,"name":"bytes","qualifiedName":"String.bytes","signatures":["bytes : [Byte]"],"summary":"Returns the string's UTF-8 encoding, one Byte per byte.\n\n`chars` is the TEXT view of a String and `bytes` is the STORAGE view, so they differ for anything outside ASCII: \"é\" is one Char and two Bytes.","types":[],"urlPath":"string"},{"anchor":"string-split","kind":"function","line":257,"name":"split","qualifiedName":"String.split","signatures":["split : [String]"],"summary":"Splits on every occurrence of `sep`. With no argument, splits into individual characters.\n\nSeparator-less: one part per character, as the example above shows. Only the intrinsic had this form, so the walker answered `\"hi\".split` with \"'this' used outside of a method context\" while BEAM returned the parts. Declared BEFORE the separator form, as `sort` is in list.kex: the walker resolves a no-argument call against the first clause of that name.","types":[],"urlPath":"string"},{"anchor":"string-split","kind":"function","line":260,"name":"split","qualifiedName":"String.split","signatures":["split(sep: String | Regex) -> [String]","split : [String]"],"summary":"","types":["String | Regex","[String]"],"urlPath":"string"},{"anchor":"string-lines","kind":"function","line":273,"name":"lines","qualifiedName":"String.lines","signatures":["lines : [String]"],"summary":"Splits into lines on `\\n`, dropping a single trailing newline so a file ending in one does not yield a final empty line. Windows line endings are not stripped — split on `\\r\\n` explicitly if that matters.","types":[],"urlPath":"string"},{"anchor":"string-indentrest","kind":"function","line":294,"name":"indentRest","qualifiedName":"String.indentRest","signatures":["indentRest(prefix: String) -> String"],"summary":"Indents every line but the first by `prefix`. That is what splicing a multi-line value into an indented `${...}` hole needs: the hole's own indentation already covers line one, the rest have to catch up. Blank lines stay blank, and — through `lines` — one trailing newline is dropped, so a block does not push a stray empty line into its slot.","types":["String"],"urlPath":"string"},{"anchor":"string-replace","kind":"function","line":316,"name":"replace","qualifiedName":"String.replace","signatures":["replace(pattern: String, replacement: String) -> String"],"summary":"Replaces every literal occurrence of `pattern`. An empty pattern matches at every character boundary, including both ends.","types":["String"],"urlPath":"string"},{"anchor":"string-substitute","kind":"function","line":346,"name":"substitute","qualifiedName":"String.substitute","signatures":["substitute(replacements: {String: String}) -> String"],"summary":"Replaces every key of `replacements` with its value, in one pass over the map. The keys are the placeholders exactly as written — no syntax is imposed, and nothing is reserved — so `$NAME$`, `__NAME__`, `{{name}}` and `%name%` are all equally valid, and a template needs no escaping to be a template. `$NAME$` is the convention to reach for when there is no reason to prefer another.\n\nNote that a placeholder is NOT `${name}`: that is interpolation, which the compiler resolves before this ever sees the string.\n\nThis is what a template wants instead of a chain of `.replace` calls: the chain reads as a pipeline when it is really a substitution table, and it quietly depends on its own order, since an earlier replacement's OUTPUT is still visible to every later one.\n\nSubstitutions are applied in the map's canonical key order and each is applied to the result of the last, so a value that itself contains a key can still be rewritten by a later one. Keep values placeholder-free when that matters.","types":["{String: String}","String"],"urlPath":"string"},{"anchor":"string-trim","kind":"function","line":358,"name":"trim","qualifiedName":"String.trim","signatures":["trim : String"],"summary":"Removes leading and trailing whitespace.","types":[],"urlPath":"string"},{"anchor":"string-uppercase","kind":"function","line":367,"name":"upperCase","qualifiedName":"String.upperCase","signatures":["upperCase : String"],"summary":"Returns the string with all characters converted to upper case.","types":[],"urlPath":"string"},{"anchor":"string-lowercase","kind":"function","line":376,"name":"lowerCase","qualifiedName":"String.lowerCase","signatures":["lowerCase : String"],"summary":"Returns the string with all characters converted to lower case.","types":[],"urlPath":"string"},{"anchor":"string-capitalize","kind":"function","line":394,"name":"capitalize","qualifiedName":"String.capitalize","signatures":["capitalize : String"],"summary":"Returns the string with its first character upper-cased and the rest LOWER-cased, matching Ruby's String#capitalize — so \"hELLO\" becomes \"Hello\", not \"HELLO\". Unlike `upperCase`, which shouts the whole string.\n\nNeeded to build type names from data: a generated `type %name = ...` inside a `compiled do` block requires an upper-case identifier, so a list of lower-case words has to be capitalized first.","types":[],"urlPath":"string"},{"anchor":"string-reverse","kind":"function","line":424,"name":"reverse","qualifiedName":"String.reverse","signatures":["reverse : String"],"summary":"Returns the string with its characters in reverse order.","types":[],"urlPath":"string"},{"anchor":"string-contains?","kind":"function","line":435,"name":"contains?","qualifiedName":"String.contains?","signatures":["contains?(sub: String) -> Bool"],"summary":"Returns `true` if `sub` appears anywhere within the string.","types":["String","Bool"],"urlPath":"string"},{"anchor":"string-startswith?","kind":"function","line":446,"name":"startsWith?","qualifiedName":"String.startsWith?","signatures":["startsWith?(prefix: String) -> Bool"],"summary":"Returns `true` if the string begins with `prefix`.","types":["String","Bool"],"urlPath":"string"},{"anchor":"string-endswith?","kind":"function","line":457,"name":"endsWith?","qualifiedName":"String.endsWith?","signatures":["endsWith?(suffix: String) -> Bool"],"summary":"Returns `true` if the string ends with `suffix`.","types":["String","Bool"],"urlPath":"string"},{"anchor":"make-char","kind":"make","line":463,"name":"Char","qualifiedName":"Char","signatures":["string : String","upperCase : Char","lowerCase : Char","digit? : Bool","alpha? : Bool","letter? : Bool","upper? : Bool","lower? : Bool","space? : Bool","codepoint : Integer","in?(range: Range<Char>) -> Bool"],"summary":"","types":["Range<Char>","Bool"],"urlPath":"string"},{"anchor":"char-string","kind":"function","line":473,"name":"string","qualifiedName":"Char.string","signatures":["string : String"],"summary":"A Char and a String are distinct types, so converting between them is explicit. `to(String)` is the fallible protocol and answers `String?` like every other conversion; `string` is the total one, because a character is always one character of text and has no failure case to report. It is the single-character counterpart of `String.chars` and `[Char].join(\"\")`.\n\n```kex\n'a'.string                      # => \"a\"\n'a'.to(String)                  # => Just(\"a\")\n\"hi\".chars.map(&.string)        # => [\"h\", \"i\"]\n```","types":[],"urlPath":"string"},{"anchor":"char-uppercase","kind":"function","line":477,"name":"upperCase","qualifiedName":"Char.upperCase","signatures":["upperCase : Char"],"summary":"Converts this character to upper/lower case while preserving Char.","types":[],"urlPath":"string"},{"anchor":"char-lowercase","kind":"function","line":479,"name":"lowerCase","qualifiedName":"Char.lowerCase","signatures":["lowerCase : Char"],"summary":"","types":[],"urlPath":"string"},{"anchor":"char-digit?","kind":"function","line":489,"name":"digit?","qualifiedName":"Char.digit?","signatures":["digit? : Bool"],"summary":"Returns `true` if the character is a decimal digit (`0`..`9`).","types":[],"urlPath":"string"},{"anchor":"char-alpha?","kind":"function","line":491,"name":"alpha?","qualifiedName":"Char.alpha?","signatures":["alpha? : Bool"],"summary":"","types":[],"urlPath":"string"},{"anchor":"char-letter?","kind":"function","line":493,"name":"letter?","qualifiedName":"Char.letter?","signatures":["letter? : Bool"],"summary":"","types":[],"urlPath":"string"},{"anchor":"char-upper?","kind":"function","line":495,"name":"upper?","qualifiedName":"Char.upper?","signatures":["upper? : Bool"],"summary":"","types":[],"urlPath":"string"},{"anchor":"char-lower?","kind":"function","line":497,"name":"lower?","qualifiedName":"Char.lower?","signatures":["lower? : Bool"],"summary":"","types":[],"urlPath":"string"},{"anchor":"char-space?","kind":"function","line":499,"name":"space?","qualifiedName":"Char.space?","signatures":["space? : Bool"],"summary":"","types":[],"urlPath":"string"},{"anchor":"char-codepoint","kind":"function","line":503,"name":"codepoint","qualifiedName":"Char.codepoint","signatures":["codepoint : Integer"],"summary":"Returns this character's numeric codepoint.","types":[],"urlPath":"string"},{"anchor":"char-in?","kind":"function","line":514,"name":"in?","qualifiedName":"Char.in?","signatures":["in?(range: Range<Char>) -> Bool"],"summary":"Returns `true` if the character falls within the given range (inclusive).","types":["Range<Char>","Bool"],"urlPath":"string"},{"anchor":"module-string","kind":"module","line":518,"name":"String","qualifiedName":"String","signatures":["fromCodepoint(value: Integer) -> String?","fromBytes(values: [Byte]) -> String?"],"summary":"","types":["Integer","String?","[Byte]"],"urlPath":"string"},{"anchor":"function-string-fromcodepoint","kind":"function","line":521,"name":"fromCodepoint","qualifiedName":"String.fromCodepoint","signatures":["fromCodepoint(value: Integer) -> String?"],"summary":"Constructs a one-codepoint UTF-8 string. Surrogates and values outside the Unicode scalar range return None.","types":["Integer","String?"],"urlPath":"string"},{"anchor":"function-string-frombytes","kind":"function","line":531,"name":"fromBytes","qualifiedName":"String.fromBytes","signatures":["fromBytes(values: [Byte]) -> String?"],"summary":"Rebuilds a String from its UTF-8 bytes — the inverse of `bytes`. A String is TEXT, so bytes outside 0..255 or a malformed encoding return None rather than a string that would decode to replacement characters.\n\n```kex\nString.fromBytes([104, 105])    # => Just(\"hi\")\nString.fromBytes([195, 169])    # => Just(\"é\")\nString.fromBytes([255])         # => None\n```","types":["[Byte]","String?"],"urlPath":"string"},{"anchor":"make-tuple","kind":"make","line":535,"name":"Tuple","qualifiedName":"Tuple","signatures":["items : [Any]"],"summary":"","types":[],"urlPath":"string"},{"anchor":"tuple-items","kind":"function","line":545,"name":"items","qualifiedName":"Tuple.items","signatures":["items : [Any]"],"summary":"Returns the tuple's elements as a list.\n\nA tuple is not a list — its arity is part of its type — so the List methods do not apply to it. This is the explicit conversion.","types":[],"urlPath":"string"},{"anchor":"module-system","kind":"module","line":10,"name":"System","qualifiedName":"System","signatures":["exit(code: Integer) -> Void"],"summary":"Operations concerning the running Kex system process.\n\nDeliberately NOT a capability, and `OS`/`BITWIDTH` stay pure. Faking the reported OS only exercises a program's branching, not the platform behaviour behind it — the file semantics, path rules and process handling that actually differ are unaffected by the atom. Testing those means running on the platform, which CI does across macOS, Ubuntu and Alpine. `Mock.System` existed for this and had exactly one caller: the spec that tested it (kexhq/kex#143).","types":["Integer","Void","OperatingSystem","Bool"],"urlPath":"system"},{"anchor":"type-system-operatingsystem","kind":"type","line":15,"name":"OperatingSystem","qualifiedName":"System.OperatingSystem","signatures":[],"summary":"The operating system family the program is running on. A union of atoms rather than an ADT: these are plain tags, and a `match` over them is still exhaustive. Anything unmodelled is `:unknown` — the union is closed, so callers can cover it.","types":[],"urlPath":"system"},{"anchor":"function-system-exit","kind":"function","line":22,"name":"exit","qualifiedName":"System.exit","signatures":["exit(code: Integer) -> Void"],"summary":"Terminates the process with the given numeric exit code. The invoking shell receives this code.","types":["Integer","Void"],"urlPath":"system"},{"anchor":"constant-system-os","kind":"constant","line":31,"name":"OS","qualifiedName":"System.OS","signatures":[],"summary":"Both backends answer with the same atom for the same machine.","types":["OperatingSystem"],"urlPath":"system"},{"anchor":"constant-system-bitwidth","kind":"constant","line":37,"name":"BITWIDTH","qualifiedName":"System.BITWIDTH","signatures":[],"summary":"The machine's pointer width in bits — 64 on anything current, 32 on a small target. Reported by the emulator on BEAM and by the pointer size in the tree walker, so both agree for one machine.","types":["Integer"],"urlPath":"system"},{"anchor":"constant-system-macos?","kind":"constant","line":40,"name":"macOS?","qualifiedName":"System.macOS?","signatures":[],"summary":"","types":["Bool"],"urlPath":"system"},{"anchor":"constant-system-linux?","kind":"constant","line":43,"name":"linux?","qualifiedName":"System.linux?","signatures":[],"summary":"","types":["Bool"],"urlPath":"system"},{"anchor":"constant-system-windows?","kind":"constant","line":46,"name":"windows?","qualifiedName":"System.windows?","signatures":[],"summary":"","types":["Bool"],"urlPath":"system"},{"anchor":"constant-system-posix?","kind":"constant","line":52,"name":"posix?","qualifiedName":"System.posix?","signatures":[],"summary":"Everything the toolchain runs on except Windows behaves POSIX-ly enough for paths, separators and shell conventions. An unknown system is NOT assumed to be POSIX.","types":["Bool"],"urlPath":"system"},{"anchor":"function-die","kind":"function","line":64,"name":"die","qualifiedName":"die","signatures":["die : Never","die(message: String) -> Never"],"summary":"Terminates the process with a fatal message: `message` goes to stderr behind a \"fatal: \" prefix and the exit status is 1. This is an abort, not an exception — `trying`/`rescue` cannot catch it, so use it only where there is no recoverable answer (the prelude uses it for a negative `repeat` count). Declared bare, like `assert`: it is always in scope. The result type is `Never`, the bottom type: `die` does not return, so a branch that dies takes the other branch's type (`if b == 0 then die(\"...\") else a end` is an Integer).","types":["String","Never"],"urlPath":"system"},{"anchor":"module-taggedvalidation","kind":"module","line":3,"name":"TaggedValidation","qualifiedName":"TaggedValidation","signatures":["fatal(message: String) -> Issue","fatalAt(offset: Integer, message: String) -> Issue","fatalBetween : Integer -> Integer -> String -> Issue","warn(message: String) -> Issue","warnAt(offset: Integer, message: String) -> Issue","warnBetween : Integer -> Integer -> String -> Issue"],"summary":"Diagnostics returned by optional compile-time tagged-literal validators. Byte offsets are zero-based and relative to the cooked literal body.","types":["Integer","ByteSpan?","String","Issue","(Integer) -> (Integer) -> (String) -> Issue"],"urlPath":"taggedvalidation"},{"anchor":"type-taggedvalidation-bytespan","kind":"type","line":5,"name":"ByteSpan","qualifiedName":"TaggedValidation.ByteSpan","signatures":[],"summary":"","types":["Integer","Integer","Integer"],"urlPath":"taggedvalidation"},{"anchor":"type-taggedvalidation-issue","kind":"type","line":7,"name":"Issue","qualifiedName":"TaggedValidation.Issue","signatures":[],"summary":"","types":["ByteSpan?","String","ByteSpan?","String"],"urlPath":"taggedvalidation"},{"anchor":"function-taggedvalidation-fatal","kind":"function","line":10,"name":"fatal","qualifiedName":"TaggedValidation.fatal","signatures":["fatal(message: String) -> Issue"],"summary":"","types":["String","Issue"],"urlPath":"taggedvalidation"},{"anchor":"function-taggedvalidation-fatalat","kind":"function","line":13,"name":"fatalAt","qualifiedName":"TaggedValidation.fatalAt","signatures":["fatalAt(offset: Integer, message: String) -> Issue"],"summary":"","types":["Integer","String","Issue"],"urlPath":"taggedvalidation"},{"anchor":"function-taggedvalidation-fatalbetween","kind":"function","line":16,"name":"fatalBetween","qualifiedName":"TaggedValidation.fatalBetween","signatures":["fatalBetween : Integer -> Integer -> String -> Issue"],"summary":"","types":["(Integer) -> (Integer) -> (String) -> Issue"],"urlPath":"taggedvalidation"},{"anchor":"function-taggedvalidation-warn","kind":"function","line":21,"name":"warn","qualifiedName":"TaggedValidation.warn","signatures":["warn(message: String) -> Issue"],"summary":"","types":["String","Issue"],"urlPath":"taggedvalidation"},{"anchor":"function-taggedvalidation-warnat","kind":"function","line":24,"name":"warnAt","qualifiedName":"TaggedValidation.warnAt","signatures":["warnAt(offset: Integer, message: String) -> Issue"],"summary":"","types":["Integer","String","Issue"],"urlPath":"taggedvalidation"},{"anchor":"function-taggedvalidation-warnbetween","kind":"function","line":27,"name":"warnBetween","qualifiedName":"TaggedValidation.warnBetween","signatures":["warnBetween : Integer -> Integer -> String -> Issue"],"summary":"","types":["(Integer) -> (Integer) -> (String) -> Issue"],"urlPath":"taggedvalidation"},{"anchor":"function-describe","kind":"function","line":37,"name":"describe","qualifiedName":"describe","signatures":["describe(label: String, block: Block<Void>) -> Void"],"summary":"Groups related test cases under a label. Calls the block immediately. `describe` blocks may be nested. This is a foul function — it prints output.","types":["(String) -> (Block<Void>) -> Void"],"urlPath":"test"},{"anchor":"function-it","kind":"function","line":52,"name":"it","qualifiedName":"it","signatures":["it(label: String, block: Block<Void>) -> Void"],"summary":"Defines a single test case. The block is run and any exception thrown inside it (typically a failed `assert`) marks the test failed without aborting the rest of the suite. This is a foul function — it prints output.","types":["(String) -> (Block<Void>) -> Void"],"urlPath":"test"},{"anchor":"function-before","kind":"function","line":57,"name":"before","qualifiedName":"before","signatures":["before : Block<Void> -> Void","before : Atom -> Block<Void> -> Void"],"summary":"Registers setup for the current group. `before { ... }` and `before(:each) { ... }` run before every test; `before(:all) { ... }` runs once before the group's tests, following RSpec's scope convention.","types":["(Block<Void>) -> Void","(Atom) -> (Block<Void>) -> Void"],"urlPath":"test"},{"anchor":"function-after","kind":"function","line":66,"name":"after","qualifiedName":"after","signatures":["after : Block<Void> -> Void","after : Atom -> Block<Void> -> Void"],"summary":"Registers cleanup for the current group. `after { ... }` defaults to `:each`; `after(:all) { ... }` runs once when the group finishes. Cleanup is unconditional, and inner per-test hooks run before outer hooks.","types":["(Block<Void>) -> Void","(Atom) -> (Block<Void>) -> Void"],"urlPath":"test"},{"anchor":"function-assert","kind":"function","line":79,"name":"assert","qualifiedName":"assert","signatures":["assert : Bool -> Bool","assert(value: Bool, message: String) -> Bool"],"summary":"Throws a runtime error if `value` is falsy, failing the enclosing `it`. The optional `message` is included in the failure output.","types":["(Bool) -> Bool","(Bool) -> (String) -> Bool"],"urlPath":"test"},{"anchor":"module-assert","kind":"module","line":84,"name":"Assert","qualifiedName":"Assert","signatures":["equal(actual, expected)","notEqual(actual, expected)","truthy(value)","falsy(value)","some(value)","none(value)","ok(value)","error(value)"],"summary":"Focused assertions are ordinary Kex stdlib functions layered on the primitive `assert`, so adding another helper does not require compiler or runtime work.","types":[],"urlPath":"test"},{"anchor":"function-assert-equal","kind":"function","line":85,"name":"equal","qualifiedName":"Assert.equal","signatures":["equal(actual, expected)"],"summary":"","types":[],"urlPath":"test"},{"anchor":"function-assert-notequal","kind":"function","line":86,"name":"notEqual","qualifiedName":"Assert.notEqual","signatures":["notEqual(actual, expected)"],"summary":"","types":[],"urlPath":"test"},{"anchor":"function-assert-truthy","kind":"function","line":88,"name":"truthy","qualifiedName":"Assert.truthy","signatures":["truthy(value)"],"summary":"","types":[],"urlPath":"test"},{"anchor":"function-assert-falsy","kind":"function","line":89,"name":"falsy","qualifiedName":"Assert.falsy","signatures":["falsy(value)"],"summary":"","types":[],"urlPath":"test"},{"anchor":"function-assert-some","kind":"function","line":90,"name":"some","qualifiedName":"Assert.some","signatures":["some(value)"],"summary":"","types":[],"urlPath":"test"},{"anchor":"function-assert-none","kind":"function","line":91,"name":"none","qualifiedName":"Assert.none","signatures":["none(value)"],"summary":"","types":[],"urlPath":"test"},{"anchor":"function-assert-ok","kind":"function","line":92,"name":"ok","qualifiedName":"Assert.ok","signatures":["ok(value)"],"summary":"","types":[],"urlPath":"test"},{"anchor":"function-assert-error","kind":"function","line":93,"name":"error","qualifiedName":"Assert.error","signatures":["error(value)"],"summary":"","types":[],"urlPath":"test"},{"anchor":"trait-truthyable","kind":"trait","line":6,"name":"Truthyable","qualifiedName":"Truthyable","signatures":["truthy? : Bool"],"summary":"","types":["Bool"],"urlPath":"truthyable"},{"anchor":"truthyable-truthy?","kind":"function","line":7,"name":"truthy?","qualifiedName":"Truthyable.truthy?","signatures":["truthy? : Bool"],"summary":"","types":["Bool"],"urlPath":"truthyable"},{"anchor":"make-bool","kind":"make","line":11,"name":"Bool","qualifiedName":"Bool","signatures":["truthy? : Bool"],"summary":"","types":[],"urlPath":"truthyable"},{"anchor":"bool-truthy?","kind":"function","line":12,"name":"truthy?","qualifiedName":"Bool.truthy?","signatures":["truthy? : Bool"],"summary":"","types":[],"urlPath":"truthyable"},{"anchor":"make-integer","kind":"make","line":16,"name":"Integer","qualifiedName":"Integer","signatures":["truthy? : Bool"],"summary":"","types":["Bool"],"urlPath":"truthyable"},{"anchor":"integer-truthy?","kind":"function","line":17,"name":"truthy?","qualifiedName":"Integer.truthy?","signatures":["truthy? : Bool"],"summary":"","types":["Bool"],"urlPath":"truthyable"},{"anchor":"make-float","kind":"make","line":21,"name":"Float","qualifiedName":"Float","signatures":["truthy? : Bool"],"summary":"","types":["Bool"],"urlPath":"truthyable"},{"anchor":"float-truthy?","kind":"function","line":22,"name":"truthy?","qualifiedName":"Float.truthy?","signatures":["truthy? : Bool"],"summary":"","types":["Bool"],"urlPath":"truthyable"},{"anchor":"make-string","kind":"make","line":26,"name":"String","qualifiedName":"String","signatures":["truthy? : Bool"],"summary":"","types":["Bool"],"urlPath":"truthyable"},{"anchor":"string-truthy?","kind":"function","line":27,"name":"truthy?","qualifiedName":"String.truthy?","signatures":["truthy? : Bool"],"summary":"","types":["Bool"],"urlPath":"truthyable"},{"anchor":"make-optional","kind":"make","line":31,"name":"Optional<X>","qualifiedName":"Optional<X>","signatures":["truthy? : Bool"],"summary":"","types":["Bool"],"urlPath":"truthyable"},{"anchor":"optional-truthy?","kind":"function","line":32,"name":"truthy?","qualifiedName":"Optional.truthy?","signatures":["truthy? : Bool"],"summary":"","types":["Bool"],"urlPath":"truthyable"},{"anchor":"make-list","kind":"make","line":37,"name":"[X]","qualifiedName":"[X]","signatures":["truthy? : Bool"],"summary":"","types":["Bool"],"urlPath":"truthyable"},{"anchor":"list-truthy?","kind":"function","line":38,"name":"truthy?","qualifiedName":"List.truthy?","signatures":["truthy? : Bool"],"summary":"","types":["Bool"],"urlPath":"truthyable"},{"anchor":"make-map","kind":"make","line":42,"name":"Map<K, V>","qualifiedName":"Map<K, V>","signatures":["truthy? : Bool"],"summary":"","types":["Bool"],"urlPath":"truthyable"},{"anchor":"map-truthy?","kind":"function","line":43,"name":"truthy?","qualifiedName":"Map.truthy?","signatures":["truthy? : Bool"],"summary":"","types":["Bool"],"urlPath":"truthyable"},{"anchor":"record-type","kind":"record","line":17,"name":"Type","qualifiedName":"Type","signatures":[],"summary":"Types as values.\n\n`Type.of(x)` answers what a value IS, as something you can hold, print, compare, and take apart:\n\n```kex\nType.of(42)                     # Type { name: \"Integer\", args: [] }\nType.of([1, 2]).toString        # \"[Integer]\"\nType.of(x) == Type.of(y)        # structural equality, like any record\nType.of(due).fields             # [\"year\", \"month\", \"day\"]\n```\n\nThe answer comes from the compiler where it can: a checked expression knows things a value cannot carry, such as the unused half of a `Result` or the element type of an empty list. Where the checker has no concrete answer — gradual code, `--no-check`, a value arriving from another process — the value itself is asked instead. That fallback is honest but lossy: an empty list has no element to inspect, and a `Result` only ever holds one side.","types":["String","[Type]","Bool"],"urlPath":"type"},{"anchor":"module-type","kind":"module","line":26,"name":"Type","qualifiedName":"Type","signatures":["of(value: Any) -> Type","named(name: String) -> Type","generic(name: String, args: [Type]) -> Type","function(params: [Type], result: Type) -> Type","returnedBy(function: Any) -> Type"],"summary":"","types":["Any","Type","String","[Type]"],"urlPath":"type"},{"anchor":"function-type-of","kind":"function","line":28,"name":"of","qualifiedName":"Type.of","signatures":["of(value: Any) -> Type"],"summary":"What this value is. Prefer this over matching on the record directly.","types":["Any","Type"],"urlPath":"type"},{"anchor":"function-type-named","kind":"function","line":32,"name":"named","qualifiedName":"Type.named","signatures":["named(name: String) -> Type"],"summary":"Builds a type by name, for comparing against something you already know: `Type.of(x) == Type.named(\"Date\")`.","types":["String","Type"],"urlPath":"type"},{"anchor":"function-type-generic","kind":"function","line":38,"name":"generic","qualifiedName":"Type.generic","signatures":["generic(name: String, args: [Type]) -> Type"],"summary":"The same, for a type that takes arguments: `Type.of([1]) == Type.generic(\"List\", [Type.named(\"Integer\")])`. Renamed from `Type.with` when `with` became the capability-substitution keyword (kexhq/kex#143).","types":["String","[Type]","Type"],"urlPath":"type"},{"anchor":"function-type-function","kind":"function","line":42,"name":"function","qualifiedName":"Type.function","signatures":["function(params: [Type], result: Type) -> Type"],"summary":"A function type: parameters followed by the result, the way a signature is written — `Type.function([Type.named(\"String\")], Type.named(\"String\"))`.","types":["[Type]","Type"],"urlPath":"type"},{"anchor":"function-type-returnedby","kind":"function","line":51,"name":"returnedBy","qualifiedName":"Type.returnedBy","signatures":["returnedBy(function: Any) -> Type"],"summary":"The type a named function returns, answered by the compiler:\n\n```kex\nType.returnedBy(Date.parse).toString   # \"Result<Date, TimeError>\"\n```\n\nNamed functions only. A lambda or a function VALUE carries no signature at runtime, and an overloaded name has no single answer — both are compile errors rather than a guess.","types":["Any","Type"],"urlPath":"type"},{"anchor":"make-type","kind":"make","line":61,"name":"Type","qualifiedName":"Type","signatures":["fields : [String]","constructors : [String]","record? : Bool","adt? : Bool","toString : String"],"summary":"Everything else is a METHOD, not a module function: a module function is only reachable through UFCS in the interpreter, so `Type.of(x).fields` worked there and raised on BEAM.","types":[],"urlPath":"type"},{"anchor":"type-fields","kind":"function","line":65,"name":"fields","qualifiedName":"Type.fields","signatures":["fields : [String]"],"summary":"The field names of a record type, in declaration order, or [] for anything else. Reads the layout the compiler already ships to the runtime for display; no separate metadata.","types":[],"urlPath":"type"},{"anchor":"type-constructors","kind":"function","line":68,"name":"constructors","qualifiedName":"Type.constructors","signatures":["constructors : [String]"],"summary":"The constructor names of an ADT, or [] for anything else.","types":[],"urlPath":"type"},{"anchor":"type-record?","kind":"function","line":71,"name":"record?","qualifiedName":"Type.record?","signatures":["record? : Bool"],"summary":"\"does this have fields\" and \"does this have constructors\".","types":[],"urlPath":"type"},{"anchor":"type-adt?","kind":"function","line":72,"name":"adt?","qualifiedName":"Type.adt?","signatures":["adt? : Bool"],"summary":"","types":[],"urlPath":"type"},{"anchor":"type-tostring","kind":"function","line":76,"name":"toString","qualifiedName":"Type.toString","signatures":["toString : String"],"summary":"The type as it is written in SOURCE, not as it is stored: a list is `[Integer]`, a tuple `(Integer, String)`, an optional `String?`.","types":[],"urlPath":"type"},{"anchor":"trait-unit","kind":"trait","line":1,"name":"Unit","qualifiedName":"Unit","signatures":["factor : Float","kind : Atom","symbol : String"],"summary":"","types":["Float","Atom","String"],"urlPath":"units"},{"anchor":"unit-factor","kind":"function","line":2,"name":"factor","qualifiedName":"Unit.factor","signatures":["factor : Float"],"summary":"","types":["Float"],"urlPath":"units"},{"anchor":"unit-kind","kind":"function","line":3,"name":"kind","qualifiedName":"Unit.kind","signatures":["kind : Atom"],"summary":"","types":["Atom"],"urlPath":"units"},{"anchor":"unit-symbol","kind":"function","line":4,"name":"symbol","qualifiedName":"Unit.symbol","signatures":["symbol : String"],"summary":"","types":["String"],"urlPath":"units"},{"anchor":"function-measurekind","kind":"function","line":7,"name":"measureKind","qualifiedName":"measureKind","signatures":["measureKind(measure: Measure) -> Atom"],"summary":"","types":["Measure","Atom"],"urlPath":"units"},{"anchor":"function-measuresymbol","kind":"function","line":8,"name":"measureSymbol","qualifiedName":"measureSymbol","signatures":["measureSymbol(measure: Measure) -> String"],"summary":"","types":["Measure","String"],"urlPath":"units"},{"anchor":"function-measurefactor","kind":"function","line":9,"name":"measureFactor","qualifiedName":"measureFactor","signatures":["measureFactor(measure: Measure) -> Float"],"summary":"","types":["Measure","Float"],"urlPath":"units"},{"anchor":"record-unitdefinition","kind":"record","line":12,"name":"UnitDefinition","qualifiedName":"UnitDefinition","signatures":[],"summary":"Runtime-defined units are used for prefixes and units derived by arithmetic.","types":["Float","Atom","String"],"urlPath":"units"},{"anchor":"make-unitdefinition","kind":"make","line":18,"name":"UnitDefinition","qualifiedName":"UnitDefinition","signatures":[],"summary":"","types":[],"urlPath":"units"},{"anchor":"unitdefinition-factor","kind":"function","line":19,"name":"factor","qualifiedName":"UnitDefinition.factor","signatures":[],"summary":"","types":[],"urlPath":"units"},{"anchor":"unitdefinition-kind","kind":"function","line":20,"name":"kind","qualifiedName":"UnitDefinition.kind","signatures":[],"summary":"","types":[],"urlPath":"units"},{"anchor":"unitdefinition-symbol","kind":"function","line":21,"name":"symbol","qualifiedName":"UnitDefinition.symbol","signatures":[],"summary":"","types":[],"urlPath":"units"},{"anchor":"record-measure","kind":"record","line":26,"name":"Measure","qualifiedName":"Measure","signatures":[],"summary":"A Measure is shared by every unit module. `canonical` stores the value in that dimension's base unit; its Unit controls its display.","types":["Float","UnitDefinition"],"urlPath":"units"},{"anchor":"record-duration","kind":"record","line":34,"name":"Duration","qualifiedName":"Duration","signatures":[],"summary":"Duration is an elapsed span used by Time, Date, and DateTime. A time Measure is deliberately not a Duration: `5.sec` describes a measurement.","types":["Float"],"urlPath":"units"},{"anchor":"type-timeunit","kind":"type","line":38,"name":"TimeUnit","qualifiedName":"TimeUnit","signatures":[],"summary":"","types":[],"urlPath":"units"},{"anchor":"make-timeunit","kind":"make","line":41,"name":"TimeUnit","qualifiedName":"TimeUnit","signatures":["factor(_)","symbol(_)"],"summary":"","types":[],"urlPath":"units"},{"anchor":"timeunit-factor","kind":"function","line":42,"name":"factor","qualifiedName":"TimeUnit.factor","signatures":["factor(_)"],"summary":"","types":[],"urlPath":"units"},{"anchor":"timeunit-kind","kind":"function","line":51,"name":"kind","qualifiedName":"TimeUnit.kind","signatures":[],"summary":"","types":[],"urlPath":"units"},{"anchor":"timeunit-symbol","kind":"function","line":53,"name":"symbol","qualifiedName":"TimeUnit.symbol","signatures":["symbol(_)"],"summary":"","types":[],"urlPath":"units"},{"anchor":"make-integer","kind":"make","line":63,"name":"Integer","qualifiedName":"Integer","signatures":["nanosecond : Measure","microsecond : Measure","millisecond : Measure","sec : Measure","minute : Measure","hour : Measure","day : Measure","week : Measure","timeMeasure(unit: TimeUnit) -> Measure"],"summary":"","types":["TimeUnit","Measure"],"urlPath":"units"},{"anchor":"integer-nanosecond","kind":"function","line":64,"name":"nanosecond","qualifiedName":"Integer.nanosecond","signatures":["nanosecond : Measure"],"summary":"","types":[],"urlPath":"units"},{"anchor":"integer-microsecond","kind":"function","line":65,"name":"microsecond","qualifiedName":"Integer.microsecond","signatures":["microsecond : Measure"],"summary":"","types":[],"urlPath":"units"},{"anchor":"integer-millisecond","kind":"function","line":66,"name":"millisecond","qualifiedName":"Integer.millisecond","signatures":["millisecond : Measure"],"summary":"","types":[],"urlPath":"units"},{"anchor":"integer-sec","kind":"function","line":67,"name":"sec","qualifiedName":"Integer.sec","signatures":["sec : Measure"],"summary":"","types":[],"urlPath":"units"},{"anchor":"integer-minute","kind":"function","line":68,"name":"minute","qualifiedName":"Integer.minute","signatures":["minute : Measure"],"summary":"","types":[],"urlPath":"units"},{"anchor":"integer-hour","kind":"function","line":69,"name":"hour","qualifiedName":"Integer.hour","signatures":["hour : Measure"],"summary":"","types":[],"urlPath":"units"},{"anchor":"integer-day","kind":"function","line":70,"name":"day","qualifiedName":"Integer.day","signatures":["day : Measure"],"summary":"","types":[],"urlPath":"units"},{"anchor":"integer-week","kind":"function","line":71,"name":"week","qualifiedName":"Integer.week","signatures":["week : Measure"],"summary":"","types":[],"urlPath":"units"},{"anchor":"integer-timemeasure","kind":"function","line":74,"name":"timeMeasure","qualifiedName":"Integer.timeMeasure","signatures":["timeMeasure(unit: TimeUnit) -> Measure"],"summary":"","types":["TimeUnit","Measure"],"urlPath":"units"},{"anchor":"make-float","kind":"make","line":89,"name":"Float","qualifiedName":"Float","signatures":["nanosecond : Measure","microsecond : Measure","millisecond : Measure","sec : Measure","minute : Measure","hour : Measure","day : Measure","week : Measure","timeMeasure(unit: TimeUnit) -> Measure"],"summary":"","types":["TimeUnit","Measure"],"urlPath":"units"},{"anchor":"float-nanosecond","kind":"function","line":90,"name":"nanosecond","qualifiedName":"Float.nanosecond","signatures":["nanosecond : Measure"],"summary":"","types":[],"urlPath":"units"},{"anchor":"float-microsecond","kind":"function","line":91,"name":"microsecond","qualifiedName":"Float.microsecond","signatures":["microsecond : Measure"],"summary":"","types":[],"urlPath":"units"},{"anchor":"float-millisecond","kind":"function","line":92,"name":"millisecond","qualifiedName":"Float.millisecond","signatures":["millisecond : Measure"],"summary":"","types":[],"urlPath":"units"},{"anchor":"float-sec","kind":"function","line":93,"name":"sec","qualifiedName":"Float.sec","signatures":["sec : Measure"],"summary":"","types":[],"urlPath":"units"},{"anchor":"float-minute","kind":"function","line":94,"name":"minute","qualifiedName":"Float.minute","signatures":["minute : Measure"],"summary":"","types":[],"urlPath":"units"},{"anchor":"float-hour","kind":"function","line":95,"name":"hour","qualifiedName":"Float.hour","signatures":["hour : Measure"],"summary":"","types":[],"urlPath":"units"},{"anchor":"float-day","kind":"function","line":96,"name":"day","qualifiedName":"Float.day","signatures":["day : Measure"],"summary":"","types":[],"urlPath":"units"},{"anchor":"float-week","kind":"function","line":97,"name":"week","qualifiedName":"Float.week","signatures":["week : Measure"],"summary":"","types":[],"urlPath":"units"},{"anchor":"float-timemeasure","kind":"function","line":100,"name":"timeMeasure","qualifiedName":"Float.timeMeasure","signatures":["timeMeasure(unit: TimeUnit) -> Measure"],"summary":"","types":["TimeUnit","Measure"],"urlPath":"units"},{"anchor":"make-measure","kind":"make","line":112,"name":"Measure","qualifiedName":"Measure","signatures":["factor : Float","kind : Atom","symbol : String","to(_) -> String","scale(multiplier: Number) -> Measure","^(exponent: Number) -> Measure","convertTo(unit: Unit) -> Result<Measure, String>","convert(unit: TimeUnit) -> Result<Measure, String>","+(other: Measure) -> Result<Measure, String>","-(other: Measure) -> Result<Measure, String>"],"summary":"","types":["String","Number","Measure","Unit","Result<Measure, String>","TimeUnit"],"urlPath":"units"},{"anchor":"measure-factor","kind":"function","line":113,"name":"factor","qualifiedName":"Measure.factor","signatures":["factor : Float"],"summary":"","types":[],"urlPath":"units"},{"anchor":"measure-kind","kind":"function","line":114,"name":"kind","qualifiedName":"Measure.kind","signatures":["kind : Atom"],"summary":"","types":[],"urlPath":"units"},{"anchor":"measure-symbol","kind":"function","line":115,"name":"symbol","qualifiedName":"Measure.symbol","signatures":["symbol : String"],"summary":"","types":[],"urlPath":"units"},{"anchor":"measure-to","kind":"function","line":116,"name":"to","qualifiedName":"Measure.to","signatures":["to(_) -> String"],"summary":"","types":["String"],"urlPath":"units"},{"anchor":"measure-scale","kind":"function","line":123,"name":"scale","qualifiedName":"Measure.scale","signatures":["scale(multiplier: Number) -> Measure"],"summary":"Formatting into a target display unit deliberately has NO prelude clause. A unit module (Units.SI, Units.Data, ...) supplies `to(String, in:)` for the units it owns, and reaching one requires importing it. A catch-all here would answer `None` for an un-imported module instead — a silently empty Optional in place of \"you need `using Units.SI`\".","types":["Number","Measure"],"urlPath":"units"},{"anchor":"measure-op-xor","kind":"function","line":136,"name":"^","qualifiedName":"Measure.^","signatures":["^(exponent: Number) -> Measure"],"summary":"Raising a measure preserves its display unit while applying the power to its canonical value, display value, and conversion factor. The current Unit trait represents a dimension as one Atom, so the dimension remains the base kind; the notation records the derived unit (for example `s^2`).","types":["Number","Measure"],"urlPath":"units"},{"anchor":"measure-convertto","kind":"function","line":150,"name":"convertTo","qualifiedName":"Measure.convertTo","signatures":["convertTo(unit: Unit) -> Result<Measure, String>"],"summary":"Convert through the Unit trait so units from opt-in modules (SI, Data, and future domains) remain interchangeable with prelude time units.","types":["Unit","Result<Measure, String>"],"urlPath":"units"},{"anchor":"measure-convert","kind":"function","line":167,"name":"convert","qualifiedName":"Measure.convert","signatures":["convert(unit: TimeUnit) -> Result<Measure, String>"],"summary":"Short time-unit spelling retained for prelude time measures.","types":["TimeUnit","Result<Measure, String>"],"urlPath":"units"},{"anchor":"measure-op-plus","kind":"function","line":171,"name":"+","qualifiedName":"Measure.+","signatures":["+(other: Measure) -> Result<Measure, String>"],"summary":"","types":["Measure","Result<Measure, String>"],"urlPath":"units"},{"anchor":"measure-op-minus","kind":"function","line":185,"name":"-","qualifiedName":"Measure.-","signatures":["-(other: Measure) -> Result<Measure, String>"],"summary":"","types":["Measure","Result<Measure, String>"],"urlPath":"units"},{"anchor":"module-units","kind":"module","line":207,"name":"Units","qualifiedName":"Units","signatures":[],"summary":"The time units are prelude-global, because every unit module measures against the same dimensions — `Units.SI` defines `Watt * Hour` with the `Hour` declared above, and future domains do the same. That makes `Hour` correct but not obviously located, so the same constructors are reachable under `Units` too, for call sites that would rather name where a unit comes from. These are aliases, not copies: each binds the identical constructor, so `Units.Hour` and `Hour` match the same patterns and compare equal.","types":[""],"urlPath":"units"},{"anchor":"constant-units-nanosecond","kind":"constant","line":208,"name":"Nanosecond","qualifiedName":"Units.Nanosecond","signatures":[],"summary":"","types":[""],"urlPath":"units"},{"anchor":"constant-units-microsecond","kind":"constant","line":209,"name":"Microsecond","qualifiedName":"Units.Microsecond","signatures":[],"summary":"","types":[""],"urlPath":"units"},{"anchor":"constant-units-millisecond","kind":"constant","line":210,"name":"Millisecond","qualifiedName":"Units.Millisecond","signatures":[],"summary":"","types":[""],"urlPath":"units"},{"anchor":"constant-units-second","kind":"constant","line":211,"name":"Second","qualifiedName":"Units.Second","signatures":[],"summary":"","types":[""],"urlPath":"units"},{"anchor":"constant-units-minute","kind":"constant","line":212,"name":"Minute","qualifiedName":"Units.Minute","signatures":[],"summary":"","types":[""],"urlPath":"units"},{"anchor":"constant-units-hour","kind":"constant","line":213,"name":"Hour","qualifiedName":"Units.Hour","signatures":[],"summary":"","types":[""],"urlPath":"units"},{"anchor":"constant-units-day","kind":"constant","line":214,"name":"Day","qualifiedName":"Units.Day","signatures":[],"summary":"","types":[""],"urlPath":"units"},{"anchor":"constant-units-week","kind":"constant","line":215,"name":"Week","qualifiedName":"Units.Week","signatures":[],"summary":"","types":[""],"urlPath":"units"},{"anchor":"module-web","kind":"module","line":5,"name":"Web","qualifiedName":"Web","signatures":["text(body: String) -> Response","textWithStatus(body: String, status: Integer) -> Response","html(body: String) -> Response","json(body: String) -> Response","redirect(location: String) -> Response","mount(path: String, handler: Handler) -> Server","get(path: String, handler: Handler) -> Server","post(path: String, handler: Handler) -> Server","put(path: String, handler: Handler) -> Server","patch(path: String, handler: Handler) -> Server","delete(path: String, handler: Handler) -> Server","start : Result<Void, String>","build(port: Integer) -> Server"],"summary":"","types":["String","Map<String, String>","Integer","Response","Handler","[Route]","Server","Result<Void, String>"],"urlPath":"webserver"},{"anchor":"record-web-request","kind":"record","line":6,"name":"Request","qualifiedName":"Web.Request","signatures":[],"summary":"","types":["String","Map<String, String>"],"urlPath":"webserver"},{"anchor":"record-web-response","kind":"record","line":15,"name":"Response","qualifiedName":"Web.Response","signatures":[],"summary":"","types":["Integer","Map<String, String>","String"],"urlPath":"webserver"},{"anchor":"module-web-response","kind":"module","line":21,"name":"Web.Response","qualifiedName":"Web.Response","signatures":["text(body: String) -> Response","textWithStatus(body: String, status: Integer) -> Response","html(body: String) -> Response","json(body: String) -> Response","redirect(location: String) -> Response"],"summary":"","types":["String","Response","Integer"],"urlPath":"webserver"},{"anchor":"function-web-response-text","kind":"function","line":22,"name":"text","qualifiedName":"Web.Response.text","signatures":["text(body: String) -> Response"],"summary":"","types":["String","Response"],"urlPath":"webserver"},{"anchor":"function-web-response-textwithstatus","kind":"function","line":30,"name":"textWithStatus","qualifiedName":"Web.Response.textWithStatus","signatures":["textWithStatus(body: String, status: Integer) -> Response"],"summary":"","types":["String","Integer","Response"],"urlPath":"webserver"},{"anchor":"function-web-response-html","kind":"function","line":38,"name":"html","qualifiedName":"Web.Response.html","signatures":["html(body: String) -> Response"],"summary":"","types":["String","Response"],"urlPath":"webserver"},{"anchor":"function-web-response-json","kind":"function","line":46,"name":"json","qualifiedName":"Web.Response.json","signatures":["json(body: String) -> Response"],"summary":"","types":["String","Response"],"urlPath":"webserver"},{"anchor":"function-web-response-redirect","kind":"function","line":54,"name":"redirect","qualifiedName":"Web.Response.redirect","signatures":["redirect(location: String) -> Response"],"summary":"","types":["String","Response"],"urlPath":"webserver"},{"anchor":"constant-web-response-notfound","kind":"constant","line":62,"name":"notFound","qualifiedName":"Web.Response.notFound","signatures":[],"summary":"","types":["Response"],"urlPath":"webserver"},{"anchor":"type-web-handler","kind":"type","line":71,"name":"Handler","qualifiedName":"Web.Handler","signatures":[],"summary":"","types":[],"urlPath":"webserver"},{"anchor":"record-web-route","kind":"record","line":73,"name":"Route","qualifiedName":"Web.Route","signatures":[],"summary":"","types":["String","Handler"],"urlPath":"webserver"},{"anchor":"record-web-server","kind":"record","line":79,"name":"Server","qualifiedName":"Web.Server","signatures":[],"summary":"","types":["Integer","[Route]"],"urlPath":"webserver"},{"anchor":"make-web-server","kind":"make","line":90,"name":"Web.Server","qualifiedName":"Web.Server","signatures":["mount(path: String, handler: Handler) -> Server","get(path: String, handler: Handler) -> Server","post(path: String, handler: Handler) -> Server","put(path: String, handler: Handler) -> Server","patch(path: String, handler: Handler) -> Server","delete(path: String, handler: Handler) -> Server","start : Result<Void, String>"],"summary":"","types":["String","Handler","Server","Result<Void, String>"],"urlPath":"webserver"},{"anchor":"web-server-mount","kind":"function","line":91,"name":"mount","qualifiedName":"Web.Server.mount","signatures":["mount(path: String, handler: Handler) -> Server"],"summary":"","types":["String","Handler","Server"],"urlPath":"webserver"},{"anchor":"web-server-get","kind":"function","line":96,"name":"get","qualifiedName":"Web.Server.get","signatures":["get(path: String, handler: Handler) -> Server"],"summary":"","types":["String","Handler","Server"],"urlPath":"webserver"},{"anchor":"web-server-post","kind":"function","line":101,"name":"post","qualifiedName":"Web.Server.post","signatures":["post(path: String, handler: Handler) -> Server"],"summary":"","types":["String","Handler","Server"],"urlPath":"webserver"},{"anchor":"web-server-put","kind":"function","line":106,"name":"put","qualifiedName":"Web.Server.put","signatures":["put(path: String, handler: Handler) -> Server"],"summary":"","types":["String","Handler","Server"],"urlPath":"webserver"},{"anchor":"web-server-patch","kind":"function","line":111,"name":"patch","qualifiedName":"Web.Server.patch","signatures":["patch(path: String, handler: Handler) -> Server"],"summary":"","types":["String","Handler","Server"],"urlPath":"webserver"},{"anchor":"web-server-delete","kind":"function","line":116,"name":"delete","qualifiedName":"Web.Server.delete","signatures":["delete(path: String, handler: Handler) -> Server"],"summary":"","types":["String","Handler","Server"],"urlPath":"webserver"},{"anchor":"web-server-start","kind":"function","line":121,"name":"start","qualifiedName":"Web.Server.start","signatures":["start : Result<Void, String>"],"summary":"","types":["Result<Void, String>"],"urlPath":"webserver"},{"anchor":"module-web-server","kind":"module","line":126,"name":"Web.Server","qualifiedName":"Web.Server","signatures":["build(port: Integer) -> Server"],"summary":"","types":["Integer","Server"],"urlPath":"webserver"},{"anchor":"function-web-server-build","kind":"function","line":127,"name":"build","qualifiedName":"Web.Server.build","signatures":["build(port: Integer) -> Server"],"summary":"","types":["Integer","Server"],"urlPath":"webserver"},{"anchor":"module-kex-ast","kind":"module","line":7,"name":"Kex.AST","qualifiedName":"Kex.AST","signatures":["parse(source: String) -> Result<Program, ParseError>","parse(source: String, filename: String) -> Result<Program, ParseError>","parseFile(path: FS.FilePath) -> Result<Program, ParseError>","parseType(source: String) -> Result<TypeRef, ParseError>","parseExpression(source: String) -> Result<Expression, ParseError>","typeRefText(_) -> String","patternRefText(_) -> String","patternFieldText(name, _, _) -> String","referenceText(_) -> String","to(_) -> String?"],"summary":"Parses Kex source code into a structured AST at runtime.\n\nReturns `Result<Program, ParseError>` — the AST includes module definitions, function signatures, type/record definitions, traits, make blocks, and doc-comments extracted from `#` lines.","types":["String","Integer","[Node]","Location?","Result<Program, ParseError>","(String) -> Result<Program, ParseError>","FS.FilePath","Result<TypeRef, ParseError>","Result<Expression, ParseError>","[TypeRef]","TypeRef","[(String, TypeRef)]","Expression","[PatternRef]","PatternRef?","String?","[PatternField]","PatternRef","Bool","Int","Float","[String]","[Expression]","[NamedArgument]","Expression?","TypeRef?","[ElseIf]","[Expression]?","[MatchArm]","[MapItem]","[RecordField]","[LambdaParam]","RescueInfo?","[[Expression]]","GeneratedTemplate","RescueInfo","Node","GeneratedMakeInfo","[CompiledItem]","Location","[ParamInfo]","[ClauseInfo]","[VariantInfo]?","[FieldInfo]","ModuleInfo","FunctionInfo","AnnotationInfo","TypeInfo","RecordInfo","TraitInfo","MakeInfo","PragmaInfo","ConstantInfo","MainInfo","VisibilityInfo","UsingInfo","ExportInfo","CompiledInfo"],"urlPath":"kex/ast"},{"anchor":"record-kex-ast-location","kind":"record","line":8,"name":"Location","qualifiedName":"Kex.AST.Location","signatures":[],"summary":"","types":["String","Integer"],"urlPath":"kex/ast"},{"anchor":"record-kex-ast-program","kind":"record","line":16,"name":"Program","qualifiedName":"Kex.AST.Program","signatures":[],"summary":"","types":["Integer","[Node]"],"urlPath":"kex/ast"},{"anchor":"record-kex-ast-parseerror","kind":"record","line":21,"name":"ParseError","qualifiedName":"Kex.AST.ParseError","signatures":[],"summary":"","types":["String","Location?"],"urlPath":"kex/ast"},{"anchor":"function-kex-ast-parse","kind":"function","line":27,"name":"parse","qualifiedName":"Kex.AST.parse","signatures":["parse(source: String) -> Result<Program, ParseError>","parse(source: String, filename: String) -> Result<Program, ParseError>"],"summary":"Parses a Kex source string into a structured AST.","types":["String","Result<Program, ParseError>","(String) -> Result<Program, ParseError>"],"urlPath":"kex/ast"},{"anchor":"function-kex-ast-parsefile","kind":"function","line":33,"name":"parseFile","qualifiedName":"Kex.AST.parseFile","signatures":["parseFile(path: FS.FilePath) -> Result<Program, ParseError>"],"summary":"Reads a file and parses it.","types":["FS.FilePath","Result<Program, ParseError>"],"urlPath":"kex/ast"},{"anchor":"function-kex-ast-parsetype","kind":"function","line":37,"name":"parseType","qualifiedName":"Kex.AST.parseType","signatures":["parseType(source: String) -> Result<TypeRef, ParseError>"],"summary":"Parses a type expression string into a TypeRef.","types":["String","Result<TypeRef, ParseError>"],"urlPath":"kex/ast"},{"anchor":"function-kex-ast-parseexpression","kind":"function","line":41,"name":"parseExpression","qualifiedName":"Kex.AST.parseExpression","signatures":["parseExpression(source: String) -> Result<Expression, ParseError>"],"summary":"Parses a single expression string into an Expression AST node.","types":["String","Result<Expression, ParseError>"],"urlPath":"kex/ast"},{"anchor":"type-kex-ast-typeref","kind":"type","line":45,"name":"TypeRef","qualifiedName":"Kex.AST.TypeRef","signatures":[],"summary":"Structured representation of type expressions.","types":["String","[TypeRef]","[TypeRef]","TypeRef","[TypeRef]","TypeRef","TypeRef","TypeRef","[TypeRef]","[TypeRef]","[(String, TypeRef)]","TypeRef","TypeRef","String","String","Expression","String"],"urlPath":"kex/ast"},{"anchor":"function-kex-ast-typereftext","kind":"function","line":62,"name":"typeRefText","qualifiedName":"Kex.AST.typeRefText","signatures":["typeRefText(_) -> String"],"summary":"","types":["String"],"urlPath":"kex/ast"},{"anchor":"type-kex-ast-patternref","kind":"type","line":80,"name":"PatternRef","qualifiedName":"Kex.AST.PatternRef","signatures":[],"summary":"Structured representation of patterns.","types":["String","String","String","[PatternRef]","[PatternRef]","[PatternRef]","PatternRef?","String?","[PatternField]","PatternRef","PatternRef","PatternRef"],"urlPath":"kex/ast"},{"anchor":"record-kex-ast-patternfield","kind":"record","line":91,"name":"PatternField","qualifiedName":"Kex.AST.PatternField","signatures":[],"summary":"","types":["String","PatternRef?","Bool"],"urlPath":"kex/ast"},{"anchor":"function-kex-ast-patternreftext","kind":"function","line":97,"name":"patternRefText","qualifiedName":"Kex.AST.patternRefText","signatures":["patternRefText(_) -> String"],"summary":"","types":["String"],"urlPath":"kex/ast"},{"anchor":"function-kex-ast-patternfieldtext","kind":"function","line":110,"name":"patternFieldText","qualifiedName":"Kex.AST.patternFieldText","signatures":["patternFieldText(name, _, _) -> String"],"summary":"","types":["String"],"urlPath":"kex/ast"},{"anchor":"function-kex-ast-referencetext","kind":"function","line":116,"name":"referenceText","qualifiedName":"Kex.AST.referenceText","signatures":["referenceText(_) -> String"],"summary":"","types":["String"],"urlPath":"kex/ast"},{"anchor":"type-kex-ast-expression","kind":"type","line":140,"name":"Expression","qualifiedName":"Kex.AST.Expression","signatures":[],"summary":"Structured representation of expression AST nodes.","types":["Int","Float","Int","String","[String]","[Expression]","Bool","String","String","Expression","String","Expression","String","Expression","Expression","[Expression]","[NamedArgument]","Expression?","String","[String]","[Expression]","Expression","String","[Expression]","[NamedArgument]","Expression?","Bool","Bool","TypeRef?","Expression","PatternRef?","[Expression]","[ElseIf]","[Expression]?","Expression","String?","[MatchArm]","String?","[MatchArm]","Expression?","Expression?","[Expression]","Expression?","[MapItem]","String","[RecordField]","[Expression]","[Expression]","[LambdaParam]","[Expression]","TypeRef?","RescueInfo?","PatternRef","TypeRef?","Expression","String","TypeRef?","Expression","String","Expression","Expression","[Expression]","Expression","Expression","Expression","Expression","Expression","Expression","Expression","String","[Expression]","Bool","String","String?","Bool","[[Expression]]","String","String?","[String]","[String]","[Expression]","String","Expression","[Expression]","Expression","GeneratedTemplate","String","[Expression]","RescueInfo","Expression","[Expression]","[String]","[Expression]","Expression","Expression"],"urlPath":"kex/ast"},{"anchor":"record-kex-ast-namedargument","kind":"record","line":188,"name":"NamedArgument","qualifiedName":"Kex.AST.NamedArgument","signatures":[],"summary":"","types":["String","Expression"],"urlPath":"kex/ast"},{"anchor":"record-kex-ast-matcharm","kind":"record","line":193,"name":"MatchArm","qualifiedName":"Kex.AST.MatchArm","signatures":[],"summary":"","types":["[PatternRef]","Expression?","Expression"],"urlPath":"kex/ast"},{"anchor":"record-kex-ast-lambdaparam","kind":"record","line":199,"name":"LambdaParam","qualifiedName":"Kex.AST.LambdaParam","signatures":[],"summary":"","types":["String","TypeRef?"],"urlPath":"kex/ast"},{"anchor":"record-kex-ast-rescueinfo","kind":"record","line":204,"name":"RescueInfo","qualifiedName":"Kex.AST.RescueInfo","signatures":[],"summary":"","types":["[MatchArm]","String?","[Expression]","Expression?"],"urlPath":"kex/ast"},{"anchor":"record-kex-ast-elseif","kind":"record","line":211,"name":"ElseIf","qualifiedName":"Kex.AST.ElseIf","signatures":[],"summary":"","types":["Expression","[Expression]"],"urlPath":"kex/ast"},{"anchor":"type-kex-ast-mapitem","kind":"type","line":216,"name":"MapItem","qualifiedName":"Kex.AST.MapItem","signatures":[],"summary":"","types":["Expression","Expression","Expression"],"urlPath":"kex/ast"},{"anchor":"record-kex-ast-recordfield","kind":"record","line":220,"name":"RecordField","qualifiedName":"Kex.AST.RecordField","signatures":[],"summary":"","types":["String","Expression"],"urlPath":"kex/ast"},{"anchor":"type-kex-ast-generatedtemplate","kind":"type","line":227,"name":"GeneratedTemplate","qualifiedName":"Kex.AST.GeneratedTemplate","signatures":[],"summary":"A declaration template whose name (and, for a make block, target) is computed by a `compiled do` expression.","types":["Node","GeneratedMakeInfo"],"urlPath":"kex/ast"},{"anchor":"record-kex-ast-generatedmakeinfo","kind":"record","line":231,"name":"GeneratedMakeInfo","qualifiedName":"Kex.AST.GeneratedMakeInfo","signatures":[],"summary":"","types":["Bool","[TypeRef]","[CompiledItem]","Location"],"urlPath":"kex/ast"},{"anchor":"record-kex-ast-maininfo","kind":"record","line":238,"name":"MainInfo","qualifiedName":"Kex.AST.MainInfo","signatures":[],"summary":"","types":["String?","[ParamInfo]","[Expression]","RescueInfo?","Location"],"urlPath":"kex/ast"},{"anchor":"record-kex-ast-paraminfo","kind":"record","line":246,"name":"ParamInfo","qualifiedName":"Kex.AST.ParamInfo","signatures":[],"summary":"","types":["String?","PatternRef?","TypeRef?","Bool"],"urlPath":"kex/ast"},{"anchor":"record-kex-ast-clauseinfo","kind":"record","line":253,"name":"ClauseInfo","qualifiedName":"Kex.AST.ClauseInfo","signatures":[],"summary":"","types":["[ParamInfo]","[Expression]","TypeRef?","RescueInfo?","Bool"],"urlPath":"kex/ast"},{"anchor":"record-kex-ast-functioninfo","kind":"record","line":261,"name":"FunctionInfo","qualifiedName":"Kex.AST.FunctionInfo","signatures":[],"summary":"","types":["String","String?","Bool","[ClauseInfo]","Location"],"urlPath":"kex/ast"},{"anchor":"record-kex-ast-annotationinfo","kind":"record","line":270,"name":"AnnotationInfo","qualifiedName":"Kex.AST.AnnotationInfo","signatures":[],"summary":"","types":["String","TypeRef","String?","Bool","Location"],"urlPath":"kex/ast"},{"anchor":"record-kex-ast-variantinfo","kind":"record","line":278,"name":"VariantInfo","qualifiedName":"Kex.AST.VariantInfo","signatures":[],"summary":"","types":["String","[TypeRef]"],"urlPath":"kex/ast"},{"anchor":"record-kex-ast-typeinfo","kind":"record","line":283,"name":"TypeInfo","qualifiedName":"Kex.AST.TypeInfo","signatures":[],"summary":"","types":["String","String?","[String]","[TypeRef]","[VariantInfo]?","Location"],"urlPath":"kex/ast"},{"anchor":"record-kex-ast-fieldinfo","kind":"record","line":292,"name":"FieldInfo","qualifiedName":"Kex.AST.FieldInfo","signatures":[],"summary":"","types":["String","TypeRef","Bool"],"urlPath":"kex/ast"},{"anchor":"record-kex-ast-recordinfo","kind":"record","line":298,"name":"RecordInfo","qualifiedName":"Kex.AST.RecordInfo","signatures":[],"summary":"","types":["String","String?","[String]","[FieldInfo]","Location"],"urlPath":"kex/ast"},{"anchor":"record-kex-ast-traitinfo","kind":"record","line":306,"name":"TraitInfo","qualifiedName":"Kex.AST.TraitInfo","signatures":[],"summary":"","types":["String","String?","[String]","[Node]","Location"],"urlPath":"kex/ast"},{"anchor":"record-kex-ast-makeinfo","kind":"record","line":314,"name":"MakeInfo","qualifiedName":"Kex.AST.MakeInfo","signatures":[],"summary":"","types":["TypeRef","Bool","[TypeRef]","[Node]","Location"],"urlPath":"kex/ast"},{"anchor":"record-kex-ast-pragmainfo","kind":"record","line":322,"name":"PragmaInfo","qualifiedName":"Kex.AST.PragmaInfo","signatures":[],"summary":"","types":["String","String?","Location"],"urlPath":"kex/ast"},{"anchor":"record-kex-ast-moduleinfo","kind":"record","line":328,"name":"ModuleInfo","qualifiedName":"Kex.AST.ModuleInfo","signatures":[],"summary":"","types":["String","String?","[Node]","Location"],"urlPath":"kex/ast"},{"anchor":"record-kex-ast-constantinfo","kind":"record","line":335,"name":"ConstantInfo","qualifiedName":"Kex.AST.ConstantInfo","signatures":[],"summary":"","types":["String","String?","TypeRef?","Location"],"urlPath":"kex/ast"},{"anchor":"record-kex-ast-visibilityinfo","kind":"record","line":342,"name":"VisibilityInfo","qualifiedName":"Kex.AST.VisibilityInfo","signatures":[],"summary":"","types":["Bool","[Node]","Location"],"urlPath":"kex/ast"},{"anchor":"record-kex-ast-usinginfo","kind":"record","line":348,"name":"UsingInfo","qualifiedName":"Kex.AST.UsingInfo","signatures":[],"summary":"","types":["String","String?","[String]","[Expression]","Location"],"urlPath":"kex/ast"},{"anchor":"record-kex-ast-exportinfo","kind":"record","line":357,"name":"ExportInfo","qualifiedName":"Kex.AST.ExportInfo","signatures":[],"summary":"","types":["String","String?","[String]","Location"],"urlPath":"kex/ast"},{"anchor":"type-kex-ast-compileditem","kind":"type","line":365,"name":"CompiledItem","qualifiedName":"Kex.AST.CompiledItem","signatures":[],"summary":"","types":["Node","Expression"],"urlPath":"kex/ast"},{"anchor":"record-kex-ast-compiledinfo","kind":"record","line":369,"name":"CompiledInfo","qualifiedName":"Kex.AST.CompiledInfo","signatures":[],"summary":"","types":["[CompiledItem]","Location"],"urlPath":"kex/ast"},{"anchor":"type-kex-ast-node","kind":"type","line":374,"name":"Node","qualifiedName":"Kex.AST.Node","signatures":[],"summary":"","types":["ModuleInfo","FunctionInfo","AnnotationInfo","TypeInfo","RecordInfo","TraitInfo","MakeInfo","PragmaInfo","ConstantInfo","MainInfo","VisibilityInfo","UsingInfo","ExportInfo","CompiledInfo"],"urlPath":"kex/ast"},{"anchor":"make-typeref-patternref","kind":"make","line":391,"name":"TypeRef | PatternRef","qualifiedName":"TypeRef | PatternRef","signatures":["to(_) -> String?"],"summary":"Source-like conversion through the standard `.to(String)` spelling.","types":["String?"],"urlPath":"kex/ast"},{"anchor":"typeref-patternref-to","kind":"function","line":392,"name":"to","qualifiedName":"TypeRef | PatternRef.to","signatures":["to(_) -> String?"],"summary":"","types":["String?"],"urlPath":"kex/ast"},{"anchor":"module-units-data","kind":"module","line":1,"name":"Units.Data","qualifiedName":"Units.Data","signatures":["factor(_)","symbol(_)","factor : Float","kind : Atom","symbol : String","size(value: Number, unit: DataUnit) -> Measure","convertTo(measure: Measure, unit: DataUnit) -> Result<Measure, String>","to(measure: Measure, _, in: DataPrefix) -> String?","byteSize(value: Number) -> Measure","kilobytes(value: Number) -> Measure","megabytes(value: Number) -> Measure","gigabytes(value: Number) -> Measure","terabytes(value: Number) -> Measure","kibibytes(value: Number) -> Measure","mebibytes(value: Number) -> Measure","gibibytes(value: Number) -> Measure","tebibytes(value: Number) -> Measure"],"summary":"","types":["Number","DataUnit","Measure","Result<Measure, String>","DataPrefix","String?"],"urlPath":"units/data"},{"anchor":"type-units-data-dataunit","kind":"type","line":3,"name":"DataUnit","qualifiedName":"Units.Data.DataUnit","signatures":[],"summary":"","types":[],"urlPath":"units/data"},{"anchor":"type-units-data-dataprefix","kind":"type","line":4,"name":"DataPrefix","qualifiedName":"Units.Data.DataPrefix","signatures":[],"summary":"","types":[],"urlPath":"units/data"},{"anchor":"make-dataunit","kind":"make","line":6,"name":"DataUnit","qualifiedName":"DataUnit","signatures":["factor(_)","symbol(_)"],"summary":"","types":[],"urlPath":"units/data"},{"anchor":"dataunit-factor","kind":"function","line":7,"name":"factor","qualifiedName":"DataUnit.factor","signatures":["factor(_)"],"summary":"","types":[],"urlPath":"units/data"},{"anchor":"dataunit-kind","kind":"function","line":17,"name":"kind","qualifiedName":"DataUnit.kind","signatures":[],"summary":"","types":[],"urlPath":"units/data"},{"anchor":"dataunit-symbol","kind":"function","line":19,"name":"symbol","qualifiedName":"DataUnit.symbol","signatures":["symbol(_)"],"summary":"","types":[],"urlPath":"units/data"},{"anchor":"make-unitdefinition","kind":"make","line":30,"name":"UnitDefinition","qualifiedName":"UnitDefinition","signatures":[],"summary":"","types":[],"urlPath":"units/data"},{"anchor":"unitdefinition-factor","kind":"function","line":31,"name":"factor","qualifiedName":"UnitDefinition.factor","signatures":[],"summary":"","types":[],"urlPath":"units/data"},{"anchor":"unitdefinition-kind","kind":"function","line":32,"name":"kind","qualifiedName":"UnitDefinition.kind","signatures":[],"summary":"","types":[],"urlPath":"units/data"},{"anchor":"unitdefinition-symbol","kind":"function","line":33,"name":"symbol","qualifiedName":"UnitDefinition.symbol","signatures":[],"summary":"","types":[],"urlPath":"units/data"},{"anchor":"make-measure","kind":"make","line":36,"name":"Measure","qualifiedName":"Measure","signatures":["factor : Float","kind : Atom","symbol : String"],"summary":"","types":[],"urlPath":"units/data"},{"anchor":"measure-factor","kind":"function","line":37,"name":"factor","qualifiedName":"Measure.factor","signatures":["factor : Float"],"summary":"","types":[],"urlPath":"units/data"},{"anchor":"measure-kind","kind":"function","line":38,"name":"kind","qualifiedName":"Measure.kind","signatures":["kind : Atom"],"summary":"","types":[],"urlPath":"units/data"},{"anchor":"measure-symbol","kind":"function","line":39,"name":"symbol","qualifiedName":"Measure.symbol","signatures":["symbol : String"],"summary":"","types":[],"urlPath":"units/data"},{"anchor":"function-units-data-size","kind":"function","line":42,"name":"size","qualifiedName":"Units.Data.size","signatures":["size(value: Number, unit: DataUnit) -> Measure"],"summary":"","types":["Number","DataUnit","Measure"],"urlPath":"units/data"},{"anchor":"function-units-data-convertto","kind":"function","line":51,"name":"convertTo","qualifiedName":"Units.Data.convertTo","signatures":["convertTo(measure: Measure, unit: DataUnit) -> Result<Measure, String>"],"summary":"","types":["Measure","DataUnit","Result<Measure, String>"],"urlPath":"units/data"},{"anchor":"function-units-data-to","kind":"function","line":66,"name":"to","qualifiedName":"Units.Data.to","signatures":["to(measure: Measure, _, in: DataPrefix) -> String?"],"summary":"Data prefixes select their standard decimal byte unit.  They are targets for formatting, so `Mega` means MB rather than a prefix applied twice to the measure's existing unit.","types":["Measure","DataPrefix","String?"],"urlPath":"units/data"},{"anchor":"function-units-data-bytesize","kind":"function","line":80,"name":"byteSize","qualifiedName":"Units.Data.byteSize","signatures":["byteSize(value: Number) -> Measure"],"summary":"","types":["Number","Measure"],"urlPath":"units/data"},{"anchor":"function-units-data-kilobytes","kind":"function","line":81,"name":"kilobytes","qualifiedName":"Units.Data.kilobytes","signatures":["kilobytes(value: Number) -> Measure"],"summary":"","types":["Number","Measure"],"urlPath":"units/data"},{"anchor":"function-units-data-megabytes","kind":"function","line":82,"name":"megabytes","qualifiedName":"Units.Data.megabytes","signatures":["megabytes(value: Number) -> Measure"],"summary":"","types":["Number","Measure"],"urlPath":"units/data"},{"anchor":"function-units-data-gigabytes","kind":"function","line":83,"name":"gigabytes","qualifiedName":"Units.Data.gigabytes","signatures":["gigabytes(value: Number) -> Measure"],"summary":"","types":["Number","Measure"],"urlPath":"units/data"},{"anchor":"function-units-data-terabytes","kind":"function","line":84,"name":"terabytes","qualifiedName":"Units.Data.terabytes","signatures":["terabytes(value: Number) -> Measure"],"summary":"","types":["Number","Measure"],"urlPath":"units/data"},{"anchor":"function-units-data-kibibytes","kind":"function","line":85,"name":"kibibytes","qualifiedName":"Units.Data.kibibytes","signatures":["kibibytes(value: Number) -> Measure"],"summary":"","types":["Number","Measure"],"urlPath":"units/data"},{"anchor":"function-units-data-mebibytes","kind":"function","line":86,"name":"mebibytes","qualifiedName":"Units.Data.mebibytes","signatures":["mebibytes(value: Number) -> Measure"],"summary":"","types":["Number","Measure"],"urlPath":"units/data"},{"anchor":"function-units-data-gibibytes","kind":"function","line":87,"name":"gibibytes","qualifiedName":"Units.Data.gibibytes","signatures":["gibibytes(value: Number) -> Measure"],"summary":"","types":["Number","Measure"],"urlPath":"units/data"},{"anchor":"function-units-data-tebibytes","kind":"function","line":88,"name":"tebibytes","qualifiedName":"Units.Data.tebibytes","signatures":["tebibytes(value: Number) -> Measure"],"summary":"","types":["Number","Measure"],"urlPath":"units/data"},{"anchor":"module-units-si","kind":"module","line":1,"name":"Units.SI","qualifiedName":"Units.SI","signatures":["factor(_)","kind(_)","symbol(_)","kind(_)","symbol(_)","*(_, _) -> UnitDefinition","factor : Float","kind : Atom","symbol : String","kilo : Measure","*(other: Measure) -> Measure","/(other: Measure) -> Measure","product(other) -> Measure","quotient(other) -> Measure","productKind(left, _)","quotientKind(left, _)","productSymbol(_, left, right)","quotientSymbol(_, left, right)","meter(value: Number) -> Measure","gram(value: Number) -> Measure","kilogram(value: Number) -> Measure","kelvin(value: Number) -> Measure","liter(value: Number) -> Measure","newton(value: Number) -> Measure","joule(value: Number) -> Measure","watt(value: Number) -> Measure","volt(value: Number) -> Measure","ampere(value: Number) -> Measure","ohm(value: Number) -> Measure","coulomb(value: Number) -> Measure","to(measure: Measure, _, in: SIPrefix) -> String","mega(measure: Measure) -> Measure","giga(measure: Measure) -> Measure","milli(measure: Measure) -> Measure","micro(measure: Measure) -> Measure","nano(measure: Measure) -> Measure","per(measure: Measure, other: Measure) -> Measure","times(measure: Measure, other: Measure) -> Measure","kilo : Float","kilo : Float"],"summary":"","types":["Unit","UnitDefinition","Measure","Number","SIPrefix","String"],"urlPath":"units/si"},{"anchor":"type-units-si-siunit","kind":"type","line":3,"name":"SIUnit","qualifiedName":"Units.SI.SIUnit","signatures":[],"summary":"","types":[],"urlPath":"units/si"},{"anchor":"type-units-si-siprefix","kind":"type","line":8,"name":"SIPrefix","qualifiedName":"Units.SI.SIPrefix","signatures":[],"summary":"A display prefix carries the unit it will display, for example `Kilo(Watt * Hour)`.","types":["Unit","Unit","Unit","Unit","Unit","Unit"],"urlPath":"units/si"},{"anchor":"make-siprefix","kind":"make","line":11,"name":"SIPrefix","qualifiedName":"SIPrefix","signatures":["factor(_)","kind(_)","symbol(_)"],"summary":"","types":[],"urlPath":"units/si"},{"anchor":"siprefix-factor","kind":"function","line":12,"name":"factor","qualifiedName":"SIPrefix.factor","signatures":["factor(_)"],"summary":"","types":[],"urlPath":"units/si"},{"anchor":"siprefix-kind","kind":"function","line":19,"name":"kind","qualifiedName":"SIPrefix.kind","signatures":["kind(_)"],"summary":"","types":[],"urlPath":"units/si"},{"anchor":"siprefix-symbol","kind":"function","line":26,"name":"symbol","qualifiedName":"SIPrefix.symbol","signatures":["symbol(_)"],"summary":"","types":[],"urlPath":"units/si"},{"anchor":"make-siunit","kind":"make","line":34,"name":"SIUnit","qualifiedName":"SIUnit","signatures":["kind(_)","symbol(_)","*(_, _) -> UnitDefinition"],"summary":"","types":["UnitDefinition"],"urlPath":"units/si"},{"anchor":"siunit-factor","kind":"function","line":35,"name":"factor","qualifiedName":"SIUnit.factor","signatures":[],"summary":"","types":[],"urlPath":"units/si"},{"anchor":"siunit-kind","kind":"function","line":36,"name":"kind","qualifiedName":"SIUnit.kind","signatures":["kind(_)"],"summary":"","types":[],"urlPath":"units/si"},{"anchor":"siunit-symbol","kind":"function","line":49,"name":"symbol","qualifiedName":"SIUnit.symbol","signatures":["symbol(_)"],"summary":"","types":[],"urlPath":"units/si"},{"anchor":"siunit-op-times","kind":"function","line":89,"name":"*","qualifiedName":"SIUnit.*","signatures":["*(_, _) -> UnitDefinition"],"summary":"","types":["UnitDefinition"],"urlPath":"units/si"},{"anchor":"make-unitdefinition","kind":"make","line":63,"name":"UnitDefinition","qualifiedName":"UnitDefinition","signatures":[],"summary":"","types":[],"urlPath":"units/si"},{"anchor":"unitdefinition-factor","kind":"function","line":64,"name":"factor","qualifiedName":"UnitDefinition.factor","signatures":[],"summary":"","types":[],"urlPath":"units/si"},{"anchor":"unitdefinition-kind","kind":"function","line":65,"name":"kind","qualifiedName":"UnitDefinition.kind","signatures":[],"summary":"","types":[],"urlPath":"units/si"},{"anchor":"unitdefinition-symbol","kind":"function","line":66,"name":"symbol","qualifiedName":"UnitDefinition.symbol","signatures":[],"summary":"","types":[],"urlPath":"units/si"},{"anchor":"make-measure","kind":"make","line":69,"name":"Measure","qualifiedName":"Measure","signatures":["factor : Float","kind : Atom","symbol : String","kilo : Measure","*(other: Measure) -> Measure","/(other: Measure) -> Measure","product(other) -> Measure","quotient(other) -> Measure","productKind(left, _)","quotientKind(left, _)","productSymbol(_, left, right)","quotientSymbol(_, left, right)"],"summary":"Prefixes work both on an existing measure (`5000.meter.kilo`) and at the beginning of a postfix unit expression (`3.kilo.watt`).","types":["Measure"],"urlPath":"units/si"},{"anchor":"measure-factor","kind":"function","line":70,"name":"factor","qualifiedName":"Measure.factor","signatures":["factor : Float"],"summary":"","types":[],"urlPath":"units/si"},{"anchor":"measure-kind","kind":"function","line":71,"name":"kind","qualifiedName":"Measure.kind","signatures":["kind : Atom"],"summary":"","types":[],"urlPath":"units/si"},{"anchor":"measure-symbol","kind":"function","line":72,"name":"symbol","qualifiedName":"Measure.symbol","signatures":["symbol : String"],"summary":"","types":[],"urlPath":"units/si"},{"anchor":"measure-kilo","kind":"function","line":125,"name":"kilo","qualifiedName":"Measure.kilo","signatures":["kilo : Measure"],"summary":"","types":[],"urlPath":"units/si"},{"anchor":"measure-op-times","kind":"function","line":145,"name":"*","qualifiedName":"Measure.*","signatures":["*(other: Measure) -> Measure"],"summary":"","types":["Measure"],"urlPath":"units/si"},{"anchor":"measure-op-div","kind":"function","line":146,"name":"/","qualifiedName":"Measure./","signatures":["/(other: Measure) -> Measure"],"summary":"","types":["Measure"],"urlPath":"units/si"},{"anchor":"measure-product","kind":"function","line":149,"name":"product","qualifiedName":"Measure.product","signatures":["product(other) -> Measure"],"summary":"","types":["Measure"],"urlPath":"units/si"},{"anchor":"measure-quotient","kind":"function","line":157,"name":"quotient","qualifiedName":"Measure.quotient","signatures":["quotient(other) -> Measure"],"summary":"","types":["Measure"],"urlPath":"units/si"},{"anchor":"measure-productkind","kind":"function","line":165,"name":"productKind","qualifiedName":"Measure.productKind","signatures":["productKind(left, _)"],"summary":"","types":[],"urlPath":"units/si"},{"anchor":"measure-quotientkind","kind":"function","line":173,"name":"quotientKind","qualifiedName":"Measure.quotientKind","signatures":["quotientKind(left, _)"],"summary":"","types":[],"urlPath":"units/si"},{"anchor":"measure-productsymbol","kind":"function","line":180,"name":"productSymbol","qualifiedName":"Measure.productSymbol","signatures":["productSymbol(_, left, right)"],"summary":"","types":[],"urlPath":"units/si"},{"anchor":"measure-quotientsymbol","kind":"function","line":187,"name":"quotientSymbol","qualifiedName":"Measure.quotientSymbol","signatures":["quotientSymbol(_, left, right)"],"summary":"","types":[],"urlPath":"units/si"},{"anchor":"function-units-si-meter","kind":"function","line":75,"name":"meter","qualifiedName":"Units.SI.meter","signatures":["meter(value: Number) -> Measure"],"summary":"","types":["Number","Measure"],"urlPath":"units/si"},{"anchor":"function-units-si-gram","kind":"function","line":76,"name":"gram","qualifiedName":"Units.SI.gram","signatures":["gram(value: Number) -> Measure"],"summary":"","types":["Number","Measure"],"urlPath":"units/si"},{"anchor":"function-units-si-kilogram","kind":"function","line":77,"name":"kilogram","qualifiedName":"Units.SI.kilogram","signatures":["kilogram(value: Number) -> Measure"],"summary":"","types":["Number","Measure"],"urlPath":"units/si"},{"anchor":"function-units-si-kelvin","kind":"function","line":78,"name":"kelvin","qualifiedName":"Units.SI.kelvin","signatures":["kelvin(value: Number) -> Measure"],"summary":"","types":["Number","Measure"],"urlPath":"units/si"},{"anchor":"function-units-si-liter","kind":"function","line":79,"name":"liter","qualifiedName":"Units.SI.liter","signatures":["liter(value: Number) -> Measure"],"summary":"","types":["Number","Measure"],"urlPath":"units/si"},{"anchor":"function-units-si-newton","kind":"function","line":80,"name":"newton","qualifiedName":"Units.SI.newton","signatures":["newton(value: Number) -> Measure"],"summary":"","types":["Number","Measure"],"urlPath":"units/si"},{"anchor":"function-units-si-joule","kind":"function","line":81,"name":"joule","qualifiedName":"Units.SI.joule","signatures":["joule(value: Number) -> Measure"],"summary":"","types":["Number","Measure"],"urlPath":"units/si"},{"anchor":"function-units-si-watt","kind":"function","line":82,"name":"watt","qualifiedName":"Units.SI.watt","signatures":["watt(value: Number) -> Measure"],"summary":"","types":["Number","Measure"],"urlPath":"units/si"},{"anchor":"function-units-si-volt","kind":"function","line":83,"name":"volt","qualifiedName":"Units.SI.volt","signatures":["volt(value: Number) -> Measure"],"summary":"","types":["Number","Measure"],"urlPath":"units/si"},{"anchor":"function-units-si-ampere","kind":"function","line":84,"name":"ampere","qualifiedName":"Units.SI.ampere","signatures":["ampere(value: Number) -> Measure"],"summary":"","types":["Number","Measure"],"urlPath":"units/si"},{"anchor":"function-units-si-ohm","kind":"function","line":85,"name":"ohm","qualifiedName":"Units.SI.ohm","signatures":["ohm(value: Number) -> Measure"],"summary":"","types":["Number","Measure"],"urlPath":"units/si"},{"anchor":"function-units-si-coulomb","kind":"function","line":86,"name":"coulomb","qualifiedName":"Units.SI.coulomb","signatures":["coulomb(value: Number) -> Measure"],"summary":"","types":["Number","Measure"],"urlPath":"units/si"},{"anchor":"function-units-si-to","kind":"function","line":96,"name":"to","qualifiedName":"Units.SI.to","signatures":["to(measure: Measure, _, in: SIPrefix) -> String"],"summary":"","types":["Measure","SIPrefix","String"],"urlPath":"units/si"},{"anchor":"function-units-si-mega","kind":"function","line":110,"name":"mega","qualifiedName":"Units.SI.mega","signatures":["mega(measure: Measure) -> Measure"],"summary":"","types":["Measure"],"urlPath":"units/si"},{"anchor":"function-units-si-giga","kind":"function","line":111,"name":"giga","qualifiedName":"Units.SI.giga","signatures":["giga(measure: Measure) -> Measure"],"summary":"","types":["Measure"],"urlPath":"units/si"},{"anchor":"function-units-si-milli","kind":"function","line":112,"name":"milli","qualifiedName":"Units.SI.milli","signatures":["milli(measure: Measure) -> Measure"],"summary":"","types":["Measure"],"urlPath":"units/si"},{"anchor":"function-units-si-micro","kind":"function","line":113,"name":"micro","qualifiedName":"Units.SI.micro","signatures":["micro(measure: Measure) -> Measure"],"summary":"","types":["Measure"],"urlPath":"units/si"},{"anchor":"function-units-si-nano","kind":"function","line":114,"name":"nano","qualifiedName":"Units.SI.nano","signatures":["nano(measure: Measure) -> Measure"],"summary":"","types":["Measure"],"urlPath":"units/si"},{"anchor":"function-units-si-per","kind":"function","line":116,"name":"per","qualifiedName":"Units.SI.per","signatures":["per(measure: Measure, other: Measure) -> Measure"],"summary":"","types":["Measure"],"urlPath":"units/si"},{"anchor":"function-units-si-times","kind":"function","line":119,"name":"times","qualifiedName":"Units.SI.times","signatures":["times(measure: Measure, other: Measure) -> Measure"],"summary":"","types":["Measure"],"urlPath":"units/si"},{"anchor":"make-integer","kind":"make","line":136,"name":"Integer","qualifiedName":"Integer","signatures":["kilo : Float"],"summary":"","types":[],"urlPath":"units/si"},{"anchor":"integer-kilo","kind":"function","line":137,"name":"kilo","qualifiedName":"Integer.kilo","signatures":["kilo : Float"],"summary":"","types":[],"urlPath":"units/si"},{"anchor":"make-float","kind":"make","line":140,"name":"Float","qualifiedName":"Float","signatures":["kilo : Float"],"summary":"","types":[],"urlPath":"units/si"},{"anchor":"float-kilo","kind":"function","line":141,"name":"kilo","qualifiedName":"Float.kilo","signatures":["kilo : Float"],"summary":"","types":[],"urlPath":"units/si"}],"generatedAt":"2026-09-27T13:33:29.875688171Z","package":"prelude","version":"0.4.0-alpha"}