@temperlang/std 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -2
- package/regex.js +495 -484
- package/regex.js.map +1 -1
- package/temporal.js +39 -35
- package/temporal.js.map +1 -1
- package/testing.js +122 -122
- package/testing.js.map +1 -1
package/regex.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{ "version": 3, "file": "js/std/regex.js", "sources": [ "std/regex.temper.md" ], "sourcesContent": [ "# Regex Data Model and Functionality\n\nThe structural data model for regex patterns enables direct construction, and\nthe Temper regex dialect compiles static regex text patterns to these objects.\n\nA focus here is on providing tools people can actually reach for when they need\nto do text processing. The execution should be faster on backends like Python\nthan writing raw code, and the implementation in backends like C should\napproximate what you'd like to have written manually.\n\nDue to inadequate and distinct Unicode handling in backend regex engines, the\ninitial feature set avoids character classes and properties but is still aware\nof code points. Parsing focused on limited sets of delimiters works best for\nnow.\n\nThe core feature set here focuses on both the data model and utility functions,\nsuch as matching regexes against strings.\n\n## Regex Data Model\n\nAll regexes are composed hierarchically of `Regex` nodes. Regexes are a\nsequence of component parts. For example, `/hi./` is a sequence of\n[CodePoint](#codepoint) `/h/` and `/i/` and dot `/./`.\n\nAnd perhaps the most fundamental `Regex` is the [Sequence](#sequence),\nbecause it enables multiple regex components to be strung together.\n\n```\nexport /*sealed*/ interface Regex {\n```\n\nBefore a regex is used, it must be compiled. Some helper functions compile on\nthe fly, although it is faster to reuse a pre-compiled regex.\n\n```\n // TODO(tjp, regex): Make this into a macro behind the scenes.\n // TODO(tjp, regex): `compiled\u003cT\u003e(): CompiledRegex\u003cT\u003e`\n public compiled(): CompiledRegex { new CompiledRegex(this) }\n```\n\nThe simplest use of a regular expression is if it is found in a string.\nRepeatedly calling these methods on a single `Regex` instance is inefficient.\nBetter for reuse is to compile in advance.\n\n```\n public found(text: String): Boolean { compiled().found(text) }\n```\n\nYou can also return match details or perform text replacement. The returned\ngroups map contains an entry for each key in the order defined in the regex\npattern. If no \u0022full\u0022 group is defined, one is added automatically to capture\nthe full matched text.\n\nIn the future, we intend to support customized match types with fields to match\ncapture groups, statically checked where possible.\n\n```\n // TODO(tjp, regex): Also macro because reification.\n\n public find(text: String): Map\u003cString, Group\u003e | Bubble {\n compiled().find(text)\n }\n\n public replace(\n text: String, format: fn (Map\u003cString, Group\u003e): String\n ): String {\n compiled().replace(text, format)\n }\n```\n\nThat's it for what you can do with regex patterns in Temper today, but there's\nmuch more to say on what kinds of regexes can be built.\n\n```\n}\n```\n\n## Regex Item Types\n\nA `Regex` is composed of a potential variety of subtypes.\n\n### Groups\n\nMultiple types of groups exist:\n\n- [Capture](#capture) `/(?\u003cname\u003e...)/` to remember match groups for later use.\n- Non-capturing group syntax `/(?:...)/`, which is simply a [Regex](#regex)\n instance in the data model.\n\n### Capture\n\nTODO(tjp, regex): Change to named captures only!\n\n`Capture` is a [group](#groups) that remembers the matched text for later\naccess. Temper supports only named matches, with current intended syntax\n`/(?name = ...)/`.\n\n```\nexport class Capture extends Regex {\n public name: String;\n public /*early*/ item: Regex;\n}\n```\n\n### CodePart\n\nA component of a [CodeSet][#codeset], aka character class, which applies to a\nsubset of regex data types.\n\nHere, \u0022code\u0022 is short for \u0022code point\u0022 although \u0022char\u0022 might work better,\ndepending on expectations.\n\n```\nexport /*sealed*/ interface CodePart extends Regex {}\n```\n\n### CodePoints\n\nOne or more verbatim code points, where the sequence matters if within a\n[Regex](#regex) or not if within a [CodeSet](#codeset). Some escapes in\ntextual regex source, such as `/\\t/`, can be stored as raw code points.\n\nThe `String` here can enable more efficient storage than individual code\npoints, although the source text may require non-capture grouping. For example,\n`/(?:abc)?/` optionally matches the string `\u0022abc\u0022`, whereas `/abc?/` matches\n`\u0022ab\u0022` with an optional `\u0022c\u0022`.\n\n```\nexport class CodePoints extends CodePart {\n public value: String;\n}\n```\n\n### Specials\n\nA number of special match forms exist. In the data model, these are empty\nclasses.\n\n- `.` - `Dot` In default mode, matches any Unicode code point except newline.\n- `^` - `Begin` in default mode matches zero-length at the beginning of a\n string.\n- `\u0024` - `End` in default mode matches zero-length at the end of a string.\n- `\\b` - `WordBoundary` matches zero-length at the boundary between word and\n non-word code points. More sophisticated Unicode compliance is TBD.\n- `\\s` (negated as `\\S`) - `Space` matches any horizontal space code point.\n Details are TBD.\n- `\\w` (negated as `\\W`) - `Word` matches any word code point. Details are TBD.\n This is currently defined in terms of old ASCII definitions because those are\n clear. Perhaps this will stay that way, and Unicode properties like `\\p{L}`\n will be used for human language needs.\n- `\\X` - `GraphemeCluster` might not be supported, but [here is some discussion\n of how to implement it](\n https://github.com/rust-lang/regex/issues/54#issuecomment-661905060).\n\n\u003cdetails\u003e\n\n```\nexport /*sealed*/ interface Special extends Regex {}\nexport let Begin: Special = do { class Begin extends Special {}; new Begin() };\nexport let Dot: Special = do { class Dot extends Special {}; new Dot() };\nexport let End: Special = do { class End extends Special {}; new End() };\n// TODO(tjp, regex): We can't easily support this at present across backends.\n// export let GraphemeCluster = do {\n// class GraphemeCluster extends Special {}; new GraphemeCluster()\n// };\nexport let WordBoundary: Special = do {\n class WordBoundary extends Special {}; new WordBoundary()\n};\n\nexport /*sealed*/ interface SpecialSet extends CodePart \u0026 Special {}\nexport let Digit: SpecialSet = do {\n class Digit extends SpecialSet {}; new Digit()\n};\nexport let Space: SpecialSet = do {\n class Space extends SpecialSet {}; new Space()\n};\nexport let Word: SpecialSet = do {\n class Word extends SpecialSet {}; new Word()\n};\n```\n\n\u003c/details\u003e\n\n### CodeRange\n\nA code point range matches any code point in its inclusive bounds, such as\n`/[a-c]/`. In source, `-` is included in a code set either by escaping or by\nincluding it as the first or last character. A `CodeRange` is usually contained\ninside a [CodeSet](#codeset), and syntactically always is.\n\n```\nexport class CodeRange extends CodePart {\n public min: Int;\n public max: Int;\n}\n```\n\n### CodeSet\n\nA set of code points, any of which can match, such as `/[abc]/` matching any of\n`\u0022a\u0022`, `\u0022b\u0022`, or `\u0022c\u0022`. Alternatively, a negated set is the inverse of the code\npoints given, such as `/[^abc]/`, matching any code point that's not any of\nthese. This is also often called a character class.\n\nFurther, a subset of [specials](#specials) can also be used in code sets. A\nnegated code set of just a special set often has custom syntax. For example,\nnon-space can be said as either `/[^\\s]/` or `/\\S/`.\n\n```\nexport class CodeSet extends Regex {\n public items: List\u003cCodePart\u003e;\n public negated: Boolean = false;\n}\n```\n\n### Or\n\n`Or` matches any one of multiple options, such as `/ab|cd|e*/`.\n\n```\nexport class Or extends Regex {\n public /*early*/ items: List\u003cRegex\u003e;\n}\n```\n\n### Repeat\n\n`Repeat` matches from an minimum to a maximum number of repeats of a\nsubregex. This can be represented in regex source in a number of ways:\n\n- `?` matches 0 or 1.\n- `*` matches 0 or more.\n- `+` matches 1 or more.\n- `{m}` matches exactly `m` repetitions.\n- `{m,n}` matches between `m` and `n`. Missing `n` is a max of infinity. For\n example, `{0,1}` is equivalent to `?`, and `{1,}` is equivalent to `+`.\n\nBy default, repetitions are greedy, matching as many repetitions as possible.\nIn regex source, any of the above can have `?` appended to indicated reluctant\n(aka non-greedy), matching as few repetitions as possible.\n\n```\nexport class Repeat extends Regex {\n public /*early*/ item: Regex;\n public min: Int;\n public max: Int | Null; // where null means infinite\n public reluctant: Boolean = false;\n}\n```\n\nWe also have convenience builders.\n\n```\nexport let entire(item: Regex): Regex {\n new Sequence([Begin, item, End])\n}\n\nexport let oneOrMore(item: Regex, reluctant: Boolean = false): Repeat {\n { item, min: 1, max: null, reluctant }\n}\n\nexport let optional(item: Regex, reluctant: Boolean = false): Repeat {\n { item, min: 0, max: 1, reluctant }\n}\n```\n\n### Sequence\n\n`Sequence` strings along multiple other regexes in order.\n\n```\nexport class Sequence extends Regex {\n public /*early*/ items: List\u003cRegex\u003e;\n}\n```\n\n## Match Objects\n\nFor detailed match results, call `find` on a regex to get a `Map` object from\n`String` keys to `Group` values.\n\n```\n// TODO Go back to a `Match` object with `groups` as a member so we can also\n// TODO easily return metadata alongside groups? Or is simpler better?\n// export class Match { // interface ... \u003cT = Map\u003cString, Group\u003e\u003e {\n// public let groups: Map\u003cString, Group\u003e;\n// }\n\nexport class Group {\n public let name: String;\n public let value: String;\n public let codePointsBegin: Int;\n}\n```\n\n## Compiled Regex Objects\n\nThe compiled form of a regex is mostly opaque, but it can be cached for more\nefficient reuse than working from a source [Regex](#regex-data-model).\n\n\u003cdetails\u003e\n\n```\n// Provides a workaround for access to std/regex from extension methods.\nclass RegexRefs {\n public let codePoints: CodePoints = new CodePoints(\u0022\u0022);\n public let group: Group = { name: \u0022\u0022, value: \u0022\u0022, codePointsBegin: 0 }\n public let orObject: Or = new Or([]);\n}\n\nlet regexRefs = new RegexRefs();\n```\n\n\u003c/details\u003e\n\n```\n// TODO(tjp, regex): Generate subtypes of this interface later.\nexport class CompiledRegex { // interface ... \u003cT\u003e {\n```\n\nThe source `Regex` data is still available on compiled objects in case it's\nneeded for composition or other purposes.\n\n```\n public let data: Regex;\n\n public constructor(data: Regex) {\n this.data = data;\n compiled = compileFormatted(format());\n }\n```\n\nA compiled regex exposes many of the same capabilities as `Regex`, but they are\nmore efficient to use repeatedly.\n\n```\n public found(text: String): Boolean { compiledFound(compiled, text) }\n\n public find(text: String): Map\u003cString, Group\u003e | Bubble {\n compiledFind(compiled, text, regexRefs)\n }\n\n public replace(\n text: String, format: fn (Map\u003cString, Group\u003e): String\n ): String {\n compiledReplace(compiled, text, format, regexRefs)\n }\n```\n\nTODO(tjp, regex): Public method for replace with named references.\nTODO(tjp, regex): Any static checking?\n\n\u003cdetails\u003e\n\n```\n let compiled: AnyValue;\n\n // Extension functions on some backends need the private `compiled` value\n // passed in directly.\n @connected(\u0022CompiledRegex::compiledFound\u0022)\n compiledFound(compiled: AnyValue, text: String): Boolean;\n\n @connected(\u0022CompiledRegex::compiledFind\u0022)\n compiledFind(\n compiled: AnyValue, text: String, regexRefs: RegexRefs\n ): Map\u003cString, Group\u003e | Bubble;\n\n @connected(\u0022CompiledRegex::compileFormatted\u0022)\n compileFormatted(formatted: String): AnyValue;\n\n @connected(\u0022CompiledRegex::compiledReplace\u0022)\n compiledReplace(\n compiled: AnyValue,\n text: String,\n format: fn (Map\u003cString, Group\u003e): String,\n regexRefs: RegexRefs,\n ): String;\n\n @connected(\u0022CompiledRegex::format\u0022)\n format(): String { new RegexFormatter().format(data) }\n```\n\n\u003c/details\u003e\n\n```\n}\n```\n\n## Private implementation matters\n\nSome regex logic can be shared across backends. These features aren't directly\nexported to the user, however.\n\nThe intent is that these support features only get included in compiled Temper\ncode if usage depends on dynamically constructed regexes. If all regex building\nis done as stable values, we hope to generated backend compiled regexes purely\nat Temper compile time.\n\n### RegexFormatter\n\n\u003cdetails\u003e\n\n```\nclass RegexFormatter {\n let out: ListBuilder\u003cString\u003e = new ListBuilder\u003cString\u003e();\n\n public format(regex: Regex): String {\n pushRegex(regex)\n out.join(\u0022\u0022) { (x);; x }\n }\n\n pushRegex(regex: Regex): Void {\n match (regex) {\n // Aggregate types.\n is Capture -\u003e pushCapture(regex);\n is CodePoints -\u003e pushCodePoints(regex, false);\n is CodeRange -\u003e pushCodeRange(regex);\n is CodeSet -\u003e pushCodeSet(regex);\n is Or -\u003e pushOr(regex);\n is Repeat -\u003e pushRepeat(regex);\n is Sequence -\u003e pushSequence(regex);\n // Specials.\n // Some of these will need to be customized on future backends.\n Begin -\u003e out.add(\u0022^\u0022);\n Dot -\u003e out.add(\u0022.\u0022);\n End -\u003e out.add(\u0022\u0024\u0022);\n WordBoundary -\u003e out.add(\u0022\\\\b\u0022);\n // Special sets.\n Digit -\u003e out.add(\u0022\\\\d\u0022);\n Space -\u003e out.add(\u0022\\\\s\u0022);\n Word -\u003e out.add(\u0022\\\\w\u0022);\n // ...\n }\n }\n\n pushCapture(capture: Capture): Void {\n out.add(\u0022(\u0022);\n // TODO(tjp, regex): Consistent name validation rules for all backends???\n // TODO(tjp, regex): Validate here or in `Capture` constructor???\n // TODO(tjp, regex): Validate here or where against reused names???\n pushCaptureName(out, capture.name);\n pushRegex(capture.item);\n out.add(\u0022)\u0022);\n }\n\n @connected(\u0022RegexFormatter::pushCaptureName\u0022)\n pushCaptureName(out: ListBuilder\u003cString\u003e, name: String): Void {\n // All so far except Python use this form.\n out.add(\u0022?\u003c\u0024{name}\u003e\u0022);\n }\n\n pushCode(code: Int, insideCodeSet: Boolean): Void {\n // Expose private property to extension.\n pushCodeTo(out, code, insideCodeSet);\n // TODO(tjp, regex): Implement more in Temper once we can.\n // if (escapeCodes[code] \u0026\u0026 false) {\n // out.add(\u0022\\\\\u0022);\n // // TODO(tjp, regex): How to convert back to strings?\n // }\n }\n\n @connected(\u0022RegexFormatter::pushCodeTo\u0022)\n pushCodeTo(out: ListBuilder\u003cString\u003e, code: Int, insideCodeSet: Boolean): Void;\n\n pushCodePoints(codePoints: CodePoints, insideCodeSet: Boolean): Void {\n for (\n var slice = codePoints.value.codePoints;\n !slice.isEmpty;\n slice = slice.advance(1)\n ) {\n pushCode(slice.read(), insideCodeSet);\n }\n }\n\n pushCodeRange(codeRange: CodeRange): Void {\n out.add(\u0022[\u0022);\n pushCodeRangeUnwrapped(codeRange);\n out.add(\u0022]\u0022);\n }\n\n pushCodeRangeUnwrapped(codeRange: CodeRange): Void {\n pushCode(codeRange.min, true);\n out.add(\u0022-\u0022);\n pushCode(codeRange.max, true);\n }\n\n pushCodeSet(codeSet: CodeSet): Void {\n let adjusted = adjustCodeSet(codeSet, regexRefs);\n match (adjusted) {\n is CodeSet -\u003e do {\n out.add(\u0022[\u0022);\n if (adjusted.negated) {\n out.add(\u0022^\u0022);\n }\n for (var i = 0; i \u003c adjusted.items.length; i += 1) {\n pushCodeSetItem(adjusted.items[i]);\n }\n out.add(\u0022]\u0022);\n }\n else -\u003e pushRegex(adjusted);\n }\n }\n\n @connected(\u0022RegexFormatter::adjustCodeSet\u0022)\n adjustCodeSet(codeSet: CodeSet, regexRefs: RegexRefs): Regex { codeSet }\n\n pushCodeSetItem(codePart: CodePart): Void {\n match (codePart) {\n is CodePoints -\u003e pushCodePoints(codePart, true);\n is CodeRange -\u003e pushCodeRangeUnwrapped(codePart);\n is SpecialSet -\u003e pushRegex(codePart);\n }\n }\n\n pushOr(or: Or): Void {\n if (!or.items.isEmpty) {\n out.add(\u0022(?:\u0022);\n // TODO(tjp, regex): See #822. Until `this` works better, no this in funs.\n // TODO(tjp, regex): So just manually loop here. Sometimes faster, anyway?\n pushRegex(or.items[0]);\n for (var i = 1; i \u003c or.items.length; i += 1) {\n out.add(\u0022|\u0022);\n pushRegex(or.items[i]);\n }\n out.add(\u0022)\u0022);\n }\n }\n\n pushRepeat(repeat: Repeat): Void {\n // Always wrap the main sub-pattern here to make life easy\n out.add(\u0022(?:\u0022);\n pushRegex(repeat.item);\n out.add(\u0022)\u0022);\n // Then add the repetition part.\n let min = repeat.min;\n let max = repeat.max;\n if (false) {\n } else if (min == 0 \u0026\u0026 max == 1) {\n out.add(\u0022?\u0022);\n } else if (min == 0 \u0026\u0026 max == null) {\n out.add(\u0022*\u0022);\n } else if (min == 1 \u0026\u0026 max == null) {\n out.add(\u0022+\u0022);\n } else {\n out.add(\u0022{\u0024{min.toString()}\u0022);\n if (min != max) {\n out.add(\u0022,\u0022);\n if (max != null) {\n out.add(max.as\u003cInt\u003e().toString());\n }\n }\n out.add(\u0022}\u0022);\n }\n if (repeat.reluctant) {\n out.add(\u0022?\u0022);\n }\n }\n\n pushSequence(sequence: Sequence): Void {\n // TODO(tjp, regex): Foreach loop/function would be nice.\n for (var i = 0; i \u003c sequence.items.length; i += 1) {\n pushRegex(sequence.items[i]);\n }\n }\n\n // Put this here instead of the data model for now because I'm not sure this\n // makes sense to be part of the public api right now.\n public maxCode(codePart: CodePart): Int | Null {\n match (codePart) {\n is CodePoints -\u003e do {\n // Iterating code points is the hardest of the current cases.\n let value = codePart.value;\n if (value.isEmpty) {\n null\n } else {\n // My kingdom for a fold, or even just a max, in builtins.\n var max = 0;\n for (\n var slice = value.codePoints;\n !slice.isEmpty;\n slice = slice.advance(1)\n ) {\n let next = slice.read();\n if (next \u003e max) {\n max = next;\n }\n }\n max\n }\n }\n // Others below are easy for now.\n is CodeRange -\u003e codePart.max;\n Digit -\u003e \u00229\u0022.codePoints.read();\n Space -\u003e \u0022 \u0022.codePoints.read();\n Word -\u003e \u0022z\u0022.codePoints.read();\n // Actually unexpected, ever, but eh.\n else -\u003e null;\n }\n }\n}\n```\n\n\u003c/details\u003e\n" ], "names": [ "CompiledRegex", "text", "format", "Regex", "compiled", "found", "find", "replace", "Capture", "name", "item", "CodePart", "CodePoints", "value", "Special", "SpecialSet", "CodeRange", "min", "max", "CodeSet", "items", "negated", "Or", "Repeat", "reluctant", "Sequence", "Group", "codePointsBegin", "RegexRefs", "codePoints", "group", "orObject", "data", "regexRefs", "RegexFormatter", "out", "regex", "fn", "x", "return", "Begin", "Dot", "End", "WordBoundary", "Digit", "Space", "Word", "capture", "code", "insideCodeSet", "slice", "codeRange", "codeSet", "adjusted", "i", "codePart", "or", "repeat", "sequence", "next", "entire", "oneOrMore", "optional" ], "mappings": "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" }
|
|
1
|
+
{ "version": 3, "file": "js/std/regex.js", "sources": [ "std/regex.temper.md" ], "sourcesContent": [ "# Regex Data Model and Functionality\n\nThe structural data model for regex patterns enables direct construction, and\nthe Temper regex dialect compiles static regex text patterns to these objects.\n\nA focus here is on providing tools people can actually reach for when they need\nto do text processing. The execution should be faster on backends like Python\nthan writing raw code, and the implementation in backends like C should\napproximate what you'd like to have written manually.\n\nDue to inadequate and distinct Unicode handling in backend regex engines, the\ninitial feature set avoids character classes and properties but is still aware\nof code points. Parsing focused on limited sets of delimiters works best for\nnow.\n\nThe core feature set here focuses on both the data model and utility functions,\nsuch as matching regexes against strings.\n\n## Regex Data Model\n\nTemper regex representation is composed hierarchically of `RegexNode` objects.\nAnd perhaps the most fundamental `RegexNode` is the [Sequence](#sequence),\nbecause it enables multiple regex components to be strung together. For example,\n`/hi./` is a sequence of [CodePoints](#codepoints) `/hi/` and dot `/./`, but all\ncomponent types extend the `RegexNode` interface.\n\n```\nexport /*sealed*/ interface RegexNode {\n```\n\nBefore a regex is used, it must be compiled. This transforms a `RegexNode` tree\ninto a backend-native [Regex](#regex). Some helper functions compile on the fly,\nalthough it is faster to reuse a pre-compiled regex.\n\n```\n // TODO(tjp, regex): Make this into a macro behind the scenes.\n // TODO(tjp, regex): `compiled\u003cT\u003e(): Regex\u003cT\u003e`\n public compiled(): Regex { new Regex(this) }\n```\n\nThe simplest use of a regular expression is if it is found in a string.\nAgain, it is better to compile to a `Regex` in advance than to repeatedly call\nconvenience methods on a `RegexNode`.\n\n```\n public found(text: String): Boolean { compiled().found(text) }\n```\n\nYou can also return match details or perform text replacement. The returned\ngroups map contains an entry for each key in the order defined in the regex\npattern. If no \u0022full\u0022 group is defined, one is added automatically to capture\nthe full matched text.\n\nIn the future, we intend to support customized match types with fields to match\ncapture groups, statically checked where possible.\n\n```\n // TODO(tjp, regex): Also macro because reification.\n\n public find(text: String): Map\u003cString, Group\u003e | Bubble {\n compiled().find(text)\n }\n\n public replace(\n text: String, format: fn (Map\u003cString, Group\u003e): String\n ): String {\n compiled().replace(text, format)\n }\n```\n\nThat's it for what you can do with regex patterns in Temper today, but there's\nmuch more to say on what kinds of regexes can be built.\n\n```\n}\n```\n\n## Regex Item Types\n\nA `Regex` is composed of a potential variety of subtypes.\n\n### Groups\n\nMultiple types of groups exist:\n\n- [Capture](#capture) `/(?\u003cname\u003e...)/` to remember match groups for later use.\n- Non-capturing group syntax `/(?:...)/`, which is simply a [Regex](#regex)\n instance in the data model.\n\n### Capture\n\nTODO(tjp, regex): Change to named captures only!\n\n`Capture` is a [group](#groups) that remembers the matched text for later\naccess. Temper supports only named matches, with current intended syntax\n`/(?name = ...)/`.\n\n```\nexport class Capture extends RegexNode {\n public name: String;\n public /*early*/ item: RegexNode;\n}\n```\n\n### CodePart\n\nA component of a [CodeSet][#codeset], aka character class, which applies to a\nsubset of regex data types.\n\nHere, \u0022code\u0022 is short for \u0022code point\u0022 although \u0022char\u0022 might work better,\ndepending on expectations.\n\n```\nexport /*sealed*/ interface CodePart extends RegexNode {}\n```\n\n### CodePoints\n\nOne or more verbatim code points, where the sequence matters if within a\n[Regex](#regex) or not if within a [CodeSet](#codeset). Some escapes in\ntextual regex source, such as `/\\t/`, can be stored as raw code points.\n\nThe `String` here can enable more efficient storage than individual code\npoints, although the source text may require non-capture grouping. For example,\n`/(?:abc)?/` optionally matches the string `\u0022abc\u0022`, whereas `/abc?/` matches\n`\u0022ab\u0022` with an optional `\u0022c\u0022`.\n\n```\nexport class CodePoints extends CodePart {\n public value: String;\n}\n```\n\n### Specials\n\nA number of special match forms exist. In the data model, these are empty\nclasses.\n\n- `.` - `Dot` In default mode, matches any Unicode code point except newline.\n- `^` - `Begin` in default mode matches zero-length at the beginning of a\n string.\n- `\u0024` - `End` in default mode matches zero-length at the end of a string.\n- `\\b` - `WordBoundary` matches zero-length at the boundary between word and\n non-word code points. More sophisticated Unicode compliance is TBD.\n- `\\s` (negated as `\\S`) - `Space` matches any horizontal space code point.\n Details are TBD.\n- `\\w` (negated as `\\W`) - `Word` matches any word code point. Details are TBD.\n This is currently defined in terms of old ASCII definitions because those are\n clear. Perhaps this will stay that way, and Unicode properties like `\\p{L}`\n will be used for human language needs.\n- `\\X` - `GraphemeCluster` might not be supported, but [here is some discussion\n of how to implement it](\n https://github.com/rust-lang/regex/issues/54#issuecomment-661905060).\n\n\u003cdetails\u003e\n\n```\nexport /*sealed*/ interface Special extends RegexNode {}\nexport let Begin: Special = do { class Begin extends Special {}; new Begin() };\nexport let Dot: Special = do { class Dot extends Special {}; new Dot() };\nexport let End: Special = do { class End extends Special {}; new End() };\n// TODO(tjp, regex): We can't easily support this at present across backends.\n// export let GraphemeCluster = do {\n// class GraphemeCluster extends Special {}; new GraphemeCluster()\n// };\nexport let WordBoundary: Special = do {\n class WordBoundary extends Special {}; new WordBoundary()\n};\n\nexport /*sealed*/ interface SpecialSet extends CodePart \u0026 Special {}\nexport let Digit: SpecialSet = do {\n class Digit extends SpecialSet {}; new Digit()\n};\nexport let Space: SpecialSet = do {\n class Space extends SpecialSet {}; new Space()\n};\nexport let Word: SpecialSet = do {\n class Word extends SpecialSet {}; new Word()\n};\n```\n\n\u003c/details\u003e\n\n### CodeRange\n\nA code point range matches any code point in its inclusive bounds, such as\n`/[a-c]/`. In source, `-` is included in a code set either by escaping or by\nincluding it as the first or last character. A `CodeRange` is usually contained\ninside a [CodeSet](#codeset), and syntactically always is.\n\n```\nexport class CodeRange extends CodePart {\n public min: Int;\n public max: Int;\n}\n```\n\n### Itemized Regex Types\n\nMake an abstraction over Regex types that have lists of subitems. This can make\nprocessing more convenient.\n\n export interface ItemizedRegex\u003cITEM extends RegexNode\u003e extends RegexNode {\n public get items(): List\u003cITEM\u003e;\n }\n\n### CodeSet\n\nA set of code points, any of which can match, such as `/[abc]/` matching any of\n`\u0022a\u0022`, `\u0022b\u0022`, or `\u0022c\u0022`. Alternatively, a negated set is the inverse of the code\npoints given, such as `/[^abc]/`, matching any code point that's not any of\nthese. This is also often called a character class.\n\nFurther, a subset of [specials](#specials) can also be used in code sets. A\nnegated code set of just a special set often has custom syntax. For example,\nnon-space can be said as either `/[^\\s]/` or `/\\S/`.\n\n```\nexport class CodeSet extends ItemizedRegex\u003cCodePart\u003e {\n public items: List\u003cCodePart\u003e;\n public negated: Boolean = false;\n}\n```\n\n### Or\n\n`Or` matches any one of multiple options, such as `/ab|cd|e*/`.\n\n```\nexport class Or extends ItemizedRegex\u003cRegexNode\u003e {\n public /*early*/ items: List\u003cRegexNode\u003e;\n}\n```\n\n### Repeat\n\n`Repeat` matches from an minimum to a maximum number of repeats of a\nsubregex. This can be represented in regex source in a number of ways:\n\n- `?` matches 0 or 1.\n- `*` matches 0 or more.\n- `+` matches 1 or more.\n- `{m}` matches exactly `m` repetitions.\n- `{m,n}` matches between `m` and `n`. Missing `n` is a max of infinity. For\n example, `{0,1}` is equivalent to `?`, and `{1,}` is equivalent to `+`.\n\nBy default, repetitions are greedy, matching as many repetitions as possible.\nIn regex source, any of the above can have `?` appended to indicated reluctant\n(aka non-greedy), matching as few repetitions as possible.\n\n```\nexport class Repeat extends RegexNode {\n public /*early*/ item: RegexNode;\n public min: Int;\n public max: Int | Null; // where null means infinite\n public reluctant: Boolean = false;\n}\n```\n\nWe also have convenience builders.\n\n```\nexport let entire(item: RegexNode): RegexNode {\n new Sequence([Begin, item, End])\n}\n\nexport let oneOrMore(item: RegexNode, reluctant: Boolean = false): Repeat {\n { item, min: 1, max: null, reluctant }\n}\n\nexport let optional(item: RegexNode, reluctant: Boolean = false): Repeat {\n { item, min: 0, max: 1, reluctant }\n}\n```\n\n### Sequence\n\n`Sequence` strings along multiple other regexes in order.\n\n```\nexport class Sequence extends ItemizedRegex\u003cRegexNode\u003e {\n public /*early*/ items: List\u003cRegexNode\u003e;\n}\n```\n\n## Match Objects\n\nFor detailed match results, call `find` on a regex to get a `Map` object from\n`String` keys to `Group` values.\n\n```\n// TODO Go back to a `Match` object with `groups` as a member so we can also\n// TODO easily return metadata alongside groups? Or is simpler better?\n// export class Match { // interface ... \u003cT = Map\u003cString, Group\u003e\u003e {\n// public let groups: Map\u003cString, Group\u003e;\n// }\n\nexport class Group {\n public let name: String;\n public let value: String;\n public let codePointsBegin: Int;\n}\n```\n\n## Compiled Regex Objects\n\nThe compiled form of a regex is mostly opaque, but it can be cached for more\nefficient reuse than working from a source [RegexNode](#regex-data-model).\n\n\u003cdetails\u003e\n\n```\n// Provides a workaround for access to std/regex from extension methods.\nclass RegexRefs {\n public let codePoints: CodePoints = new CodePoints(\u0022\u0022);\n public let group: Group = { name: \u0022\u0022, value: \u0022\u0022, codePointsBegin: 0 }\n public let orObject: Or = new Or([]);\n}\n\nlet regexRefs = new RegexRefs();\n```\n\n\u003c/details\u003e\n\n```\n// TODO(tjp, regex): Generate subtypes of this interface later.\nexport class Regex { // interface ... \u003cT\u003e {\n```\n\nThe source `Regex` data is still available on compiled objects in case it's\nneeded for composition or other purposes.\n\n```\n public let data: RegexNode;\n\n public constructor(data: RegexNode) {\n this.data = data;\n compiled = compileFormatted(format());\n }\n```\n\nA compiled regex exposes many of the same capabilities as `Regex`, but they are\nmore efficient to use repeatedly.\n\n```\n public found(text: String): Boolean { compiledFound(compiled, text) }\n\n public find(text: String): Map\u003cString, Group\u003e | Bubble {\n compiledFind(compiled, text, regexRefs)\n }\n\n public replace(\n text: String, format: fn (Map\u003cString, Group\u003e): String\n ): String {\n compiledReplace(compiled, text, format, regexRefs)\n }\n```\n\nTODO(tjp, regex): Public method for replace with named references.\nTODO(tjp, regex): Any static checking?\n\n\u003cdetails\u003e\n\n```\n let compiled: AnyValue;\n\n // Extension functions on some backends need the private `compiled` value\n // passed in directly.\n @connected(\u0022Regex::compiledFound\u0022)\n compiledFound(compiled: AnyValue, text: String): Boolean;\n\n @connected(\u0022Regex::compiledFind\u0022)\n compiledFind(\n compiled: AnyValue, text: String, regexRefs: RegexRefs\n ): Map\u003cString, Group\u003e | Bubble;\n\n @connected(\u0022Regex::compileFormatted\u0022)\n compileFormatted(formatted: String): AnyValue;\n\n @connected(\u0022Regex::compiledReplace\u0022)\n compiledReplace(\n compiled: AnyValue,\n text: String,\n format: fn (Map\u003cString, Group\u003e): String,\n regexRefs: RegexRefs,\n ): String;\n\n @connected(\u0022Regex::format\u0022)\n format(): String { new RegexFormatter().format(data) }\n```\n\n\u003c/details\u003e\n\n```\n}\n```\n\n## Private implementation matters\n\nSome regex logic can be shared across backends. These features aren't directly\nexported to the user, however.\n\nThe intent is that these support features only get included in compiled Temper\ncode if usage depends on dynamically constructed regexes. If all regex building\nis done as stable values, we hope to generated backend compiled regexes purely\nat Temper compile time.\n\n### RegexFormatter\n\n\u003cdetails\u003e\n\n```\nclass RegexFormatter {\n let out: ListBuilder\u003cString\u003e = new ListBuilder\u003cString\u003e();\n\n public format(regex: RegexNode): String {\n pushRegex(regex)\n out.join(\u0022\u0022) { (x);; x }\n }\n\n pushRegex(regex: RegexNode): Void {\n match (regex) {\n // Aggregate types.\n is Capture -\u003e pushCapture(regex);\n is CodePoints -\u003e pushCodePoints(regex, false);\n is CodeRange -\u003e pushCodeRange(regex);\n is CodeSet -\u003e pushCodeSet(regex);\n is Or -\u003e pushOr(regex);\n is Repeat -\u003e pushRepeat(regex);\n is Sequence -\u003e pushSequence(regex);\n // Specials.\n // Some of these will need to be customized on future backends.\n Begin -\u003e out.add(\u0022^\u0022);\n Dot -\u003e out.add(\u0022.\u0022);\n End -\u003e out.add(\u0022\u0024\u0022);\n WordBoundary -\u003e out.add(\u0022\\\\b\u0022);\n // Special sets.\n Digit -\u003e out.add(\u0022\\\\d\u0022);\n Space -\u003e out.add(\u0022\\\\s\u0022);\n Word -\u003e out.add(\u0022\\\\w\u0022);\n // ...\n }\n }\n\n pushCapture(capture: Capture): Void {\n out.add(\u0022(\u0022);\n // TODO(tjp, regex): Consistent name validation rules for all backends???\n // TODO(tjp, regex): Validate here or in `Capture` constructor???\n // TODO(tjp, regex): Validate here or where against reused names???\n pushCaptureName(out, capture.name);\n pushRegex(capture.item);\n out.add(\u0022)\u0022);\n }\n\n @connected(\u0022RegexFormatter::pushCaptureName\u0022)\n pushCaptureName(out: ListBuilder\u003cString\u003e, name: String): Void {\n // All so far except Python use this form.\n out.add(\u0022?\u003c\u0024{name}\u003e\u0022);\n }\n\n pushCode(code: Int, insideCodeSet: Boolean): Void {\n // Expose private property to extension.\n pushCodeTo(out, code, insideCodeSet);\n // TODO(tjp, regex): Implement more in Temper once we can.\n // if (escapeCodes[code] \u0026\u0026 false) {\n // out.add(\u0022\\\\\u0022);\n // // TODO(tjp, regex): How to convert back to strings?\n // }\n }\n\n @connected(\u0022RegexFormatter::pushCodeTo\u0022)\n pushCodeTo(out: ListBuilder\u003cString\u003e, code: Int, insideCodeSet: Boolean): Void;\n\n pushCodePoints(codePoints: CodePoints, insideCodeSet: Boolean): Void {\n for (\n var slice = codePoints.value.codePoints;\n !slice.isEmpty;\n slice = slice.advance(1)\n ) {\n pushCode(slice.read(), insideCodeSet);\n }\n }\n\n pushCodeRange(codeRange: CodeRange): Void {\n out.add(\u0022[\u0022);\n pushCodeRangeUnwrapped(codeRange);\n out.add(\u0022]\u0022);\n }\n\n pushCodeRangeUnwrapped(codeRange: CodeRange): Void {\n pushCode(codeRange.min, true);\n out.add(\u0022-\u0022);\n pushCode(codeRange.max, true);\n }\n\n pushCodeSet(codeSet: CodeSet): Void {\n let adjusted = adjustCodeSet(codeSet, regexRefs);\n match (adjusted) {\n is CodeSet -\u003e do {\n out.add(\u0022[\u0022);\n if (adjusted.negated) {\n out.add(\u0022^\u0022);\n }\n for (var i = 0; i \u003c adjusted.items.length; i += 1) {\n pushCodeSetItem(adjusted.items[i]);\n }\n out.add(\u0022]\u0022);\n }\n else -\u003e pushRegex(adjusted);\n }\n }\n\n @connected(\u0022RegexFormatter::adjustCodeSet\u0022)\n adjustCodeSet(codeSet: CodeSet, regexRefs: RegexRefs): RegexNode { codeSet }\n\n pushCodeSetItem(codePart: CodePart): Void {\n match (codePart) {\n is CodePoints -\u003e pushCodePoints(codePart, true);\n is CodeRange -\u003e pushCodeRangeUnwrapped(codePart);\n is SpecialSet -\u003e pushRegex(codePart);\n }\n }\n\n pushOr(or: Or): Void {\n if (!or.items.isEmpty) {\n out.add(\u0022(?:\u0022);\n // TODO(tjp, regex): See #822. Until `this` works better, no this in funs.\n // TODO(tjp, regex): So just manually loop here. Sometimes faster, anyway?\n pushRegex(or.items[0]);\n for (var i = 1; i \u003c or.items.length; i += 1) {\n out.add(\u0022|\u0022);\n pushRegex(or.items[i]);\n }\n out.add(\u0022)\u0022);\n }\n }\n\n pushRepeat(repeat: Repeat): Void {\n // Always wrap the main sub-pattern here to make life easy\n out.add(\u0022(?:\u0022);\n pushRegex(repeat.item);\n out.add(\u0022)\u0022);\n // Then add the repetition part.\n let min = repeat.min;\n let max = repeat.max;\n if (false) {\n } else if (min == 0 \u0026\u0026 max == 1) {\n out.add(\u0022?\u0022);\n } else if (min == 0 \u0026\u0026 max == null) {\n out.add(\u0022*\u0022);\n } else if (min == 1 \u0026\u0026 max == null) {\n out.add(\u0022+\u0022);\n } else {\n out.add(\u0022{\u0024{min.toString()}\u0022);\n if (min != max) {\n out.add(\u0022,\u0022);\n if (max != null) {\n out.add(max.as\u003cInt\u003e().toString());\n }\n }\n out.add(\u0022}\u0022);\n }\n if (repeat.reluctant) {\n out.add(\u0022?\u0022);\n }\n }\n\n pushSequence(sequence: Sequence): Void {\n // TODO(tjp, regex): Foreach loop/function would be nice.\n for (var i = 0; i \u003c sequence.items.length; i += 1) {\n pushRegex(sequence.items[i]);\n }\n }\n\n // Put this here instead of the data model for now because I'm not sure this\n // makes sense to be part of the public api right now.\n public maxCode(codePart: CodePart): Int | Null {\n match (codePart) {\n is CodePoints -\u003e do {\n // Iterating code points is the hardest of the current cases.\n let value = codePart.value;\n if (value.isEmpty) {\n null\n } else {\n // My kingdom for a fold, or even just a max, in builtins.\n var max = 0;\n for (\n var slice = value.codePoints;\n !slice.isEmpty;\n slice = slice.advance(1)\n ) {\n let next = slice.read();\n if (next \u003e max) {\n max = next;\n }\n }\n max\n }\n }\n // Others below are easy for now.\n is CodeRange -\u003e codePart.max;\n Digit -\u003e \u00229\u0022.codePoints.read();\n Space -\u003e \u0022 \u0022.codePoints.read();\n Word -\u003e \u0022z\u0022.codePoints.read();\n // Actually unexpected, ever, but eh.\n else -\u003e null;\n }\n }\n}\n```\n\n\u003c/details\u003e\n" ], "names": [ "Regex", "text", "format", "RegexNode", "compiled", "found", "find", "replace", "Capture", "name", "item", "CodePart", "CodePoints", "value", "Special", "SpecialSet", "CodeRange", "min", "max", "ItemizedRegex", "get.items", "CodeSet", "items", "negated", "Or", "Repeat", "reluctant", "Sequence", "Group", "codePointsBegin", "RegexRefs", "codePoints", "group", "orObject", "data", "regexRefs", "RegexFormatter", "out", "regex", "fn", "x", "return", "Begin", "Dot", "End", "WordBoundary", "Digit", "Space", "Word", "capture", "code", "insideCodeSet", "slice", "codeRange", "codeSet", "adjusted", "i", "codePart", "or", "repeat", "sequence", "next", "entire", "oneOrMore", "optional" ], "mappings": "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" }
|
package/temporal.js
CHANGED
|
@@ -1,55 +1,59 @@
|
|
|
1
1
|
import {
|
|
2
|
-
modIntInt as
|
|
2
|
+
modIntInt as modIntInt_299, listify as listify_69, intToString as intToString_190, stringCodePoints as stringCodePoints_140, strCat as strCat_129
|
|
3
3
|
} from "@temperlang/core";
|
|
4
4
|
// Type nym`std//temporal.temper.md`.Date connected to globalThis.Date
|
|
5
5
|
/** @type {Array<number>} */
|
|
6
|
-
const
|
|
6
|
+
const daysInMonth_294 = listify_69(0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
|
|
7
7
|
/**
|
|
8
|
-
* @param {number}
|
|
8
|
+
* @param {number} year_296
|
|
9
9
|
* @returns {boolean}
|
|
10
10
|
*/
|
|
11
|
-
function
|
|
12
|
-
let
|
|
13
|
-
let
|
|
14
|
-
if (
|
|
15
|
-
if (
|
|
16
|
-
|
|
11
|
+
function isLeapYear_295(year_296) {
|
|
12
|
+
let return_297;
|
|
13
|
+
let t_298;
|
|
14
|
+
if (modIntInt_299(year_296, 4) === 0) {
|
|
15
|
+
if (modIntInt_299(year_296, 100) !== 0) {
|
|
16
|
+
return_297 = true;
|
|
17
17
|
} else {
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
t_298 = modIntInt_299(year_296, 400);
|
|
19
|
+
return_297 = t_298 === 0;
|
|
20
20
|
}
|
|
21
21
|
} else {
|
|
22
|
-
|
|
22
|
+
return_297 = false;
|
|
23
23
|
}
|
|
24
|
-
return
|
|
24
|
+
return return_297;
|
|
25
25
|
}
|
|
26
26
|
/**
|
|
27
|
-
* @param {string}
|
|
28
|
-
* @param {number}
|
|
27
|
+
* @param {string} padding_301
|
|
28
|
+
* @param {number} num_302
|
|
29
29
|
* @returns {string}
|
|
30
30
|
*/
|
|
31
|
-
function
|
|
32
|
-
let
|
|
33
|
-
let
|
|
34
|
-
const
|
|
35
|
-
let
|
|
36
|
-
let
|
|
37
|
-
let
|
|
38
|
-
if (
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
31
|
+
function pad_300(padding_301, num_302) {
|
|
32
|
+
let return_303;
|
|
33
|
+
let t_304;
|
|
34
|
+
const decimal_305 = intToString_190(num_302, 10);
|
|
35
|
+
let t_306 = stringCodePoints_140(decimal_305);
|
|
36
|
+
let decimalCodePoints_307 = t_306;
|
|
37
|
+
let sign_308;
|
|
38
|
+
if (decimalCodePoints_307.read() === 45) {
|
|
39
|
+
sign_308 = "-";
|
|
40
|
+
t_304 = decimalCodePoints_307.advance(1);
|
|
41
|
+
decimalCodePoints_307 = t_304;
|
|
42
42
|
} else {
|
|
43
|
-
|
|
43
|
+
sign_308 = "";
|
|
44
44
|
}
|
|
45
|
-
const
|
|
46
|
-
const
|
|
47
|
-
if (
|
|
48
|
-
|
|
45
|
+
const paddingCp_309 = stringCodePoints_140(padding_301);
|
|
46
|
+
const nNeeded_310 = paddingCp_309.length - decimalCodePoints_307.length;
|
|
47
|
+
if (nNeeded_310 <= 0) {
|
|
48
|
+
return_303 = decimal_305;
|
|
49
49
|
} else {
|
|
50
|
-
const
|
|
51
|
-
const
|
|
52
|
-
|
|
50
|
+
const pad_311 = paddingCp_309.limit(nNeeded_310).toString();
|
|
51
|
+
const decimalOnly_312 = decimalCodePoints_307.toString();
|
|
52
|
+
return_303 = strCat_129(sign_308, pad_311, decimalOnly_312);
|
|
53
53
|
}
|
|
54
|
-
return
|
|
54
|
+
return return_303;
|
|
55
55
|
}
|
|
56
|
+
/** @type {Array<number>} */
|
|
57
|
+
const dayOfWeekLookupTableLeapy_313 = listify_69(0, 0, 3, 4, 0, 2, 5, 0, 3, 6, 1, 4, 6);
|
|
58
|
+
/** @type {Array<number>} */
|
|
59
|
+
const dayOfWeekLookupTableNotLeapy_314 = listify_69(0, 0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5);
|
package/temporal.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{ "version": 3, "file": "js/std/temporal.js", "sources": [ "std/temporal.temper.md" ], "sourcesContent": [ "# Temporal\n\nWe're creating an initial Date type to help with developing\nTemper's machinery to connect to existing Date types in\ntarget languages.\n\nSome facts about the Gregorian calendar.\n\n /** Indexed by the month number: 1 = January */\n let daysInMonth = [\n 0,\n /* January */ 31,\n /* February */ 28, // Special case leap days\n /* March */ 31,\n /* April */ 30,\n /* May */ 31,\n /* June */ 30,\n /* July */ 31,\n /* August */ 31,\n /* September */ 30,\n /* October */ 31,\n /* November */ 30,\n /* December */ 31,\n ];\n\n let isLeapYear(year: Int): Boolean {\n year % 4 == 0 \u0026\u0026 (year % 100 != 0 || year % 400 == 0)\n }\n\n /**\n * If the decimal representation of \\|num\\| is longer than [padding],\n * then that representation.\n * Otherwise any sign for [num] followed by the prefix of [padding]\n * that would bring the integer portion up to the length of [padding].\n *\n * ```temper\n * pad(\u00220000\u0022, 123) == \u00220123\u0022) \u0026\u0026\n * pad(\u0022000\u0022, 123) == \u0022123\u0022) \u0026\u0026\n * pad(\u002200\u0022, 123) == \u0022123\u0022) \u0026\u0026\n * pad(\u00220000\u0022, -123) == \u0022-0123\u0022) \u0026\u0026\n * pad(\u0022000\u0022, -123) == \u0022-123\u0022) \u0026\u0026\n * pad(\u002200\u0022, -123) == \u0022-123\u0022)\n * ```\n */\n let pad(padding: String, num: Int): String {\n let decimal = num.toString(10);\n var decimalCodePoints = decimal.codePoints;\n let sign: String;\n if (decimalCodePoints.read() == 45 /* - */) {\n sign = \u0022-\u0022;\n decimalCodePoints = decimalCodePoints.advance(1);\n } else {\n sign = \u0022\u0022;\n }\n let paddingCp = padding.codePoints;\n let nNeeded = paddingCp.length - decimalCodePoints.length;\n if (nNeeded \u003c= 0) {\n decimal\n } else {\n let pad = paddingCp.limit(nNeeded).toString();\n let decimalOnly = decimalCodePoints.toString();\n \u0022\u0024{sign}\u0024{pad}\u0024{decimalOnly}\u0022\n }\n }\n\nHere's just enough of a Date type to get us started.\n\n /**\n * A Date identifies a day in the proleptic Gregorian calendar.\n * It is unconnected to a time of day or a timezone.\n */\n @connected(\u0022Date\u0022)\n export class Date {\n /** The year. 1900 means 1900. */\n @connected(\u0022Date::getYear\u0022)\n public year: Int;\n /** The month of the year in [1, 12]. */\n @connected(\u0022Date::getMonth\u0022)\n public month: Int;\n /**\n * The day of the month in [1, 31]\n * additionally constrained by the length of [month].\n */\n @connected(\u0022Date::getDay\u0022)\n public day: Int;\n\n @connected(\u0022Date::constructor\u0022)\n public constructor(year: Int, month: Int, day: Int): Void | Bubble {\n if (1 \u003c= month \u0026\u0026 month \u003c= 12 \u0026\u0026\n 1 \u003c= day \u0026\u0026 (\n (month != 2 || day != 29)\n ? day \u003c= daysInMonth[month]\n : isLeapYear(year))) {\n this.year = year;\n this.month = month;\n this.day = day;\n } else {\n bubble();\n }\n }\n\n /** An ISO 8601 Date string with dashes like \u00222000-12-31\u0022. */\n @connected(\u0022Date::toString\u0022)\n public toString(): String {\n \u0022\u0024{pad(\u00220000\u0022, year)\n }-\u0024{pad(\u002200\u0022, month)\n }-\u0024{pad(\u002200\u0022, day)}\u0022\n }\n\n /**\n * The count of whole years between the two dates.\n *\n * Think of this as floor of the magnitude of a range:\n *\n * ⌊ [start, end] ⌋\n *\n * If you think of it as subtraction, you have to reverse\n * the order of arguments.\n *\n * ⌊ end - start ⌋, NOT ⌊ start - end ⌋\n *\n * \u0022Whole year\u0022 is based on month/day calculations, not\n * day-of-year. This means that there is one full year\n * between 2020-03-01 and 2021-03-01 even though, because\n * February of 2020 has 29 days, 2020-03-01 is the 61st\n * day of 2020 but 2021-03-01 is only the 60th day of\n * that year.\n */\n @connected(\u0022Date::yearsBetween\u0022)\n public static let yearsBetween(start: Date, end: Date): Int {\n let yearDelta = end.year - start.year;\n let monthDelta = end.month - start.month;\n yearDelta - (\n // If the end month/day is before the start's then we\n // don't have a full year.\n (monthDelta \u003c 0 || monthDelta == 0 \u0026\u0026 end.day \u003c start.day)\n ? 1 : 0)\n }\n\n /** Today's date in UTC */\n // TODO: take a zone\n @connected(\u0022Date::today\u0022)\n public static let today(): Date;\n };\n\nTODO: an auto-balancing Date builder.\nParse from ISO\nOther temporal values\nDay of week\n" ], "names": [ "daysInMonth", "isLeapYear", "year", "return", "pad", "padding", "num", "decimal", "decimalCodePoints", "sign", "paddingCp", "nNeeded", "decimalOnly" ], "mappings": "AASI;AAAA;AAAA;
|
|
1
|
+
{ "version": 3, "file": "js/std/temporal.js", "sources": [ "std/temporal.temper.md" ], "sourcesContent": [ "# Temporal\n\nWe're creating an initial Date type to help with developing\nTemper's machinery to connect to existing Date types in\ntarget languages.\n\nSome facts about the Gregorian calendar.\n\n /** Indexed by the month number: 1 = January */\n let daysInMonth = [\n 0,\n /* January */ 31,\n /* February */ 28, // Special case leap days\n /* March */ 31,\n /* April */ 30,\n /* May */ 31,\n /* June */ 30,\n /* July */ 31,\n /* August */ 31,\n /* September */ 30,\n /* October */ 31,\n /* November */ 30,\n /* December */ 31,\n ];\n\n let isLeapYear(year: Int): Boolean {\n year % 4 == 0 \u0026\u0026 (year % 100 != 0 || year % 400 == 0)\n }\n\n /**\n * If the decimal representation of \\|num\\| is longer than [padding],\n * then that representation.\n * Otherwise any sign for [num] followed by the prefix of [padding]\n * that would bring the integer portion up to the length of [padding].\n *\n * ```temper\n * pad(\u00220000\u0022, 123) == \u00220123\u0022) \u0026\u0026\n * pad(\u0022000\u0022, 123) == \u0022123\u0022) \u0026\u0026\n * pad(\u002200\u0022, 123) == \u0022123\u0022) \u0026\u0026\n * pad(\u00220000\u0022, -123) == \u0022-0123\u0022) \u0026\u0026\n * pad(\u0022000\u0022, -123) == \u0022-123\u0022) \u0026\u0026\n * pad(\u002200\u0022, -123) == \u0022-123\u0022)\n * ```\n */\n let pad(padding: String, num: Int): String {\n let decimal = num.toString(10);\n var decimalCodePoints = decimal.codePoints;\n let sign: String;\n if (decimalCodePoints.read() == 45 /* - */) {\n sign = \u0022-\u0022;\n decimalCodePoints = decimalCodePoints.advance(1);\n } else {\n sign = \u0022\u0022;\n }\n let paddingCp = padding.codePoints;\n let nNeeded = paddingCp.length - decimalCodePoints.length;\n if (nNeeded \u003c= 0) {\n decimal\n } else {\n let pad = paddingCp.limit(nNeeded).toString();\n let decimalOnly = decimalCodePoints.toString();\n \u0022\u0024{sign}\u0024{pad}\u0024{decimalOnly}\u0022\n }\n }\n\n // Relates months (one-indexed) to numbers used in day-of-week\n // computations non-leapy.\n let dayOfWeekLookupTableLeapy: List\u003cInt\u003e = [\n 0, // Not a month\n 0, 3, 4, 0, 2, 5, 0, 3, 6, 1, 4, 6,\n ];\n let dayOfWeekLookupTableNotLeapy: List\u003cInt\u003e = [\n 0, // Not a month\n 0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5,\n ];\n\nHere's just enough of a Date type to get us started.\n\n /**\n * A Date identifies a day in the proleptic Gregorian calendar.\n * It is unconnected to a time of day or a timezone.\n */\n @connected(\u0022Date\u0022)\n export class Date {\n /** The year. 1900 means 1900. */\n @connected(\u0022Date::getYear\u0022)\n public year: Int;\n /** The month of the year in [1, 12]. */\n @connected(\u0022Date::getMonth\u0022)\n public month: Int;\n /**\n * The day of the month in [1, 31]\n * additionally constrained by the length of [month].\n */\n @connected(\u0022Date::getDay\u0022)\n public day: Int;\n\n @connected(\u0022Date::constructor\u0022)\n public constructor(year: Int, month: Int, day: Int): Void | Bubble {\n if (1 \u003c= month \u0026\u0026 month \u003c= 12 \u0026\u0026\n 1 \u003c= day \u0026\u0026 (\n (month != 2 || day != 29)\n ? day \u003c= daysInMonth[month]\n : isLeapYear(year))) {\n this.year = year;\n this.month = month;\n this.day = day;\n } else {\n bubble();\n }\n }\n\n /** An ISO 8601 Date string with dashes like \u00222000-12-31\u0022. */\n @connected(\u0022Date::toString\u0022)\n public toString(): String {\n \u0022\u0024{pad(\u00220000\u0022, year)\n }-\u0024{pad(\u002200\u0022, month)\n }-\u0024{pad(\u002200\u0022, day)}\u0022\n }\n\n /**\n * The count of whole years between the two dates.\n *\n * Think of this as floor of the magnitude of a range:\n *\n * ⌊ [start, end] ⌋\n *\n * If you think of it as subtraction, you have to reverse\n * the order of arguments.\n *\n * ⌊ end - start ⌋, NOT ⌊ start - end ⌋\n *\n * \u0022Whole year\u0022 is based on month/day calculations, not\n * day-of-year. This means that there is one full year\n * between 2020-03-01 and 2021-03-01 even though, because\n * February of 2020 has 29 days, 2020-03-01 is the 61st\n * day of 2020 but 2021-03-01 is only the 60th day of\n * that year.\n */\n @connected(\u0022Date::yearsBetween\u0022)\n public static let yearsBetween(start: Date, end: Date): Int {\n let yearDelta = end.year - start.year;\n let monthDelta = end.month - start.month;\n yearDelta - (\n // If the end month/day is before the start's then we\n // don't have a full year.\n (monthDelta \u003c 0 || monthDelta == 0 \u0026\u0026 end.day \u003c start.day)\n ? 1 : 0)\n }\n\n /** Today's date in UTC */\n // TODO: take a zone\n @connected(\u0022Date::today\u0022)\n public static let today(): Date;\n\n /**\n * ISO 8601 weekday number.\n *\n * | Number | Weekday |\n * | ------ | -------- |\n * | 1 | Monday |\n * | 2 | Tuesday |\n * | 3 | Monday |\n * | 4 | Thursday |\n * | 5 | Friday |\n * | 6 | Saturday |\n * | 7 | Sunday |\n */\n @connected(\u0022Date::getDayOfWeek\u0022)\n public get dayOfWeek(): Int {\n // Gauss's method.\n let y = year;\n let c = if (y \u003e= 0) { y / 100 } else { -(-y / 100) };\n let yy = y - (c * 100);\n // See note below about avoiding negative modulus to see why\n // some of the offsets differ from Wikipedia's rendering of\n // Gauss's formula.\n let janFirst = (8 + 5*((yy + 3) % 4) + 3*(yy - 1) + 5*(c % 4)) % 7;\n let table = if (isLeapYear(y)) {\n dayOfWeekLookupTableLeapy\n } else {\n dayOfWeekLookupTableNotLeapy\n };\n let monthOffset = table[month];\n // Gauss's method produces a number in 0..6 but\n // ISO assigns 1..7 where all values are the same\n // except that Sunday is 7 instead of 0.\n // Below we do (day + 6) since that is equivalent to\n // (day - 1) where we end up % 7 but avoids any chance\n // of a negative left operand to `%`.\n let gaussWeekday = (janFirst + (day + 6) + monthOffset) % 7;\n gaussWeekday == 0 ? 7 : gaussWeekday\n }\n };\n\nTODO: an auto-balancing Date builder.\nParse from ISO\nOther temporal values\nDay of week\n" ], "names": [ "daysInMonth", "isLeapYear", "year", "return", "pad", "padding", "num", "decimal", "decimalCodePoints", "sign", "paddingCp", "nNeeded", "decimalOnly", "dayOfWeekLookupTableLeapy", "dayOfWeekLookupTableNotLeapy" ], "mappings": "AASI;AAAA;AAAA;AA0Ea,sEA6GV;AAvLC,4BAAW;AAAf,KAAI,CAAAA,eAAW,EAAG,WAAC,CACjB,CAAC,CACe,GAAE,CACF,GAAE,CACF,GAAE,CACF,GAAE,CACF,GAAE,CACF,GAAE,CACF,GAAE,CACF,GAAE,CACF,GAAE,CACF,GAAE,CACF,GAAE,CACF,GAAE,CACnB;AAED,yDAEC;AAFD,QAAI,CAAAC,cAAU,AAAd,CAAeC,QAAS,CAEvB,AAFkC,EAAA;AAAR,MAAAC,UAAO;AACM,WAAU,CAAA;AAA/C,MAAK,aAAC,CAAA,AAAND,QAAI,CAAG,EAAC,KAAI,EAAC;AAAK,QAAK,aAAC,CAAA,AAANA,QAAI,CAAG,IAAG,KAAI,EAAC;AAAA,MAAAC,UAAA;AAAA;AAAI,aAAU,AAAL,cAAC,CAAA,AAAND,QAAI,CAAG,IAAG,EAAA;AAAV,MAAAC,UAAA,EAAe,AAAf,MAAU,IAAI,EAAC;AAAA;AAAA;AAAC,IAAAA,UAAA;AAAA;AACvD,QAAA,AAF0B,CAAAA,UAAA;AAE1B;AAiBD,sFAmBC;AAnBD,QAAI,CAAAC,OAAG,AAAP,CAAQC,WAAe,CAAE,CAAAC,OAAQ,CAmBhC,AAnB0C,EAAA;AAAP,MAAAH,UAAM;AAMlB,WAA4B,CAAA;AALlD,OAAI,CAAAI,WAAO,EAAO,gBAAQ,CAAA,AAAZD,OAAG,CAAU,GAAE,CAAC;AACN,WAAkB,EAAA,AAAV,qBAAU,CAAA,AAAlBC,WAAO,CAAW,CAAA;AAAvC,KAAC,CAAAC,qBAAiB,EAAG,MAAkB;AAC1C,KAAI,CAAAC,QAAY;AACZ,MAAkB,AAAlBD,qBAAiB,CAAC,IAAI,EAAE,IAAI,GAAE;AAChC,IAAAC,QAAI,AAAJ,EAAU,AAAH,IAAG;AACU,WAA4B,AAA5B,CAAAD,qBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;AAAhD,IAAAA,qBAAiB,AAAjB,EAAgD,AAA5B,MAA4B;AACjD;AACC,IAAAC,QAAI,AAAJ,EAAS,AAAF,GAAE;AAAA;AAEX,OAAI,CAAAC,aAAS,EAAW,qBAAU,CAAA,AAAlBL,WAAO,CAAW;AAClC,OAAI,CAAAM,WAAO,EAAG,CAAAD,aAAS,CAAO,MAAA,AAAhB,EAAmB,CAAAF,qBAAiB,CAAO;AAAA,MACrDG,WAAO,GAAI,EAAC;AACd,IAAAR,UAAA,EAAO,AAAP,CAAAI,WAAO;AAAA;AAEP,SAAI,CAAAH,OAAG,EAA4B,AAAzB,CAAAM,aAAS,CAAC,KAAK,CAACC,WAAO,CAAC,CAAC,QAAQ,EAAE;AAC7C,SAAI,CAAAC,eAAW,EAAqB,AAAlB,CAAAJ,qBAAiB,CAAC,QAAQ,EAAE;AAC9C,IAAAL,UAAA,EAA6B,AAA7B,YAAGM,QAAI,CAAG,CAAAL,OAAG,CAAG,CAAAQ,eAAW,CAAE;AAC9B;AACF,QAAA,AAnBmC,CAAAT,UAAA;AAmBnC;AAI8B,4BAAS;AAAxC,KAAI,CAAAU,6BAAyB,EAAc,WAAC,CAC1C,CAAC,CACD,EAAC,CAAE,EAAC,CAAE,EAAC,CAAE,EAAC,CAAE,EAAC,CAAE,EAAC,CAAE,EAAC,CAAE,EAAC,CAAE,EAAC,CAAE,EAAC,CAAE,EAAC,CAAE,EAAC,CACnC;AACiC,4BAAS;AAA3C,KAAI,CAAAC,gCAA4B,EAAc,WAAC,CAC7C,CAAC,CACD,EAAC,CAAE,EAAC,CAAE,EAAC,CAAE,EAAC,CAAE,EAAC,CAAE,EAAC,CAAE,EAAC,CAAE,EAAC,CAAE,EAAC,CAAE,EAAC,CAAE,EAAC,CAAE,EAAC,CACnC" }
|