Error thrown when a combinator that cannot run on the synchronous interpreter is
reached by runSync. timeout and race are inherently asynchronous — there is no
sync semantics for "wait ms then give up", or for racing concurrent effects.
This is a programmer error, not a domain failure: it says the effect was built
wrong for the terminal it was run with, so recovery combinators deliberately do not
catch it (see rethrowIfNonRecoverable). Before it had its own type it was a
plain Error, indistinguishable from a failed effect, so any downstream .recover()
absorbed it and silently produced the fallback — IO.succeed(1).timeoutTo(50, 99)
returned Right(99) under runSync(). See #246.
Error thrown when a combinator that cannot run on the synchronous interpreter is reached by
runSync.timeoutandraceare inherently asynchronous — there is no sync semantics for "waitmsthen give up", or for racing concurrent effects.This is a programmer error, not a domain failure: it says the effect was built wrong for the terminal it was run with, so recovery combinators deliberately do not catch it (see rethrowIfNonRecoverable). Before it had its own type it was a plain
Error, indistinguishable from a failed effect, so any downstream.recover()absorbed it and silently produced the fallback —IO.succeed(1).timeoutTo(50, 99)returnedRight(99)underrunSync(). See #246.