Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .roc-version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
nightly-2026-09-16-a49a16f
nightly-2026-10-01-a932c65
2 changes: 1 addition & 1 deletion examples/CliArgs.roc
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ CliArgs := [].{

## Decode argv for an application and report malformed native text as a usage
## error. Applications can then keep their domain logic entirely in Str.
to_strs! : List(OsStr) => Try(List(Str), [Exit(I32), StderrErr(IOErr), ..])
to_strs! : List(OsStr) => Try(List(Str), [Exit(I32), StderrErr(IOErr)])
to_strs! = |os_args|
match decode(os_args) {
Ok(args) => Ok(args)
Expand Down
6 changes: 3 additions & 3 deletions examples/bidi-analysis.roc
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
app [main!] {
pf: platform "https://github.com/roc-lang/basic-cli/releases/download/0.21.0/4rAQg8kUYZ3Vksr4qMQHpaFYNiHSn9GgS7gVxghd1XYV.tar.zst",
pf: platform "https://github.com/roc-lang/basic-cli/releases/download/0.23.0/GNN5tt2gKdX4dhawg4915C4YB193woHFdcCkz31fhGxv.tar.zst",
unicode: "../package/main.roc",
}

Expand Down Expand Up @@ -67,11 +67,11 @@ render = |base, analysis, line| {
\\mirrored-glyphs: ${format_mirrors(Bidi.line_mirroring(line))}
}

main! : List(OsStr) => Try({}, [Exit(I32), StderrErr(IOErr), StdoutErr(IOErr), ..])
main! : List(OsStr) => Try({}, [Exit(I32), StderrErr(IOErr), StdoutErr(IOErr)])
main! = |os_args| {
args = CliArgs.to_strs!(os_args)?
match args {
[_app, base_text, source] => {
[base_text, source] => {
base = match parse_base(base_text) {
Ok(value) => value
Err(UnknownBase(name)) => {
Expand Down
8 changes: 4 additions & 4 deletions examples/count-scalars.roc
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
app [main!] {
pf: platform "https://github.com/roc-lang/basic-cli/releases/download/0.21.0/4rAQg8kUYZ3Vksr4qMQHpaFYNiHSn9GgS7gVxghd1XYV.tar.zst",
pf: platform "https://github.com/roc-lang/basic-cli/releases/download/0.23.0/GNN5tt2gKdX4dhawg4915C4YB193woHFdcCkz31fhGxv.tar.zst",
unicode: "../package/main.roc",
}

Expand Down Expand Up @@ -57,12 +57,12 @@ expect scalar_summary("aé🦘").positions == [
"2: value=129432 bytes=3..7",
]

main! : List(OsStr) => Try({}, [Exit(I32), StderrErr(IOErr), StdoutErr(IOErr), ..])
main! : List(OsStr) => Try({}, [Exit(I32), StderrErr(IOErr), StdoutErr(IOErr)])
main! = |os_args| {
args = CliArgs.to_strs!(os_args)?
text = match args {
[_app] => default_text
[_app, provided] => provided
[] => default_text
[provided] => provided
_ => {
Stderr.line!("usage: count-scalars [TEXT]")?
return Err(Exit(2))
Expand Down
6 changes: 3 additions & 3 deletions examples/decode-utf8-stream.roc
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
app [main!] {
pf: platform "https://github.com/roc-lang/basic-cli/releases/download/0.21.0/4rAQg8kUYZ3Vksr4qMQHpaFYNiHSn9GgS7gVxghd1XYV.tar.zst",
pf: platform "https://github.com/roc-lang/basic-cli/releases/download/0.23.0/GNN5tt2gKdX4dhawg4915C4YB193woHFdcCkz31fhGxv.tar.zst",
unicode: "../package/main.roc",
}

Expand Down Expand Up @@ -163,10 +163,10 @@ expect {
}
}

main! : List(OsStr) => Try({}, [Exit(I32), StderrErr(IOErr), StdoutErr(IOErr), ..])
main! : List(OsStr) => Try({}, [Exit(I32), StderrErr(IOErr), StdoutErr(IOErr)])
main! = |os_args| {
args = CliArgs.to_strs!(os_args)?
chunks = args.drop_first(1)
chunks = args
if chunks.is_empty() {
Stderr.line!("usage: decode-utf8-stream HEX_BYTES [HEX_BYTES ...]")?
Stderr.line!(" bytes are comma-separated; use - for an empty chunk")?
Expand Down
7 changes: 3 additions & 4 deletions examples/encode-code-points.roc
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
app [main!] {
pf: platform "https://github.com/roc-lang/basic-cli/releases/download/0.21.0/4rAQg8kUYZ3Vksr4qMQHpaFYNiHSn9GgS7gVxghd1XYV.tar.zst",
pf: platform "https://github.com/roc-lang/basic-cli/releases/download/0.23.0/GNN5tt2gKdX4dhawg4915C4YB193woHFdcCkz31fhGxv.tar.zst",
unicode: "../package/main.roc",
}

Expand Down Expand Up @@ -62,11 +62,10 @@ expect encode(["D800"], 4) == Err(Surrogate("D800"))
expect encode(["110000"], 4) == Err(OutOfRange("110000"))
expect encode(["1F998"], 3) == Err(LimitExceeded({ limit: 3, required: 4 }))

main! : List(OsStr) => Try({}, [Exit(I32), StderrErr(IOErr), StdoutErr(IOErr), ..])
main! : List(OsStr) => Try({}, [Exit(I32), StderrErr(IOErr), StdoutErr(IOErr)])
main! = |os_args| {
args = CliArgs.to_strs!(os_args)?
user_args = args.drop_first(1)
(limit_text, tokens) = match user_args {
(limit_text, tokens) = match args {
[limit_arg, first, .. as rest] => (limit_arg, [first].concat(rest))
_ => {
Stderr.line!("usage: encode-code-points MAX_OUTPUT_BYTES HEX_CODE_POINT [HEX_CODE_POINT ...]")?
Expand Down
8 changes: 4 additions & 4 deletions examples/estimate-eaw-cells.roc
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
app [main!] {
pf: platform "https://github.com/roc-lang/basic-cli/releases/download/0.21.0/4rAQg8kUYZ3Vksr4qMQHpaFYNiHSn9GgS7gVxghd1XYV.tar.zst",
pf: platform "https://github.com/roc-lang/basic-cli/releases/download/0.23.0/GNN5tt2gKdX4dhawg4915C4YB193woHFdcCkz31fhGxv.tar.zst",
# Use a release bundle URL in applications. The end-to-end suite rewrites
# this local development dependency to the bundle served by the test driver.
unicode: "../package/main.roc",
Expand Down Expand Up @@ -48,12 +48,12 @@ expect measure_cells("世界") == { cells: 4, scalars: 2 }
expect measure_cells("AA") == { cells: 3, scalars: 2 }
expect measure_cells("é") == { cells: 2, scalars: 2 }

main! : List(OsStr) => Try({}, [Exit(I32), StderrErr(IOErr), StdoutErr(IOErr), ..])
main! : List(OsStr) => Try({}, [Exit(I32), StderrErr(IOErr), StdoutErr(IOErr)])
main! = |os_args| {
args = CliArgs.to_strs!(os_args)?
text = match args {
[_app] => default_text
[_app, provided] => provided
[] => default_text
[provided] => provided
_ => {
Stderr.line!("usage: estimate-eaw-cells [TEXT]")?
return Err(Exit(2))
Expand Down
8 changes: 4 additions & 4 deletions examples/font-script-runs.roc
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
app [main!] {
pf: platform "https://github.com/roc-lang/basic-cli/releases/download/0.21.0/4rAQg8kUYZ3Vksr4qMQHpaFYNiHSn9GgS7gVxghd1XYV.tar.zst",
pf: platform "https://github.com/roc-lang/basic-cli/releases/download/0.23.0/GNN5tt2gKdX4dhawg4915C4YB193woHFdcCkz31fhGxv.tar.zst",
unicode: "../package/main.roc",
}

Expand Down Expand Up @@ -114,12 +114,12 @@ expect {
}
}

main! : List(OsStr) => Try({}, [Exit(I32), StderrErr(IOErr), StdoutErr(IOErr), ..])
main! : List(OsStr) => Try({}, [Exit(I32), StderrErr(IOErr), StdoutErr(IOErr)])
main! = |os_args| {
args = CliArgs.to_strs!(os_args)?
request = match args {
[_app, "complete", preferences, source] => Complete({ preferences, source })
[_app, "chunks", max_pending, preferences, first, .. as rest] => {
["complete", preferences, source] => Complete({ preferences, source })
["chunks", max_pending, preferences, first, .. as rest] => {
Chunks({ max_pending, preferences, chunks: [first].concat(rest) })
}
_ => {
Expand Down
6 changes: 3 additions & 3 deletions examples/limit-display-name.roc
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
app [main!] {
pf: platform "https://github.com/roc-lang/basic-cli/releases/download/0.21.0/4rAQg8kUYZ3Vksr4qMQHpaFYNiHSn9GgS7gVxghd1XYV.tar.zst",
pf: platform "https://github.com/roc-lang/basic-cli/releases/download/0.23.0/GNN5tt2gKdX4dhawg4915C4YB193woHFdcCkz31fhGxv.tar.zst",
unicode: "../package/main.roc",
}

Expand Down Expand Up @@ -48,11 +48,11 @@ expect limit_display_name("éclair", 1) == Ok({ slice: "é", truncated: Bool.T
expect limit_display_name("👩🏽‍🚀 mission", 1) == Ok({ slice: "👩🏽‍🚀", truncated: Bool.True })
expect limit_display_name("🇦🇺 team", 1) == Ok({ slice: "🇦🇺", truncated: Bool.True })

main! : List(OsStr) => Try({}, [Exit(I32), StderrErr(IOErr), StdoutErr(IOErr), ..])
main! : List(OsStr) => Try({}, [Exit(I32), StderrErr(IOErr), StdoutErr(IOErr)])
main! = |os_args| {
args = CliArgs.to_strs!(os_args)?
(limit_text, source) = match args {
[_app, limit_arg, display_name] => (limit_arg, display_name)
[limit_arg, display_name] => (limit_arg, display_name)
_ => {
Stderr.line!("usage: limit-display-name MAX_GRAPHEMES DISPLAY_NAME")?
return Err(Exit(2))
Expand Down
8 changes: 4 additions & 4 deletions examples/line-break-opportunities.roc
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
app [main!] {
pf: platform "https://github.com/roc-lang/basic-cli/releases/download/0.21.0/4rAQg8kUYZ3Vksr4qMQHpaFYNiHSn9GgS7gVxghd1XYV.tar.zst",
pf: platform "https://github.com/roc-lang/basic-cli/releases/download/0.23.0/GNN5tt2gKdX4dhawg4915C4YB193woHFdcCkz31fhGxv.tar.zst",
unicode: "../package/main.roc",
}

Expand Down Expand Up @@ -108,12 +108,12 @@ expect {
}
}

main! : List(OsStr) => Try({}, [Exit(I32), StderrErr(IOErr), StdoutErr(IOErr), ..])
main! : List(OsStr) => Try({}, [Exit(I32), StderrErr(IOErr), StdoutErr(IOErr)])
main! = |os_args| {
args = CliArgs.to_strs!(os_args)?
request = match args {
[_app, "complete", profile_text, source] => Complete({ profile_text, source })
[_app, "chunks", profile_text, first, .. as rest] => Chunks({ profile_text, chunks: [first].concat(rest) })
["complete", profile_text, source] => Complete({ profile_text, source })
["chunks", profile_text, first, .. as rest] => Chunks({ profile_text, chunks: [first].concat(rest) })
_ => {
Stderr.line!("usage: line-break-opportunities complete PROFILE TEXT")?
Stderr.line!(" line-break-opportunities chunks PROFILE CHUNK [CHUNK ...]")?
Expand Down
6 changes: 3 additions & 3 deletions examples/shaping-facts.roc
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
app [main!] {
pf: platform "https://github.com/roc-lang/basic-cli/releases/download/0.21.0/4rAQg8kUYZ3Vksr4qMQHpaFYNiHSn9GgS7gVxghd1XYV.tar.zst",
pf: platform "https://github.com/roc-lang/basic-cli/releases/download/0.23.0/GNN5tt2gKdX4dhawg4915C4YB193woHFdcCkz31fhGxv.tar.zst",
unicode: "../package/main.roc",
}

Expand Down Expand Up @@ -140,11 +140,11 @@ expect {
and Emoji.variation_presentation(letter, vs16) == None
}

main! : List(OsStr) => Try({}, [Exit(I32), StderrErr(IOErr), StdoutErr(IOErr), ..])
main! : List(OsStr) => Try({}, [Exit(I32), StderrErr(IOErr), StdoutErr(IOErr)])
main! = |os_args| {
args = CliArgs.to_strs!(os_args)?
source = match args {
[_app, text] => text
[text] => text
_ => {
Stderr.line!("usage: shaping-facts TEXT")?
return Err(Exit(2))
Expand Down
8 changes: 4 additions & 4 deletions examples/split-graphemes.roc
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
app [main!] {
pf: platform "https://github.com/roc-lang/basic-cli/releases/download/0.21.0/4rAQg8kUYZ3Vksr4qMQHpaFYNiHSn9GgS7gVxghd1XYV.tar.zst",
pf: platform "https://github.com/roc-lang/basic-cli/releases/download/0.23.0/GNN5tt2gKdX4dhawg4915C4YB193woHFdcCkz31fhGxv.tar.zst",
unicode: "../package/main.roc",
}

Expand Down Expand Up @@ -58,12 +58,12 @@ expect segment("🇦🇺🦘") == [
]
expect Grapheme.slices("👩‍🚀") == ["👩‍🚀"]

main! : List(OsStr) => Try({}, [Exit(I32), StderrErr(IOErr), StdoutErr(IOErr), ..])
main! : List(OsStr) => Try({}, [Exit(I32), StderrErr(IOErr), StdoutErr(IOErr)])
main! = |os_args| {
args = CliArgs.to_strs!(os_args)?
source = match args {
[_app] => default_text
[_app, provided] => provided
[] => default_text
[provided] => provided
_ => {
Stderr.line!("usage: split-graphemes [TEXT]")?
return Err(Exit(2))
Expand Down
6 changes: 3 additions & 3 deletions examples/stream-grapheme-ranges.roc
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
app [main!] {
pf: platform "https://github.com/roc-lang/basic-cli/releases/download/0.21.0/4rAQg8kUYZ3Vksr4qMQHpaFYNiHSn9GgS7gVxghd1XYV.tar.zst",
pf: platform "https://github.com/roc-lang/basic-cli/releases/download/0.23.0/GNN5tt2gKdX4dhawg4915C4YB193woHFdcCkz31fhGxv.tar.zst",
unicode: "../package/main.roc",
}

Expand Down Expand Up @@ -88,10 +88,10 @@ expect {
}
}

main! : List(OsStr) => Try({}, [Exit(I32), StderrErr(IOErr), StdoutErr(IOErr), ..])
main! : List(OsStr) => Try({}, [Exit(I32), StderrErr(IOErr), StdoutErr(IOErr)])
main! = |os_args| {
args = CliArgs.to_strs!(os_args)?
chunks = args.drop_first(1)
chunks = args
if chunks.is_empty() {
Stderr.line!("usage: stream-grapheme-ranges CHUNK [CHUNK ...]")?
Stderr.line!(" chunks must be scalar-aligned; use - for an empty chunk")?
Expand Down
1 change: 0 additions & 1 deletion package/Bidi.roc
Original file line number Diff line number Diff line change
Expand Up @@ -288,7 +288,6 @@ range_from_offsets = |byte_start, byte_end, scalar_start, scalar_end| {
}

is_p1_range = |source, selected| {

## This deliberately does not call `p1_ranges`: range analysis must not
## allocate one result per preceding paragraph just to validate `selected`.
## A pending CR delays commitment until the next scalar determines whether
Expand Down
1 change: 0 additions & 1 deletion package/InternalCase.roc
Original file line number Diff line number Diff line change
Expand Up @@ -528,7 +528,6 @@ mapping_shape = |mapping, input| match mapping {

append_mapping = |initial, mapping| {
for_mapping(mapping, initial, |bytes, scalar| append_utf8(bytes, scalar))

}

for_mapping = |mapping, initial, emit| match mapping {
Expand Down
6 changes: 3 additions & 3 deletions tests/apps/bidi/main.roc
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ verify_metamorphic_invariants = |protocol_input| {
}

plain = bidi_result(Bidi.analyze_paragraph("אa${empty_input}", Auto, Bidi.default_limits))?
isolated = bidi_result(Bidi.analyze_paragraph("א⁨a⁩a${empty_input}", Auto, Bidi.default_limits))?
isolated = bidi_result(Bidi.analyze_paragraph("א\u(2068)a\u(2069)a${empty_input}", Auto, Bidi.default_limits))?
plain_first = Bidi.entries(plain).get(0) ?? return Err("missing plain first scalar")
plain_last = Bidi.entries(plain).get(1) ?? return Err("missing plain last scalar")
isolated_first = Bidi.entries(isolated).get(0) ?? return Err("missing isolate first scalar")
Expand Down Expand Up @@ -208,13 +208,13 @@ verify_mapping_inverse = |visual_to_logical, logical_to_visual, line_start| {
verify_control_and_bracket_boundaries : Str -> Try({}, Str)
verify_control_and_bracket_boundaries = |protocol_input| {
empty_input = protocol_input.drop_last_bytes(protocol_input.count_utf8_bytes()) ?? return Err("could not derive empty protocol input")
controls = Str.join_with([repeat_text("‫", 126), "a", repeat_text("‬", 126), empty_input], "")
controls = Str.join_with([repeat_text("\u(202B)", 126), "a", repeat_text("\u(202C)", 126), empty_input], "")
control_analysis = bidi_result(Bidi.analyze_paragraph(controls, Auto, Bidi.default_limits))?
verify_level_parity(Bidi.levels(control_analysis))?
if !contains_level(Bidi.levels(control_analysis), 126) {
return Err("deep explicit controls did not reach the permitted I2 level 126")
}
missing_pdi = bidi_result(Bidi.analyze_paragraph("⁨א⁨a${empty_input}", Auto, Bidi.default_limits))?
missing_pdi = bidi_result(Bidi.analyze_paragraph("\u(2068)א\u(2068)a${empty_input}", Auto, Bidi.default_limits))?
verify_level_parity(Bidi.levels(missing_pdi))?

for depth in [62, 63] {
Expand Down
Loading