unison/unison-src/transcripts-using-base/fix4746.md
2024-04-14 20:20:36 -04:00

775 B

Test case for a variable capture problem during let floating. The encloser wasn't accounting for variables bound by matches.

ability Issue t where
  one : '{Issue t} () -> {Issue t} ()
  two : '{Issue t} () -> {Issue t} ()
  three : '{Issue t} () -> {Issue t} ()

x : '{Issue t} () -> {Issue t} ()
x _ = ()

works x = x + 1

run : '{Issue t} () -> '{Stream Text} ()
run s =
  go = cases
    { one x -> resume } ->
      emit "one"
      handle resume !x with go
    { two x -> resume } ->
      emit "two"
      handle resume !x with go
    { three x -> resume } ->
      emit "three"
      handle resume !x with go
    { _ } -> emit "done"
  do handle !s with go

> Stream.toList <| run do
  Issue.one do
    Issue.two do
      ()
    Issue.three do
      ()