diff --git a/.changeset/update-effect-beta-79.md b/.changeset/update-effect-beta-79.md
new file mode 100644
index 00000000..3dcaed2f
--- /dev/null
+++ b/.changeset/update-effect-beta-79.md
@@ -0,0 +1,5 @@
+---
+"@effect/tsgo": patch
+---
+
+Update Effect v4 package references and embedded test fixtures to `4.0.0-beta.83`.
diff --git a/.specs/tsgo-cli-only.md b/.specs/tsgo-cli-only.md
index 67110b0c..6973b38c 100644
--- a/.specs/tsgo-cli-only.md
+++ b/.specs/tsgo-cli-only.md
@@ -15,8 +15,8 @@ Define `@effect/tsgo` as a CLI-only package, with command-driven usage and no li
3. The package must not define or maintain a `/lib` distribution contract for consumers.
4. Consumers must not be expected to import exported helper functions from `@effect/tsgo`.
5. Any behavior currently accessible by exported functions must be available through CLI commands instead.
-6. The CLI package dependency on `effect` must use this exact package version target: `4.0.0-beta.11`.
-7. The CLI package dependency on `@effect/platform-node` must use this exact package version target: `4.0.0-beta.11`.
+6. The CLI package dependency on `effect` must use this exact package version target: `4.0.0-beta.83`.
+7. The CLI package dependency on `@effect/platform-node` must use this exact package version target: `4.0.0-beta.83`.
8. CLI builds must use a coherent Effect pre-release dependency graph: resolved `@effect/*` packages consumed by the CLI must be mutually compatible with the pinned `effect` target and must not mix incompatible beta lines.
9. CI and release workflows that build the CLI must use lockfile-immutable dependency installation so dependency resolution does not drift between local and CI runs.
10. Any intentional dependency graph update for CLI runtime packages must be accompanied by lockfile updates and successful CLI build validation in the same change.
diff --git a/_packages/tsgo/package.json b/_packages/tsgo/package.json
index 7c364768..9eb5086e 100644
--- a/_packages/tsgo/package.json
+++ b/_packages/tsgo/package.json
@@ -39,12 +39,12 @@
"@effect/tsgo-darwin-arm64": "workspace:*"
},
"devDependencies": {
- "@effect/platform-node": "^4.0.0-beta.66",
- "@effect/platform-node-shared": "^4.0.0-beta.66",
+ "@effect/platform-node": "^4.0.0-beta.83",
+ "@effect/platform-node-shared": "^4.0.0-beta.83",
"@types/node": "^24.3.0",
"tsdown": "^0.20.1",
"typescript": "^5.9.2",
- "effect": "^4.0.0-beta.66",
+ "effect": "^4.0.0-beta.83",
"vitest": "^3.2.1"
}
}
diff --git a/go.work.sum b/go.work.sum
index d1ca0553..3f99f034 100644
--- a/go.work.sum
+++ b/go.work.sum
@@ -5,6 +5,7 @@ golang.org/x/crypto v0.47.0/go.mod h1:ff3Y9VzzKbwSSEzWqJsJVBnWmRwRSHt/6Op5n9bQc4
golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos=
golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA=
golang.org/x/crypto v0.50.0/go.mod h1:3muZ7vA7PBCE6xgPX7nkzzjiUq87kRItoJQM1Yo8S+Q=
+golang.org/x/crypto v0.51.0/go.mod h1:8AdwkbraGNABw2kOX6YFPs3WM22XqI4EXEd8g+x7Oc8=
golang.org/x/mod v0.32.0/go.mod h1:SgipZ/3h2Ci89DlEtEXWUk/HteuRin+HHhN+WbNhguU=
golang.org/x/mod v0.33.0/go.mod h1:swjeQEj+6r7fODbD2cqrnje9PnziFuw4bmLbBZFrQ5w=
golang.org/x/mod v0.34.0/go.mod h1:ykgH52iCZe79kzLLMhyCUzhMci+nQj+0XkbXpNYtVjY=
diff --git a/internal/typeparser/effect_model_type.go b/internal/typeparser/effect_model_type.go
index 0ae6b8b3..2d82debb 100644
--- a/internal/typeparser/effect_model_type.go
+++ b/internal/typeparser/effect_model_type.go
@@ -27,8 +27,10 @@ func isEffectModelTypeSourceFile(_ *TypeParser, c *checker.Checker, sf *ast.Sour
if c.TryGetMemberInModuleExportsAndProperties("Class", moduleSym) == nil {
return false
}
- // Generated is unique to Model, not present in Schema
- if c.TryGetMemberInModuleExportsAndProperties("Generated", moduleSym) == nil {
+ // Generated was split into GeneratedByDb / GeneratedByApp in newer v4 betas.
+ if c.TryGetMemberInModuleExportsAndProperties("Generated", moduleSym) == nil &&
+ c.TryGetMemberInModuleExportsAndProperties("GeneratedByDb", moduleSym) == nil &&
+ c.TryGetMemberInModuleExportsAndProperties("GeneratedByApp", moduleSym) == nil {
return false
}
// FieldOption is unique to v4 Model
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 99030d73..0fc5bc60 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -37,17 +37,17 @@ importers:
version: link:../tsgo-win32-x64
devDependencies:
'@effect/platform-node':
- specifier: ^4.0.0-beta.66
- version: 4.0.0-beta.66(effect@4.0.0-beta.66)(ioredis@5.9.2)
+ specifier: ^4.0.0-beta.83
+ version: 4.0.0-beta.83(effect@4.0.0-beta.83)(ioredis@5.9.2)
'@effect/platform-node-shared':
- specifier: ^4.0.0-beta.66
- version: 4.0.0-beta.66(effect@4.0.0-beta.66)
+ specifier: ^4.0.0-beta.83
+ version: 4.0.0-beta.83(effect@4.0.0-beta.83)
'@types/node':
specifier: ^24.3.0
version: 24.10.13
effect:
- specifier: ^4.0.0-beta.66
- version: 4.0.0-beta.66
+ specifier: ^4.0.0-beta.83
+ version: 4.0.0-beta.83
tsdown:
specifier: ^0.20.1
version: 0.20.3(typescript@5.9.3)
@@ -117,8 +117,8 @@ importers:
specifier: ^22.0.0
version: 22.19.15
effect:
- specifier: 4.0.0-beta.66
- version: 4.0.0-beta.66
+ specifier: 4.0.0-beta.83
+ version: 4.0.0-beta.83
fast-check:
specifier: ^4.4.0
version: 4.5.3
@@ -135,8 +135,8 @@ importers:
specifier: ^22.0.0
version: 22.19.15
effect:
- specifier: 4.0.0-beta.66
- version: 4.0.0-beta.66
+ specifier: 4.0.0-beta.83
+ version: 4.0.0-beta.83
fast-check:
specifier: ^4.4.0
version: 4.5.3
@@ -153,8 +153,8 @@ importers:
specifier: ^22.0.0
version: 22.19.15
effect:
- specifier: 4.0.0-beta.66
- version: 4.0.0-beta.66
+ specifier: 4.0.0-beta.83
+ version: 4.0.0-beta.83
fast-check:
specifier: ^4.4.0
version: 4.5.3
@@ -244,17 +244,17 @@ packages:
'@changesets/write@0.4.0':
resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==}
- '@effect/platform-node-shared@4.0.0-beta.66':
- resolution: {integrity: sha512-+ymrhBnESv/hmn5SKTe2//IY9Ox/hGPeoogEWhW47ZGyhFI5eMYFxdEUBa+3IAV05rrBzrxON9lynu68n0DM7w==}
+ '@effect/platform-node-shared@4.0.0-beta.83':
+ resolution: {integrity: sha512-+yr/+PJmKTgmJq1QOINSBPgLu7Cjc4CZcotBXnGjyDEizOmimFgTkN2B8PBJAKIKUWYWfobjXqC+58/VhhPKAw==}
engines: {node: '>=18.0.0'}
peerDependencies:
- effect: ^4.0.0-beta.66
+ effect: ^4.0.0-beta.83
- '@effect/platform-node@4.0.0-beta.66':
- resolution: {integrity: sha512-s/0RgaQFuszzdorRnX1PwEQNnSOi+JgMJo3zEe9O2NR3sosMhTr0Uk+1AF6bUOI9uJ2CPT3KpTIIU7q5/TpOkg==}
+ '@effect/platform-node@4.0.0-beta.83':
+ resolution: {integrity: sha512-RmpVGu/+X/Bif3/g1Rzj8oFzTOknoVB3yHCa0b179vytPpKe+Kj9ZwKNcAnKWqHUDkbSPBq1Ca60mvOHr2/+LQ==}
engines: {node: '>=18.0.0'}
peerDependencies:
- effect: ^4.0.0-beta.66
+ effect: ^4.0.0-beta.83
ioredis: ^5.7.0
'@emnapi/core@1.8.1':
@@ -453,33 +453,33 @@ packages:
'@manypkg/get-packages@1.1.3':
resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==}
- '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3':
- resolution: {integrity: sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==}
+ '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.4':
+ resolution: {integrity: sha512-LCkGo6JDfaBhgST7UpPWgNgLINpcpabaHfyz5OBx75nUYxBsaEPxjnyNjWpeb/xBup/682QnBfRBy2/LvPutZQ==}
cpu: [arm64]
os: [darwin]
- '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3':
- resolution: {integrity: sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==}
+ '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.4':
+ resolution: {integrity: sha512-zExlW9zUJKZH/tOtVMttwjKa4Xm/3KcNjnE3dPN92uCktwavMxpgCA3MoJK/DOnTWsQgo224OaST27/mPNAf+w==}
cpu: [x64]
os: [darwin]
- '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3':
- resolution: {integrity: sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==}
+ '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.4':
+ resolution: {integrity: sha512-dgX0P/9wGPJeHFBG+ZmhgE6bmtMt7NP5CRBGyyktpopdk/mW4POnrpQsSLtKI1dwpc+pPLuXHDh6vvskyQE/sw==}
cpu: [arm64]
os: [linux]
- '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3':
- resolution: {integrity: sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==}
+ '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.4':
+ resolution: {integrity: sha512-Tg3yX65f5GbtXLkrYEHE5oibZG9epyYWas7FogTTEJeDEF9JlXJzKgXaNhT3UXlTOeA+AfZpYZYZ0uPj7Cfquw==}
cpu: [arm]
os: [linux]
- '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3':
- resolution: {integrity: sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==}
+ '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.4':
+ resolution: {integrity: sha512-8TNXMEjJc3QEy7R/x1INhgiU+XakDAFUzBhaz7+Rbrs8NH5UQeHQxxmzsSBJGyV6I1jW79undiQm8tOI+D+8FQ==}
cpu: [x64]
os: [linux]
- '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3':
- resolution: {integrity: sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==}
+ '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.4':
+ resolution: {integrity: sha512-CmCXPQrkbwExx3j946/PtHWHbYJiCRBRDl4BlkRQcJB/YOwQxJRTpoo7aTsortjgoJ1x7opzTSxn7C+ASSLVjQ==}
cpu: [x64]
os: [win32]
@@ -876,8 +876,8 @@ packages:
effect@3.19.19:
resolution: {integrity: sha512-Yc8U/SVXo2dHnaP7zNBlAo83h/nzSJpi7vph6Hzyl4ulgMBIgPmz3UzOjb9sBgpFE00gC0iETR244sfXDNLHRg==}
- effect@4.0.0-beta.66:
- resolution: {integrity: sha512-4arEr62cziFa8BBVDUwJCJJmaVepXf/kRg7KtC0h8+bufngscrHbwWFhr9c+HonwOF+31U3iD3xUJmw9KzX7Dw==}
+ effect@4.0.0-beta.83:
+ resolution: {integrity: sha512-0wsak8RtgGAr9UWSbVDgJHZcUqMSvicHcvaZv1MbMM7MCGgW4Rn/137J1MHQbwYPcwYGxT/IqehFd+UbYuj78w==}
empathic@2.0.0:
resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==}
@@ -995,9 +995,9 @@ packages:
resolution: {integrity: sha512-B6Lc2s6yApwnD2/pMzFh/d5AVjdsDXjgkeJ766FmFuJELIGHNycKRj+l3A39yZPM4CchqNCB4RITEAYB1KUM6A==}
engines: {node: '>=20.19.0'}
- ini@6.0.0:
- resolution: {integrity: sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==}
- engines: {node: ^20.17.0 || >=22.9.0}
+ ini@7.0.0:
+ resolution: {integrity: sha512-ifK0CgjALofS5bkrcTy4RaQ9Vx2Knf/eLeIO+NaswQEpH1UblrtTSCIvN71qQDMq0PeQ/SSPojvEJp9vvvfr+w==}
+ engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0}
ioredis@5.9.2:
resolution: {integrity: sha512-tAAg/72/VxOUW7RQSX1pIxJVucYKcjFjfvj60L57jrZpYCHC3XN0WCQ3sNYL4Gmvv+7GPvTAjc+KSdeNuE8oWQ==}
@@ -1087,12 +1087,12 @@ packages:
ms@2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
- msgpackr-extract@3.0.3:
- resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==}
+ msgpackr-extract@3.0.4:
+ resolution: {integrity: sha512-4kmO/MdyUIkLIvTPr8VHLil4AtoKIoniWPIEk5+CDy0xnWC84azhSFmuJ7PxZdsYtiP5kEeQsORAVIeMgxT+Hw==}
hasBin: true
- msgpackr@1.11.12:
- resolution: {integrity: sha512-RBdJ1Un7yGlXWajrkxcSa93nvQ0w4zBf60c0yYv7YtBelP8H2FA7XsfBbMHtXKXUMUxH7zV3Zuozh+kUQWhHvg==}
+ msgpackr@2.0.4:
+ resolution: {integrity: sha512-o1C5KRmuRt+apqMr1HuGSqWStZoRBUpEsCsl15uM9VdAF1qHLtvMOU2En747EnTyEl6c4pzPewRMFF31s1CNbA==}
multipasta@0.2.7:
resolution: {integrity: sha512-KPA58d68KgGil15oDqXjkUBEBYc00XvbPj5/X+dyzeo/lWm9Nc25pQRlf1D+gv4OpK7NM0J1odrbu9JNNGvynA==}
@@ -1410,8 +1410,8 @@ packages:
synckit:
optional: true
- uuid@13.0.0:
- resolution: {integrity: sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==}
+ uuid@14.0.0:
+ resolution: {integrity: sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==}
hasBin: true
vite-node@3.2.4:
@@ -1683,19 +1683,19 @@ snapshots:
human-id: 4.1.3
prettier: 2.8.8
- '@effect/platform-node-shared@4.0.0-beta.66(effect@4.0.0-beta.66)':
+ '@effect/platform-node-shared@4.0.0-beta.83(effect@4.0.0-beta.83)':
dependencies:
'@types/ws': 8.18.1
- effect: 4.0.0-beta.66
+ effect: 4.0.0-beta.83
ws: 8.20.0
transitivePeerDependencies:
- bufferutil
- utf-8-validate
- '@effect/platform-node@4.0.0-beta.66(effect@4.0.0-beta.66)(ioredis@5.9.2)':
+ '@effect/platform-node@4.0.0-beta.83(effect@4.0.0-beta.83)(ioredis@5.9.2)':
dependencies:
- '@effect/platform-node-shared': 4.0.0-beta.66(effect@4.0.0-beta.66)
- effect: 4.0.0-beta.66
+ '@effect/platform-node-shared': 4.0.0-beta.83(effect@4.0.0-beta.83)
+ effect: 4.0.0-beta.83
ioredis: 5.9.2
mime: 4.1.0
undici: 8.2.0
@@ -1836,22 +1836,22 @@ snapshots:
globby: 11.1.0
read-yaml-file: 1.1.0
- '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3':
+ '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.4':
optional: true
- '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3':
+ '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.4':
optional: true
- '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3':
+ '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.4':
optional: true
- '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3':
+ '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.4':
optional: true
- '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3':
+ '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.4':
optional: true
- '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3':
+ '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.4':
optional: true
'@napi-rs/wasm-runtime@1.1.1':
@@ -2151,17 +2151,17 @@ snapshots:
'@standard-schema/spec': 1.1.0
fast-check: 3.23.2
- effect@4.0.0-beta.66:
+ effect@4.0.0-beta.83:
dependencies:
'@standard-schema/spec': 1.1.0
fast-check: 4.8.0
find-my-way-ts: 0.1.6
- ini: 6.0.0
+ ini: 7.0.0
kubernetes-types: 1.30.0
- msgpackr: 1.11.12
+ msgpackr: 2.0.4
multipasta: 0.2.7
toml: 4.1.1
- uuid: 13.0.0
+ uuid: 14.0.0
yaml: 2.9.0
empathic@2.0.0: {}
@@ -2297,7 +2297,7 @@ snapshots:
import-without-cache@0.2.5: {}
- ini@6.0.0: {}
+ ini@7.0.0: {}
ioredis@5.9.2:
dependencies:
@@ -2377,21 +2377,21 @@ snapshots:
ms@2.1.3: {}
- msgpackr-extract@3.0.3:
+ msgpackr-extract@3.0.4:
dependencies:
node-gyp-build-optional-packages: 5.2.2
optionalDependencies:
- '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.3
- '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.3
- '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.3
- '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.3
- '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.3
- '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.3
+ '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.4
+ '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.4
+ '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.4
+ '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.4
+ '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.4
+ '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.4
optional: true
- msgpackr@1.11.12:
+ msgpackr@2.0.4:
optionalDependencies:
- msgpackr-extract: 3.0.3
+ msgpackr-extract: 3.0.4
multipasta@0.2.7: {}
@@ -2671,7 +2671,7 @@ snapshots:
dependencies:
rolldown: 1.0.0-rc.3
- uuid@13.0.0: {}
+ uuid@14.0.0: {}
vite-node@3.2.4(@types/node@24.10.13)(yaml@2.9.0):
dependencies:
diff --git a/testdata/baselines/reference/README.md b/testdata/baselines/reference/README.md
index f9658f80..1c799aa0 100644
--- a/testdata/baselines/reference/README.md
+++ b/testdata/baselines/reference/README.md
@@ -93,6 +93,7 @@ Some diagnostics are off by default or have a default severity of suggestion, bu
unsafeEffectTypeAssertion | ➖ | 🔧 | Detects unsafe type assertions that narrow Effect, Stream, or Layer error or requirements channels | ✓ | ✓ |
| Style Cleanup, consistency, and idiomatic Effect code. |
catchAllToMapError | 💡 | 🔧 | Suggests using Effect.mapError instead of Effect.catch + Effect.fail | ✓ | ✓ |
+ catchToOrElseSucceed | 💡 | 🔧 | Suggests using Effect.orElseSucceed instead of Effect.catch + Effect.succeed | ✓ | ✓ |
deterministicKeys | ➖ | 🔧 | Enforces deterministic naming for service/tag/error identifiers based on class names | ✓ | ✓ |
effectDoNotation | ➖ | | Suggests using Effect.gen or Effect.fn instead of the Effect.Do notation helpers | ✓ | ✓ |
effectFnOpportunity | 💡 | 🔧 | Suggests using Effect.fn for functions that return an Effect | ✓ | ✓ |
@@ -103,8 +104,11 @@ Some diagnostics are off by default or have a default severity of suggestion, bu
missingEffectServiceDependency | ➖ | | Checks that Effect.Service dependencies satisfy all required layer inputs | ✓ | |
multipleCatchTag | 💡 | | Suggests collapsing consecutive Effect.catchTag transformations into a single Effect.catchTags call when semantics stay equivalent | | ✓ |
nestedEffectGenYield | ➖ | | Warns when yielding a nested bare Effect.gen inside an existing Effect generator context | ✓ | ✓ |
+ newSchemaClass | ➖ | 🔧 | Suggests using Schema make instead of new for Schema classes | | ✓ |
redundantMapError | 💡 | | Suggests hoisting a repeated trailing Effect.mapError from every yield in an Effect generator | ✓ | ✓ |
+ redundantOrDie | 💡 | | Suggests hoisting a repeated trailing Effect.orDie from every yield in an Effect generator | ✓ | ✓ |
redundantSchemaTagIdentifier | 💡 | 🔧 | Suggests removing redundant identifier argument when it equals the tag value in Schema.TaggedClass/TaggedError/TaggedRequest | ✓ | ✓ |
+ schemaNumber | 💡 | 🔧 | Suggests Schema.Finite and Schema.FiniteFromString instead of Schema.Number APIs when describing domain numbers | | ✓ |
schemaStructWithTag | 💡 | 🔧 | Suggests using Schema.TaggedStruct instead of Schema.Struct with _tag field | ✓ | ✓ |
schemaUnionOfLiterals | ➖ | 🔧 | Suggests combining multiple Schema.Literal calls in Schema.Union into a single Schema.Literal | ✓ | |
serviceNotAsClass | ➖ | 🔧 | Warns when Context.Service is used as a variable instead of a class declaration | | ✓ |
diff --git a/testdata/baselines/reference/effect-v4/catchUnfailableEffect.flows.catchUnfailableEffect.mermaid b/testdata/baselines/reference/effect-v4/catchUnfailableEffect.flows.catchUnfailableEffect.mermaid
index c2576525..f63da760 100644
--- a/testdata/baselines/reference/effect-v4/catchUnfailableEffect.flows.catchUnfailableEffect.mermaid
+++ b/testdata/baselines/reference/effect-v4/catchUnfailableEffect.flows.catchUnfailableEffect.mermaid
@@ -6,7 +6,7 @@ flowchart TB
4["type: Effect#lt;number, never, never#gt;
callee: Effect.succeed
args: #91;#93;"]
5[/"type: #lt;A#gt;#40;value: A#41; =#gt; Effect#lt;A, never, never#gt;
node: Effect.succeed"/]
6["type: Effect#lt;void #124; number, never, never#gt;
callee: Effect.catchTag
args: #91;#quot;MyError#quot;, #40;#41; =#gt; Effect.void#93;"]
- 7[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #125;
node: Effect.catchTag"/]
+ 7[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = unassigned, E2 = never, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = unassigned, E2 = never, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #125;
node: Effect.catchTag"/]
8[/"type: #quot;MyError#quot;
node: #quot;MyError#quot;"/]
9[["type: #40;#41; =#gt; Effect#lt;void, never, never#gt;
node: #40;#41; =#gt; Effect.void"]]
10[/"type: Effect#lt;void, never, never#gt;
node: Effect.void"/]
@@ -14,7 +14,7 @@ flowchart TB
12["type: Effect#lt;number, never, never#gt;
callee: Effect.succeed
args: #91;#93;"]
13[/"type: #lt;A#gt;#40;value: A#41; =#gt; Effect#lt;A, never, never#gt;
node: Effect.succeed"/]
14["type: Effect#lt;void #124; number, never, never#gt;
callee: Effect.catchTag
args: #91;#quot;MyError#quot;, #40;#41; =#gt; Effect.void#93;"]
- 15[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #125;
node: Effect.catchTag"/]
+ 15[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = unassigned, E2 = never, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = unassigned, E2 = never, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #125;
node: Effect.catchTag"/]
16[/"type: #quot;MyError#quot;
node: #quot;MyError#quot;"/]
17[["type: #40;#41; =#gt; Effect#lt;void, never, never#gt;
node: #40;#41; =#gt; Effect.void"]]
18[/"type: Effect#lt;void, never, never#gt;
node: Effect.void"/]
@@ -22,20 +22,20 @@ flowchart TB
20["type: Effect#lt;number, never, never#gt;
callee: Effect.succeed
args: #91;#93;"]
21[/"type: #lt;A#gt;#40;value: A#41; =#gt; Effect#lt;A, never, never#gt;
node: Effect.succeed"/]
22["type: Effect#lt;number, never, never#gt;
callee: Effect.catchTags
args: #91;#123;#125;#93;"]
- 23[/"type: #123; #lt;E, Cases extends #123; #91;K in Extract#lt;E, #123; _tag: string; #125;#gt;#91;#quot;_tag#quot;#93;#93;+?: #40;#40;error: Extract#lt;E, #123; _tag: K; #125;#gt;#41; =#gt; Effect#lt;any, any, any#gt;#41;; #125; #amp; #40;unknown extends E ? #123;#125; : #123; #91;K in Exclude#lt;keyof Cases, Extract#lt;E, #123; _tag: string; #125;#gt;#91;#quot;_tag#quot;#93;#gt;#93;: never; #125;#41;, A2 = never, E2 = Exclude#lt;E, #123; _tag: keyof Cases; #125;#gt;, R2 = never#gt;#40;cases: Cases, orElse?: #40;#40;e: Exclude#lt;E, #123; _tag: keyof Cases; #125;#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A2 #124; #123; #91;K in keyof Cases#93;: Cases#91;K#93; extends #40;...args: any#91;#93;#41; =#gt; Effect#lt;infer A, any, any#gt; ? A : never; #125;#91;keyof Cases#93;, E2 #124; #123; #91;K in keyof Cases#93;: Cases#91;K#93; extends #40;...args: any#91;#93;#41; =#gt; Effect#lt;any, infer E, any#gt; ? E : never; #125;#91;keyof Cases#93;, R #124; R2 #124; #123; #91;K in keyof Cases#93;: Cases#91;K#93; extends #40;...args: any#91;#93;#41; =#gt; Effect#lt;any, any, infer R#gt; ? R : never; #125;#91;keyof Cases#93;#gt;; #lt;R, E, A, Cases extends #123; #91;K in Extract#lt;E, #123; _tag: string; #125;#gt;#91;#quot;_tag#quot;#93;#93;+?: #40;#40;error: Extract#lt;E, #123; _tag: K; #125;#gt;#41; =#gt; Effect#lt;any, any, any#gt;#41;; #125; #amp; #40;unknown extends E ? #123;#125; : #123; #91;K in Exclude#lt;keyof Cases, Extract#lt;E, #123; _tag: string; #125;#gt;#91;#quot;_tag#quot;#93;#gt;#93;: never; #125;#41;, A2 = never, E2 = Exclude#lt;E, #123; _tag: keyof Cases; #125;#gt;, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, cases: Cases, orElse?: #40;#40;e: Exclude#lt;E, #123; _tag: keyof Cases; #125;#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; A2 #124; #123; #91;K in keyof Cases#93;: Cases#91;K#93; extends #40;...args: any#91;#93;#41; =#gt; Effect#lt;infer A, any, any#gt; ? A : never; #125;#91;keyof Cases#93;, E2 #124; #123; #91;K in keyof Cases#93;: Cases#91;K#93; extends #40;...args: any#91;#93;#41; =#gt; Effect#lt;any, infer E, any#gt; ? E : never; #125;#91;keyof Cases#93;, R #124; R2 #124; #123; #91;K in keyof Cases#93;: Cases#91;K#93; extends #40;...args: any#91;#93;#41; =#gt; Effect#lt;any, any, infer R#gt; ? R : never; #125;#91;keyof Cases#93;#gt;; #125;
node: Effect.catchTags"/]
+ 23[/"type: #123; #lt;E, Cases extends #123; #91;K in Extract#lt;E, #123; _tag: string; #125;#gt;#91;#quot;_tag#quot;#93;#93;+?: #40;#40;error: Extract#lt;E, #123; _tag: K; #125;#gt;#41; =#gt; Effect#lt;any, any, any#gt;#41;; #125; #amp; #40;unknown extends E ? #123;#125; : #123; #91;K in Exclude#lt;keyof Cases, Extract#lt;E, #123; _tag: string; #125;#gt;#91;#quot;_tag#quot;#93;#gt;#93;: never; #125;#41;, A2 = unassigned, E2 = never, R2 = never#gt;#40;cases: Cases, orElse?: #40;#40;e: Exclude#lt;E, #123; _tag: keyof Cases; #125;#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; #123; #91;K in keyof Cases#93;: Cases#91;K#93; extends #40;...args: any#91;#93;#41; =#gt; Effect#lt;infer A, any, any#gt; ? A : never; #125;#91;keyof Cases#93; #124; Exclude#lt;A2, unassigned#gt;, E2 #124; #123; #91;K in keyof Cases#93;: Cases#91;K#93; extends #40;...args: any#91;#93;#41; =#gt; Effect#lt;any, infer E, any#gt; ? E : never; #125;#91;keyof Cases#93; #124; #40;A2 extends unassigned ? Exclude#lt;E, #123; _tag: keyof Cases; #125;#gt; : never#41;, R #124; R2 #124; #123; #91;K in keyof Cases#93;: Cases#91;K#93; extends #40;...args: any#91;#93;#41; =#gt; Effect#lt;any, any, infer R#gt; ? R : never; #125;#91;keyof Cases#93;#gt;; #lt;R, E, A, Cases extends #123; #91;K in Extract#lt;E, #123; _tag: string; #125;#gt;#91;#quot;_tag#quot;#93;#93;+?: #40;#40;error: Extract#lt;E, #123; _tag: K; #125;#gt;#41; =#gt; Effect#lt;any, any, any#gt;#41;; #125; #amp; #40;unknown extends E ? #123;#125; : #123; #91;K in Exclude#lt;keyof Cases, Extract#lt;E, #123; _tag: string; #125;#gt;#91;#quot;_tag#quot;#93;#gt;#93;: never; #125;#41;, A2 = unassigned, E2 = never, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, cases: Cases, orElse?: #40;#40;e: Exclude#lt;E, #123; _tag: keyof Cases; #125;#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; #123; #91;K in keyof Cases#93;: Cases#91;K#93; extends #40;...args: any#91;#93;#41; =#gt; Effect#lt;infer A, any, any#gt; ? A : never; #125;#91;keyof Cases#93; #124; Exclude#lt;A2, unassigned#gt;, E2 #124; #123; #91;K in keyof Cases#93;: Cases#91;K#93; extends #40;...args: any#91;#93;#41; =#gt; Effect#lt;any, infer E, any#gt; ? E : never; #125;#91;keyof Cases#93; #124; #40;A2 extends unassigned ? Exclude#lt;E, #123; _tag: keyof Cases; #125;#gt; : never#41;, R #124; R2 #124; #123; #91;K in keyof Cases#93;: Cases#91;K#93; extends #40;...args: any#91;#93;#41; =#gt; Effect#lt;any, any, infer R#gt; ? R : never; #125;#91;keyof Cases#93;#gt;; #125;
node: Effect.catchTags"/]
24[/"type: #123;#125;
node: #123;#125;"/]
25[/"type: 42
node: 42"/]
26["type: Effect#lt;number, never, never#gt;
callee: Effect.succeed
args: #91;#93;"]
27[/"type: #lt;A#gt;#40;value: A#41; =#gt; Effect#lt;A, never, never#gt;
node: Effect.succeed"/]
28["type: Effect#lt;void #124; number, never, never#gt;
callee: Effect.catchIf
args: #91;#40;e#41; =#gt; true, #40;#41; =#gt; Effect.void#93;"]
- 29[/"type: #123; #lt;E, EB extends E, A2, E2, R2, A3 = never, E3 = Exclude#lt;E, EB#gt;, R3 = never#gt;#40;refinement: Refinement#lt;NoInfer#lt;E#gt;, EB#gt;, f: #40;e: EB#41; =#gt; Effect#lt;A2, E2, R2#gt;, orElse?: #40;#40;e: Exclude#lt;E, EB#gt;#41; =#gt; Effect#lt;A3, E3, R3#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A2 #124; A3, E2 #124; E3, R #124; R2 #124; R3#gt;; #lt;E, A2, E2, R2, A3 = never, E3 = E, R3 = never#gt;#40;predicate: Predicate#lt;NoInfer#lt;E#gt;#gt;, f: #40;e: NoInfer#lt;E#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;, orElse?: #40;#40;e: NoInfer#lt;E#gt;#41; =#gt; Effect#lt;A3, E3, R3#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A2 #124; A3, E2 #124; E3, R #124; R2 #124; R3#gt;; #lt;A, E, R, EB extends E, A2, E2, R2, A3 = never, E3 = Exclude#lt;E, EB#gt;, R3 = never#gt;#40;self: Effect#lt;A, E, R#gt;, refinement: Refinement#lt;E, EB#gt;, f: #40;e: EB#41; =#gt; Effect#lt;A2, E2, R2#gt;, orElse?: #40;#40;e: Exclude#lt;E, EB#gt;#41; =#gt; Effect#lt;A3, E3, R3#gt;#41; #124; undefined#41;: Effect#lt;A #124; A2 #124; A3, E2 #124; E3, R #124; R2 #124; R3#gt;; #lt;A, E, R, A2, E2, R2, A3 = never, E3 = E, R3 = never#gt;#40;self: Effect#lt;A, E, R#gt;, predicate: Predicate#lt;E#gt;, f: #40;e: E#41; =#gt; Effect#lt;A2, E2, R2#gt;, orElse?: #40;#40;e: E#41; =#gt; Effect#lt;A3, E3, R3#gt;#41; #124; undefined#41;: Effect#lt;A #124; A2 #124; A3, E2 #124; E3, R #124; R2 #124; R3#gt;; #125;
node: Effect.catchIf"/]
+ 29[/"type: #123; #lt;E, EB extends E, A2, E2, R2, A3 = unassigned, E3 = never, R3 = never#gt;#40;refinement: Refinement#lt;NoInfer#lt;E#gt;, EB#gt;, f: #40;e: EB#41; =#gt; Effect#lt;A2, E2, R2#gt;, orElse?: #40;#40;e: Exclude#lt;E, EB#gt;#41; =#gt; Effect#lt;A3, E3, R3#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A2 #124; Exclude#lt;A3, unassigned#gt;, E2 #124; E3 #124; #40;A3 extends unassigned ? Exclude#lt;E, EB#gt; : never#41;, R #124; R2 #124; R3#gt;; #lt;E, A2, E2, R2, A3 = unassigned, E3 = never, R3 = never#gt;#40;predicate: Predicate#lt;NoInfer#lt;E#gt;#gt;, f: #40;e: NoInfer#lt;E#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;, orElse?: #40;#40;e: NoInfer#lt;E#gt;#41; =#gt; Effect#lt;A3, E3, R3#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A2 #124; Exclude#lt;A3, unassigned#gt;, E2 #124; E3 #124; #40;A3 extends unassigned ? E : never#41;, R #124; R2 #124; R3#gt;; #lt;A, E, R, EB extends E, A2, E2, R2, A3 = unassigned, E3 = never, R3 = never#gt;#40;self: Effect#lt;A, E, R#gt;, refinement: Refinement#lt;E, EB#gt;, f: #40;e: EB#41; =#gt; Effect#lt;A2, E2, R2#gt;, orElse?: #40;#40;e: Exclude#lt;E, EB#gt;#41; =#gt; Effect#lt;A3, E3, R3#gt;#41; #124; undefined#41;: Effect#lt;A #124; A2 #124; Exclude#lt;A3, unassigned#gt;, E2 #124; E3 #124; #40;A3 extends unassigned ? Exclude#lt;E, EB#gt; : never#41;, R #124; R2 #124; R3#gt;; #lt;A, E, R, A2, E2, R2, A3 = unassigned, E3 = never, R3 = never#gt;#40;self: Effect#lt;A, E, R#gt;, predicate: Predicate#lt;E#gt;, f: #40;e: E#41; =#gt; Effect#lt;A2, E2, R2#gt;, orElse?: #40;#40;e: E#41; =#gt; Effect#lt;A3, E3, R3#gt;#41; #124; undefined#41;: Effect#lt;A #124; A2 #124; Exclude#lt;A3, unassigned#gt;, E2 #124; E3 #124; #40;A3 extends unassigned ? E : never#41;, R #124; R2 #124; R3#gt;; #125;
node: Effect.catchIf"/]
30[["type: #40;e: never#41; =#gt; true
node: #40;e#41; =#gt; true"]]
31[/"type: true
node: true"/]
32[["type: #40;#41; =#gt; Effect#lt;void, never, never#gt;
node: #40;#41; =#gt; Effect.void"]]
33[/"type: Effect#lt;void, never, never#gt;
node: Effect.void"/]
34((("type: Effect#lt;number, never, never#gt;
node: function*#40;#41; #123;#92;n return yield* Effect.succeed#40;42#41;#92;n#125;")))
35["type: Effect#lt;void #124; number, never, never#gt;
callee: Effect.catchTag
args: #91;#quot;MyError#quot;, #40;#41; =#gt; Effect.void#93;"]
- 36[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #125;
node: Effect.catchTag"/]
+ 36[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = unassigned, E2 = never, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = unassigned, E2 = never, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #125;
node: Effect.catchTag"/]
37[/"type: #quot;MyError#quot;
node: #quot;MyError#quot;"/]
38[["type: #40;#41; =#gt; Effect#lt;void, never, never#gt;
node: #40;#41; =#gt; Effect.void"]]
39[/"type: Effect#lt;void, never, never#gt;
node: Effect.void"/]
@@ -51,13 +51,13 @@ flowchart TB
49[["type: #40;n: number#41; =#gt; number
node: #40;n#41; =#gt; n + 1"]]
50[/"type: number
node: n + 1"/]
51["type: Effect#lt;void #124; number, never, never#gt;
callee: Effect.catchTag
args: #91;#quot;MyError#quot;, #40;#41; =#gt; Effect.void#93;"]
- 52[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #125;
node: Effect.catchTag"/]
+ 52[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = unassigned, E2 = never, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = unassigned, E2 = never, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #125;
node: Effect.catchTag"/]
53[/"type: #quot;MyError#quot;
node: #quot;MyError#quot;"/]
54[["type: #40;#41; =#gt; Effect#lt;void, never, never#gt;
node: #40;#41; =#gt; Effect.void"]]
55[/"type: Effect#lt;void, never, never#gt;
node: Effect.void"/]
56[/"type: Effect#lt;number, MyError, never#gt;
node: effectWithErrors"/]
57["type: Effect#lt;number, never, never#gt;
callee: Effect.catchTag
args: #91;#quot;MyError#quot;, #40;#41; =#gt; Effect.succeed#40;42#41;#93;"]
- 58[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #125;
node: Effect.catchTag"/]
+ 58[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = unassigned, E2 = never, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = unassigned, E2 = never, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #125;
node: Effect.catchTag"/]
59[/"type: #quot;MyError#quot;
node: #quot;MyError#quot;"/]
60[["type: #40;#41; =#gt; Effect#lt;number, never, never#gt;
node: #40;#41; =#gt; Effect.succeed#40;42#41;"]]
61[/"type: 42
node: 42"/]
@@ -73,7 +73,7 @@ flowchart TB
71["type: Effect#lt;never, MyError, never#gt;
callee: Effect.fail
args: #91;#93;"]
72[/"type: #lt;E#gt;#40;error: E#41; =#gt; Effect#lt;never, E, never#gt;
node: Effect.fail"/]
73["type: Effect#lt;number, never, never#gt;
callee: Effect.catchTag
args: #91;#quot;MyError#quot;, #40;#41; =#gt; Effect.succeed#40;42#41;#93;"]
- 74[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #125;
node: Effect.catchTag"/]
+ 74[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = unassigned, E2 = never, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = unassigned, E2 = never, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #125;
node: Effect.catchTag"/]
75[/"type: #quot;MyError#quot;
node: #quot;MyError#quot;"/]
76[["type: #40;#41; =#gt; Effect#lt;number, never, never#gt;
node: #40;#41; =#gt; Effect.succeed#40;42#41;"]]
77[/"type: 42
node: 42"/]
diff --git a/testdata/baselines/reference/effect-v4/effect_fn_opportunity_panic.flows.effect_fn_opportunity_panic.mermaid b/testdata/baselines/reference/effect-v4/effect_fn_opportunity_panic.flows.effect_fn_opportunity_panic.mermaid
index 61fb5e44..c6d13936 100644
--- a/testdata/baselines/reference/effect-v4/effect_fn_opportunity_panic.flows.effect_fn_opportunity_panic.mermaid
+++ b/testdata/baselines/reference/effect-v4/effect_fn_opportunity_panic.flows.effect_fn_opportunity_panic.mermaid
@@ -81,7 +81,7 @@ flowchart TB
79[/"type: #123; #lt;const Layers extends #91;Layer.Any, ...Array#lt;Layer.Any#gt;#93;#gt;#40;layers: Layers, options?: #123; readonly local?: boolean #124; undefined; #125; #124; undefined#41;: #lt;A, E, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A, E #124; Error#lt;Layers#91;number#93;#gt;, Exclude#lt;R, Success#lt;Layers#91;number#93;#gt;#gt; #124; Services#lt;Layers#91;number#93;#gt;#gt;; #lt;ROut, E2, RIn#gt;#40;layer: Layer#lt;ROut, E2, RIn#gt;, options?: #123; readonly local?: boolean #124; undefined; #125; #124; undefined#41;: #lt;A, E, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A, E #124; E2, RIn #124; Exclude#lt;R, ROut#gt;#gt;; #lt;R2#gt;#40;context: Context#lt;R2#gt;#41;: #lt;A, E, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A, E, Exclude#lt;R, R2#gt;#gt;; #lt;A, E, R, const Layers extends #91;Layer.Any, ...Array#lt;Layer.Any#gt;#93;#gt;#40;self: Effect#lt;A, E, R#gt;, layers: Layers, options?: #123; readonly local?: boolean #124; undefined; #125; #124; undefined#41;: Effect#lt;A, E #124; Error#lt;Layers#91;number#93;#gt;, Exclude#lt;R, Success#lt;Layers#91;number#93;#gt;#gt; #124; Services#lt;Layers#91;number#93;#gt;#gt;; #lt;A, E, R, ROut, E2, RIn#gt;#40;self: Effect#lt;A, E, R#gt;, layer: Layer#lt;ROut, E2, RIn#gt;, options?: #123; readonly local?: boolean #124; undefined; #125; #124; undefined#41;: Effect#lt;A, E #124; E2, RIn #124; Exclude#lt;R, ROut#gt;#gt;; #lt;A, E, R, R2#gt;#40;self: Effect#lt;A, E, R#gt;, context: Context#lt;R2#gt;#41;: Effect#lt;A, E, Exclude#lt;R, R2#gt;#gt;; #125;
node: Effect.provide"/]
80[/"type: Layer#lt;JsonPlaceholder, never, never#gt;
node: JsonPlaceholderLive"/]
81["type: Effect#lt;void, never, never#gt;
callee: Effect.catchTags
args: #91;#123;#92;n RequestError: #40;error#41; =#gt;#92;n Effect.log#40;`Request failed for $#123;error.url#125;: $#123;String#40;error.cause#41;#125;`#41;,#92;n InvalidStatusError: #40;error#41; =#gt;#92;n Effect.log#40;`Request to $#123;error.url#125; returned status $#123;error.status#125;`#41;,#92;n DecodeError: #40;error#41; =#gt;#92;n Effect.log#40;`Could not decode JSON from $#123;error.url#125;: $#123;String#40;error.cause#41;#125;`#41;#92;n #125;#93;"]
- 82[/"type: #123; #lt;E, Cases extends #123; #91;K in Extract#lt;E, #123; _tag: string; #125;#gt;#91;#quot;_tag#quot;#93;#93;+?: #40;#40;error: Extract#lt;E, #123; _tag: K; #125;#gt;#41; =#gt; Effect#lt;any, any, any#gt;#41;; #125; #amp; #40;unknown extends E ? #123;#125; : #123; #91;K in Exclude#lt;keyof Cases, Extract#lt;E, #123; _tag: string; #125;#gt;#91;#quot;_tag#quot;#93;#gt;#93;: never; #125;#41;, A2 = never, E2 = Exclude#lt;E, #123; _tag: keyof Cases; #125;#gt;, R2 = never#gt;#40;cases: Cases, orElse?: #40;#40;e: Exclude#lt;E, #123; _tag: keyof Cases; #125;#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A2 #124; #123; #91;K in keyof Cases#93;: Cases#91;K#93; extends #40;...args: any#91;#93;#41; =#gt; Effect#lt;infer A, any, any#gt; ? A : never; #125;#91;keyof Cases#93;, E2 #124; #123; #91;K in keyof Cases#93;: Cases#91;K#93; extends #40;...args: any#91;#93;#41; =#gt; Effect#lt;any, infer E, any#gt; ? E : never; #125;#91;keyof Cases#93;, R #124; R2 #124; #123; #91;K in keyof Cases#93;: Cases#91;K#93; extends #40;...args: any#91;#93;#41; =#gt; Effect#lt;any, any, infer R#gt; ? R : never; #125;#91;keyof Cases#93;#gt;; #lt;R, E, A, Cases extends #123; #91;K in Extract#lt;E, #123; _tag: string; #125;#gt;#91;#quot;_tag#quot;#93;#93;+?: #40;#40;error: Extract#lt;E, #123; _tag: K; #125;#gt;#41; =#gt; Effect#lt;any, any, any#gt;#41;; #125; #amp; #40;unknown extends E ? #123;#125; : #123; #91;K in Exclude#lt;keyof Cases, Extract#lt;E, #123; _tag: string; #125;#gt;#91;#quot;_tag#quot;#93;#gt;#93;: never; #125;#41;, A2 = never, E2 = Exclude#lt;E, #123; _tag: keyof Cases; #125;#gt;, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, cases: Cases, orElse?: #40;#40;e: Exclude#lt;E, #123; _tag: keyof Cases; #125;#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; A2 #124; #123; #91;K in keyof Cases#93;: Cases#91;K#93; extends #40;...args: any#91;#93;#41; =#gt; Effect#lt;infer A, any, any#gt; ? A : never; #125;#91;keyof Cases#93;, E2 #124; #123; #91;K in keyof Cases#93;: Cases#91;K#93; extends #40;...args: any#91;#93;#41; =#gt; Effect#lt;any, infer E, any#gt; ? E : never; #125;#91;keyof Cases#93;, R #124; R2 #124; #123; #91;K in keyof Cases#93;: Cases#91;K#93; extends #40;...args: any#91;#93;#41; =#gt; Effect#lt;any, any, infer R#gt; ? R : never; #125;#91;keyof Cases#93;#gt;; #125;
node: Effect.catchTags"/]
+ 82[/"type: #123; #lt;E, Cases extends #123; #91;K in Extract#lt;E, #123; _tag: string; #125;#gt;#91;#quot;_tag#quot;#93;#93;+?: #40;#40;error: Extract#lt;E, #123; _tag: K; #125;#gt;#41; =#gt; Effect#lt;any, any, any#gt;#41;; #125; #amp; #40;unknown extends E ? #123;#125; : #123; #91;K in Exclude#lt;keyof Cases, Extract#lt;E, #123; _tag: string; #125;#gt;#91;#quot;_tag#quot;#93;#gt;#93;: never; #125;#41;, A2 = unassigned, E2 = never, R2 = never#gt;#40;cases: Cases, orElse?: #40;#40;e: Exclude#lt;E, #123; _tag: keyof Cases; #125;#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; #123; #91;K in keyof Cases#93;: Cases#91;K#93; extends #40;...args: any#91;#93;#41; =#gt; Effect#lt;infer A, any, any#gt; ? A : never; #125;#91;keyof Cases#93; #124; Exclude#lt;A2, unassigned#gt;, E2 #124; #123; #91;K in keyof Cases#93;: Cases#91;K#93; extends #40;...args: any#91;#93;#41; =#gt; Effect#lt;any, infer E, any#gt; ? E : never; #125;#91;keyof Cases#93; #124; #40;A2 extends unassigned ? Exclude#lt;E, #123; _tag: keyof Cases; #125;#gt; : never#41;, R #124; R2 #124; #123; #91;K in keyof Cases#93;: Cases#91;K#93; extends #40;...args: any#91;#93;#41; =#gt; Effect#lt;any, any, infer R#gt; ? R : never; #125;#91;keyof Cases#93;#gt;; #lt;R, E, A, Cases extends #123; #91;K in Extract#lt;E, #123; _tag: string; #125;#gt;#91;#quot;_tag#quot;#93;#93;+?: #40;#40;error: Extract#lt;E, #123; _tag: K; #125;#gt;#41; =#gt; Effect#lt;any, any, any#gt;#41;; #125; #amp; #40;unknown extends E ? #123;#125; : #123; #91;K in Exclude#lt;keyof Cases, Extract#lt;E, #123; _tag: string; #125;#gt;#91;#quot;_tag#quot;#93;#gt;#93;: never; #125;#41;, A2 = unassigned, E2 = never, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, cases: Cases, orElse?: #40;#40;e: Exclude#lt;E, #123; _tag: keyof Cases; #125;#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; #123; #91;K in keyof Cases#93;: Cases#91;K#93; extends #40;...args: any#91;#93;#41; =#gt; Effect#lt;infer A, any, any#gt; ? A : never; #125;#91;keyof Cases#93; #124; Exclude#lt;A2, unassigned#gt;, E2 #124; #123; #91;K in keyof Cases#93;: Cases#91;K#93; extends #40;...args: any#91;#93;#41; =#gt; Effect#lt;any, infer E, any#gt; ? E : never; #125;#91;keyof Cases#93; #124; #40;A2 extends unassigned ? Exclude#lt;E, #123; _tag: keyof Cases; #125;#gt; : never#41;, R #124; R2 #124; #123; #91;K in keyof Cases#93;: Cases#91;K#93; extends #40;...args: any#91;#93;#41; =#gt; Effect#lt;any, any, infer R#gt; ? R : never; #125;#91;keyof Cases#93;#gt;; #125;
node: Effect.catchTags"/]
83[/"type: #123; RequestError: #40;error: RequestError#41; =#gt; Effect#lt;void, never, never#gt;; InvalidStatusError: #40;error: InvalidStatusError#41; =#gt; Effect#lt;void, never, never#gt;; DecodeError: #40;error: DecodeError#41; =#gt; Effect#lt;void, never, never#gt;; #125;
node: #123;#92;n RequestError: #40;error#41; =#gt;#92;n Effect.log#40;`Request failed for $#123;error.url#125;: $#123;String#40;error.cause#41;#125;`#41;,#92;n InvalidStatusError: #40;error#41; =#gt;#92;n Effect.log#40;`Request to $#123;error.url#125; returned status $#123;error.status#125;`#41;,#92;n DecodeError: #40;error#41; =#gt;#92;n Effect.log#40;`Could not decode JSON from $#123;error.url#125;: $#123;String#40;error.cause#41;#125;`#41;#92;n #125;"/]
84[["type: #40;error: RequestError#41; =#gt; Effect#lt;void, never, never#gt;
node: #40;error#41; =#gt;#92;n Effect.log#40;`Request failed for $#123;error.url#125;: $#123;String#40;error.cause#41;#125;`#41;"]]
85[/"type: string
node: `Request failed for $#123;error.url#125;: $#123;String#40;error.cause#41;#125;`"/]
diff --git a/testdata/baselines/reference/effect-v4/missedPipeableOpportunity_error.flows.missedPipeableOpportunity_error.mermaid b/testdata/baselines/reference/effect-v4/missedPipeableOpportunity_error.flows.missedPipeableOpportunity_error.mermaid
index 9bc6a77a..61cbfde8 100644
--- a/testdata/baselines/reference/effect-v4/missedPipeableOpportunity_error.flows.missedPipeableOpportunity_error.mermaid
+++ b/testdata/baselines/reference/effect-v4/missedPipeableOpportunity_error.flows.missedPipeableOpportunity_error.mermaid
@@ -3,70 +3,58 @@ flowchart TB
1["type: Struct#lt;#123; readonly x: Finite; readonly y: Finite; #125;#gt;
callee: Schema.Struct
args: #91;#93;"]
2[/"type: #lt;const Fields extends Struct.Fields#gt;#40;fields: Fields#41; =#gt; Struct#lt;Fields#gt;
node: Schema.Struct"/]
3[/"type: Effect#lt;#123; readonly x: number; readonly y: number; #125;, SchemaError, never#gt;
node: Schema.decodeEffect#40;MyStruct#41;#40;#123; x: 42, y: 42 #125;#41;"/]
- 4[/"type: Struct#lt;#123; readonly x: Finite; readonly y: Finite; #125;#gt;
node: MyStruct"/]
- 5["type: #40;input: #123; readonly x: number; readonly y: number; #125;, options?: ParseOptions #124; undefined#41; =#gt; Effect#lt;#123; readonly x: number; readonly y: number; #125;, SchemaError, never#gt;
callee: Schema.decodeEffect
args: #91;#93;"]
- 6[/"type: #lt;S extends Top#gt;#40;schema: S#41; =#gt; #40;input: S#91;#quot;Encoded#quot;#93;, options?: ParseOptions #124; undefined#41; =#gt; Effect#lt;S#91;#quot;Type#quot;#93;, SchemaError, S#91;#quot;DecodingServices#quot;#93;#gt;
node: Schema.decodeEffect"/]
+ 4["type: Effect#lt;#123; readonly x: number; readonly y: number; #125;, SchemaError, never#gt;
callee: identity
args: #91;#93;"]
+ 5[/"type: #lt;A#gt;#40;a: A#41; =#gt; A
node: identity"/]
+ 6[/"type: Effect#lt;#123; readonly x: number; readonly y: number; #125;, SchemaError, never#gt;
node: Schema.decodeEffect#40;MyStruct#41;#40;#123; x: 42, y: 42 #125;#41;"/]
7["type: Effect#lt;#123; readonly x: number; readonly y: number; #125;, SchemaError, never#gt;
callee: identity
args: #91;#93;"]
8[/"type: #lt;A#gt;#40;a: A#41; =#gt; A
node: identity"/]
- 9[/"type: Effect#lt;#123; readonly x: number; readonly y: number; #125;, SchemaError, never#gt;
node: Schema.decodeEffect#40;MyStruct#41;#40;#123; x: 42, y: 42 #125;#41;"/]
- 10[/"type: Struct#lt;#123; readonly x: Finite; readonly y: Finite; #125;#gt;
node: MyStruct"/]
- 11["type: #40;input: #123; readonly x: number; readonly y: number; #125;, options?: ParseOptions #124; undefined#41; =#gt; Effect#lt;#123; readonly x: number; readonly y: number; #125;, SchemaError, never#gt;
callee: Schema.decodeEffect
args: #91;#93;"]
- 12[/"type: #lt;S extends Top#gt;#40;schema: S#41; =#gt; #40;input: S#91;#quot;Encoded#quot;#93;, options?: ParseOptions #124; undefined#41; =#gt; Effect#lt;S#91;#quot;Type#quot;#93;, SchemaError, S#91;#quot;DecodingServices#quot;#93;#gt;
node: Schema.decodeEffect"/]
- 13["type: Effect#lt;#123; readonly x: number; readonly y: number; #125;, SchemaError, never#gt;
callee: identity
args: #91;#93;"]
- 14[/"type: #lt;A#gt;#40;a: A#41; =#gt; A
node: identity"/]
- 15["type: Effect#lt;#123; readonly x: number; readonly y: number; #125;, SchemaError, never#gt;
callee: identity
args: #91;#93;"]
- 16[/"type: #lt;A#gt;#40;a: A#41; =#gt; A
node: identity"/]
- 17[/"type: Schedule#lt;Duration, unknown, never, never#gt;
node: Schedule.exponential#40;Duration.millis#40;10#41;, 4#41;"/]
- 18[/"type: 10
node: 10"/]
- 19["type: Duration
callee: Duration.millis
args: #91;#93;"]
- 20[/"type: #40;millis: number#41; =#gt; Duration
node: Duration.millis"/]
- 21["type: Schedule#lt;Duration, unknown, never, never#gt;
callee: Schedule.while
args: #91;_ =#gt; Duration.isLessThanOrEqualTo#40;Duration.seconds#40;10#41;#41;#40;_.duration#41;#93;"]
- 22[/"type: #123; #lt;Input, Output, Error2 = never, Env2 = never#gt;#40;predicate: #40;metadata: Metadata#lt;Output, Input#gt;#41; =#gt; boolean #124; Effect#lt;boolean, Error2, Env2#gt;#41;: #lt;Error, Env#gt;#40;self: Schedule#lt;Output, Input, Error, Env#gt;#41; =#gt; Schedule#lt;Output, Input, Error #124; Error2, Env #124; Env2#gt;; #lt;Output, Input, Error, Env, Error2 = never, Env2 = never#gt;#40;self: Schedule#lt;Output, Input, Error, Env#gt;, predicate: #40;metadata: Metadata#lt;Output, Input#gt;#41; =#gt; boolean #124; Effect#lt;boolean, Error2, Env2#gt;#41;: Schedule#lt;Output, Input, Error #124; Error2, Env #124; Env2#gt;; #125;
node: Schedule.while"/]
- 23[["type: #40;_: Metadata#lt;Duration, unknown#gt;#41; =#gt; boolean
node: _ =#gt; Duration.isLessThanOrEqualTo#40;Duration.seconds#40;10#41;#41;#40;_.duration#41;"]]
- 24[/"type: Duration
node: _.duration"/]
- 25["type: boolean
callee: Duration.isLessThanOrEqualTo
args: #91;Duration.seconds#40;10#41;#93;"]
- 26[/"type: #123; #40;that: Duration#41;: #40;self: Duration#41; =#gt; boolean; #40;self: Duration, that: Duration#41;: boolean; #125;
node: Duration.isLessThanOrEqualTo"/]
- 27[/"type: 10
node: 10"/]
- 28["type: Duration
callee: Duration.seconds
args: #91;#93;"]
- 29[/"type: #40;seconds: number#41; =#gt; Duration
node: Duration.seconds"/]
- 30[/"type: #quot;Hello#quot;
node: #quot;Hello#quot;"/]
- 31["type: Effect#lt;void, never, never#gt;
callee: Effect.log
args: #91;#93;"]
- 32[/"type: #40;...message: readonly any#91;#93;#41; =#gt; Effect#lt;void, never, never#gt;
node: Effect.log"/]
- 33["type: Effect#lt;void, never, never#gt;
callee: Effect.ensuring
args: #91;Effect.log#40;#quot;World#quot;#41;#93;"]
- 34[/"type: #123; #lt;X, R1#gt;#40;finalizer: Effect#lt;X, never, R1#gt;#41;: #lt;A, E, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A, E, R #124; R1#gt;; #lt;A, E, R, X, R1#gt;#40;self: Effect#lt;A, E, R#gt;, finalizer: Effect#lt;X, never, R1#gt;#41;: Effect#lt;A, E, R #124; R1#gt;; #125;
node: Effect.ensuring"/]
- 35[/"type: #quot;World#quot;
node: #quot;World#quot;"/]
- 36["type: Effect#lt;void, never, never#gt;
callee: Effect.log
args: #91;#93;"]
- 37[/"type: #40;...message: readonly any#91;#93;#41; =#gt; Effect#lt;void, never, never#gt;
node: Effect.log"/]
+ 9["type: Effect#lt;#123; readonly x: number; readonly y: number; #125;, SchemaError, never#gt;
callee: identity
args: #91;#93;"]
+ 10[/"type: #lt;A#gt;#40;a: A#41; =#gt; A
node: identity"/]
+ 11[/"type: Schedule#lt;Duration, unknown, never, never#gt;
node: Schedule.exponential#40;Duration.millis#40;10#41;, 4#41;"/]
+ 12[/"type: 10
node: 10"/]
+ 13["type: Duration
callee: Duration.millis
args: #91;#93;"]
+ 14[/"type: #40;millis: number#41; =#gt; Duration
node: Duration.millis"/]
+ 15["type: Schedule#lt;Duration, unknown, never, never#gt;
callee: Schedule.while
args: #91;_ =#gt; Duration.isLessThanOrEqualTo#40;Duration.seconds#40;10#41;#41;#40;_.duration#41;#93;"]
+ 16[/"type: #123; #lt;Input, Output, Error2 = never, Env2 = never#gt;#40;predicate: #40;metadata: Metadata#lt;Output, Input#gt;#41; =#gt; boolean #124; Effect#lt;boolean, Error2, Env2#gt;#41;: #lt;Error, Env#gt;#40;self: Schedule#lt;Output, Input, Error, Env#gt;#41; =#gt; Schedule#lt;Output, Input, Error #124; Error2, Env #124; Env2#gt;; #lt;Output, Input, Error, Env, Error2 = never, Env2 = never#gt;#40;self: Schedule#lt;Output, Input, Error, Env#gt;, predicate: #40;metadata: Metadata#lt;Output, Input#gt;#41; =#gt; boolean #124; Effect#lt;boolean, Error2, Env2#gt;#41;: Schedule#lt;Output, Input, Error #124; Error2, Env #124; Env2#gt;; #125;
node: Schedule.while"/]
+ 17[["type: #40;_: Metadata#lt;Duration, unknown#gt;#41; =#gt; boolean
node: _ =#gt; Duration.isLessThanOrEqualTo#40;Duration.seconds#40;10#41;#41;#40;_.duration#41;"]]
+ 18[/"type: Duration
node: _.duration"/]
+ 19["type: boolean
callee: Duration.isLessThanOrEqualTo
args: #91;Duration.seconds#40;10#41;#93;"]
+ 20[/"type: #123; #40;that: Duration#41;: #40;self: Duration#41; =#gt; boolean; #40;self: Duration, that: Duration#41;: boolean; #125;
node: Duration.isLessThanOrEqualTo"/]
+ 21[/"type: 10
node: 10"/]
+ 22["type: Duration
callee: Duration.seconds
args: #91;#93;"]
+ 23[/"type: #40;seconds: number#41; =#gt; Duration
node: Duration.seconds"/]
+ 24[/"type: #quot;Hello#quot;
node: #quot;Hello#quot;"/]
+ 25["type: Effect#lt;void, never, never#gt;
callee: Effect.log
args: #91;#93;"]
+ 26[/"type: #40;...message: readonly any#91;#93;#41; =#gt; Effect#lt;void, never, never#gt;
node: Effect.log"/]
+ 27["type: Effect#lt;void, never, never#gt;
callee: Effect.ensuring
args: #91;Effect.log#40;#quot;World#quot;#41;#93;"]
+ 28[/"type: #123; #lt;X, R1#gt;#40;finalizer: Effect#lt;X, never, R1#gt;#41;: #lt;A, E, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A, E, R #124; R1#gt;; #lt;A, E, R, X, R1#gt;#40;self: Effect#lt;A, E, R#gt;, finalizer: Effect#lt;X, never, R1#gt;#41;: Effect#lt;A, E, R #124; R1#gt;; #125;
node: Effect.ensuring"/]
+ 29[/"type: #quot;World#quot;
node: #quot;World#quot;"/]
+ 30["type: Effect#lt;void, never, never#gt;
callee: Effect.log
args: #91;#93;"]
+ 31[/"type: #40;...message: readonly any#91;#93;#41; =#gt; Effect#lt;void, never, never#gt;
node: Effect.log"/]
0 -->|"kind: pipe"| 1
2 -->|"kind: transformCallee"| 1
- 4 -->|"kind: pipe"| 5
- 6 -->|"kind: transformCallee"| 5
- 5 -->|"kind: usedBy"| 3
- 3 -->|"kind: pipe"| 7
+ 3 -->|"kind: pipe"| 4
+ 5 -->|"kind: transformCallee"| 4
+ 6 -->|"kind: pipe"| 7
8 -->|"kind: transformCallee"| 7
- 10 -->|"kind: pipe"| 11
- 12 -->|"kind: transformCallee"| 11
- 11 -->|"kind: usedBy"| 9
- 9 -->|"kind: pipe"| 13
+ 7 -->|"kind: pipe"| 9
+ 10 -->|"kind: transformCallee"| 9
+ 12 -->|"kind: pipe"| 13
14 -->|"kind: transformCallee"| 13
- 13 -->|"kind: pipe"| 15
+ 13 -->|"kind: usedBy"| 11
16 -->|"kind: transformCallee"| 15
18 -->|"kind: pipe"| 19
20 -->|"kind: transformCallee"| 19
- 19 -->|"kind: usedBy"| 17
- 22 -->|"kind: transformCallee"| 21
+ 21 -->|"kind: pipe"| 22
+ 23 -->|"kind: transformCallee"| 22
+ 22 -->|"kind: transformArg"| 19
+ 19 -->|"kind: potentialReturn"| 17
+ 17 -->|"kind: transformArg"| 15
+ 11 -->|"kind: pipe"| 15
24 -->|"kind: pipe"| 25
26 -->|"kind: transformCallee"| 25
- 27 -->|"kind: pipe"| 28
- 29 -->|"kind: transformCallee"| 28
- 28 -->|"kind: transformArg"| 25
- 25 -->|"kind: potentialReturn"| 23
- 23 -->|"kind: transformArg"| 21
- 17 -->|"kind: pipe"| 21
- 30 -->|"kind: pipe"| 31
- 32 -->|"kind: transformCallee"| 31
- 34 -->|"kind: transformCallee"| 33
- 35 -->|"kind: pipe"| 36
- 37 -->|"kind: transformCallee"| 36
- 36 -->|"kind: transformArg"| 33
- 31 -->|"kind: pipe"| 33
\ No newline at end of file
+ 28 -->|"kind: transformCallee"| 27
+ 29 -->|"kind: pipe"| 30
+ 31 -->|"kind: transformCallee"| 30
+ 30 -->|"kind: transformArg"| 27
+ 25 -->|"kind: pipe"| 27
\ No newline at end of file
diff --git a/testdata/baselines/reference/effect-v4/missedPipeableOpportunity_preview.flows.missedPipeableOpportunity_preview.mermaid b/testdata/baselines/reference/effect-v4/missedPipeableOpportunity_preview.flows.missedPipeableOpportunity_preview.mermaid
index 217c181b..e4616cfc 100644
--- a/testdata/baselines/reference/effect-v4/missedPipeableOpportunity_preview.flows.missedPipeableOpportunity_preview.mermaid
+++ b/testdata/baselines/reference/effect-v4/missedPipeableOpportunity_preview.flows.missedPipeableOpportunity_preview.mermaid
@@ -3,19 +3,13 @@ flowchart TB
1["type: Struct#lt;#123; readonly id: Finite; #125;#gt;
callee: Schema.Struct
args: #91;#93;"]
2[/"type: #lt;const Fields extends Struct.Fields#gt;#40;fields: Fields#41; =#gt; Struct#lt;Fields#gt;
node: Schema.Struct"/]
3[/"type: Effect#lt;#123; readonly id: number; #125;, SchemaError, never#gt;
node: Schema.decodeEffect#40;User#41;#40;#123; id: 1 #125;#41;"/]
- 4[/"type: Struct#lt;#123; readonly id: Finite; #125;#gt;
node: User"/]
- 5["type: #40;input: #123; readonly id: number; #125;, options?: ParseOptions #124; undefined#41; =#gt; Effect#lt;#123; readonly id: number; #125;, SchemaError, never#gt;
callee: Schema.decodeEffect
args: #91;#93;"]
- 6[/"type: #lt;S extends Top#gt;#40;schema: S#41; =#gt; #40;input: S#91;#quot;Encoded#quot;#93;, options?: ParseOptions #124; undefined#41; =#gt; Effect#lt;S#91;#quot;Type#quot;#93;, SchemaError, S#91;#quot;DecodingServices#quot;#93;#gt;
node: Schema.decodeEffect"/]
- 7["type: Effect#lt;#123; readonly id: number; #125;, SchemaError, never#gt;
callee: identity
args: #91;#93;"]
- 8[/"type: #lt;A#gt;#40;a: A#41; =#gt; A
node: identity"/]
- 9["type: Effect#lt;#123; readonly id: number; #125;, SchemaError, never#gt;
callee: identity
args: #91;#93;"]
- 10[/"type: #lt;A#gt;#40;a: A#41; =#gt; A
node: identity"/]
+ 4["type: Effect#lt;#123; readonly id: number; #125;, SchemaError, never#gt;
callee: identity
args: #91;#93;"]
+ 5[/"type: #lt;A#gt;#40;a: A#41; =#gt; A
node: identity"/]
+ 6["type: Effect#lt;#123; readonly id: number; #125;, SchemaError, never#gt;
callee: identity
args: #91;#93;"]
+ 7[/"type: #lt;A#gt;#40;a: A#41; =#gt; A
node: identity"/]
0 -->|"kind: pipe"| 1
2 -->|"kind: transformCallee"| 1
- 4 -->|"kind: pipe"| 5
- 6 -->|"kind: transformCallee"| 5
- 5 -->|"kind: usedBy"| 3
- 3 -->|"kind: pipe"| 7
- 8 -->|"kind: transformCallee"| 7
- 7 -->|"kind: pipe"| 9
- 10 -->|"kind: transformCallee"| 9
\ No newline at end of file
+ 3 -->|"kind: pipe"| 4
+ 5 -->|"kind: transformCallee"| 4
+ 4 -->|"kind: pipe"| 6
+ 7 -->|"kind: transformCallee"| 6
\ No newline at end of file
diff --git a/testdata/baselines/reference/effect-v4/missingReturnYieldStarFnUntraced.errors.txt b/testdata/baselines/reference/effect-v4/missingReturnYieldStarFnUntraced.errors.txt
index 4ac2f100..0870ccbd 100644
--- a/testdata/baselines/reference/effect-v4/missingReturnYieldStarFnUntraced.errors.txt
+++ b/testdata/baselines/reference/effect-v4/missingReturnYieldStarFnUntraced.errors.txt
@@ -24,7 +24,7 @@ Effect version: 4.0.0
export const shouldNotComplainRegularFnUntraced = Effect.fnUntraced((a: string) => {
~~~~~~~~~~~~~~~~
!!! error TS2769: No overload matches this call.
-!!! related TS2771 /node_modules/effect/dist/Effect.d.ts(15376,9): The last overload is declared here.
+!!! related TS2771 /node_modules/effect/dist/Effect.d.ts(16688,9): The last overload is declared here.
return Effect.fail(a)
})
diff --git a/testdata/baselines/reference/effect-v4/multipleCatchTag.flows.multipleCatchTag.mermaid b/testdata/baselines/reference/effect-v4/multipleCatchTag.flows.multipleCatchTag.mermaid
index 4ae99ce8..5a64c766 100644
--- a/testdata/baselines/reference/effect-v4/multipleCatchTag.flows.multipleCatchTag.mermaid
+++ b/testdata/baselines/reference/effect-v4/multipleCatchTag.flows.multipleCatchTag.mermaid
@@ -13,14 +13,14 @@ flowchart TB
11[/"type: #lt;Tag extends string#gt;#40;tag: Tag#41; =#gt; new #lt;A extends Record#lt;string, any#gt; = #123;#125;#gt;#40;args: VoidIfEmpty#lt;#123; readonly #91;P in keyof A as P extends #quot;_tag#quot; ? never : P#93;: A#91;P#93;; #125;#gt;#41; =#gt; YieldableError #amp; #123; readonly _tag: Tag; #125; #amp; Readonly#lt;A#gt;
node: Data.TaggedError"/]
12[/"type: Effect#lt;string, NotFound #124; Unauthorized #124; ValidationError, never#gt;
node: program"/]
13["type: Effect#lt;string, Unauthorized #124; ValidationError, never#gt;
callee: Effect.catchTag
args: #91;#quot;NotFound#quot;, #40;#41; =#gt; Effect.succeed#40;#quot;missing#quot;#41;#93;"]
- 14[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #125;
node: Effect.catchTag"/]
+ 14[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = unassigned, E2 = never, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = unassigned, E2 = never, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #125;
node: Effect.catchTag"/]
15[/"type: #quot;NotFound#quot;
node: #quot;NotFound#quot;"/]
16[["type: #40;#41; =#gt; Effect#lt;string, never, never#gt;
node: #40;#41; =#gt; Effect.succeed#40;#quot;missing#quot;#41;"]]
17[/"type: #quot;missing#quot;
node: #quot;missing#quot;"/]
18["type: Effect#lt;string, never, never#gt;
callee: Effect.succeed
args: #91;#93;"]
19[/"type: #lt;A#gt;#40;value: A#41; =#gt; Effect#lt;A, never, never#gt;
node: Effect.succeed"/]
20["type: Effect#lt;string, ValidationError, never#gt;
callee: Effect.catchTag
args: #91;#quot;Unauthorized#quot;, #40;#41; =#gt; Effect.succeed#40;#quot;denied#quot;#41;#93;"]
- 21[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #125;
node: Effect.catchTag"/]
+ 21[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = unassigned, E2 = never, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = unassigned, E2 = never, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #125;
node: Effect.catchTag"/]
22[/"type: #quot;Unauthorized#quot;
node: #quot;Unauthorized#quot;"/]
23[["type: #40;#41; =#gt; Effect#lt;string, never, never#gt;
node: #40;#41; =#gt; Effect.succeed#40;#quot;denied#quot;#41;"]]
24[/"type: #quot;denied#quot;
node: #quot;denied#quot;"/]
@@ -28,21 +28,21 @@ flowchart TB
26[/"type: #lt;A#gt;#40;value: A#41; =#gt; Effect#lt;A, never, never#gt;
node: Effect.succeed"/]
27[/"type: Effect#lt;string, NotFound #124; Unauthorized #124; ValidationError, never#gt;
node: program"/]
28["type: Effect#lt;string, Unauthorized #124; ValidationError, never#gt;
callee: Effect.catchTag
args: #91;#quot;NotFound#quot;, #40;#41; =#gt; Effect.succeed#40;#quot;missing#quot;#41;#93;"]
- 29[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #125;
node: Effect.catchTag"/]
+ 29[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = unassigned, E2 = never, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = unassigned, E2 = never, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #125;
node: Effect.catchTag"/]
30[/"type: #quot;NotFound#quot;
node: #quot;NotFound#quot;"/]
31[["type: #40;#41; =#gt; Effect#lt;string, never, never#gt;
node: #40;#41; =#gt; Effect.succeed#40;#quot;missing#quot;#41;"]]
32[/"type: #quot;missing#quot;
node: #quot;missing#quot;"/]
33["type: Effect#lt;string, never, never#gt;
callee: Effect.succeed
args: #91;#93;"]
34[/"type: #lt;A#gt;#40;value: A#41; =#gt; Effect#lt;A, never, never#gt;
node: Effect.succeed"/]
35["type: Effect#lt;string, ValidationError, never#gt;
callee: Effect.catchTag
args: #91;#quot;Unauthorized#quot;, #40;#41; =#gt; Effect.succeed#40;#quot;denied#quot;#41;#93;"]
- 36[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #125;
node: Effect.catchTag"/]
+ 36[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = unassigned, E2 = never, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = unassigned, E2 = never, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #125;
node: Effect.catchTag"/]
37[/"type: #quot;Unauthorized#quot;
node: #quot;Unauthorized#quot;"/]
38[["type: #40;#41; =#gt; Effect#lt;string, never, never#gt;
node: #40;#41; =#gt; Effect.succeed#40;#quot;denied#quot;#41;"]]
39[/"type: #quot;denied#quot;
node: #quot;denied#quot;"/]
40["type: Effect#lt;string, never, never#gt;
callee: Effect.succeed
args: #91;#93;"]
41[/"type: #lt;A#gt;#40;value: A#41; =#gt; Effect#lt;A, never, never#gt;
node: Effect.succeed"/]
42["type: Effect#lt;string, never, never#gt;
callee: Effect.catchTag
args: #91;#quot;ValidationError#quot;, #40;#41; =#gt; Effect.succeed#40;#quot;invalid#quot;#41;#93;"]
- 43[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #125;
node: Effect.catchTag"/]
+ 43[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = unassigned, E2 = never, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = unassigned, E2 = never, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #125;
node: Effect.catchTag"/]
44[/"type: #quot;ValidationError#quot;
node: #quot;ValidationError#quot;"/]
45[["type: #40;#41; =#gt; Effect#lt;string, never, never#gt;
node: #40;#41; =#gt; Effect.succeed#40;#quot;invalid#quot;#41;"]]
46[/"type: #quot;invalid#quot;
node: #quot;invalid#quot;"/]
@@ -50,7 +50,7 @@ flowchart TB
48[/"type: #lt;A#gt;#40;value: A#41; =#gt; Effect#lt;A, never, never#gt;
node: Effect.succeed"/]
49[/"type: Effect#lt;string, NotFound #124; Unauthorized #124; ValidationError, never#gt;
node: program"/]
50["type: Effect#lt;string, Unauthorized #124; ValidationError, never#gt;
callee: Effect.catchTag
args: #91;#quot;NotFound#quot;, #40;#41; =#gt; Effect.succeed#40;#quot;missing#quot;#41;#93;"]
- 51[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #125;
node: Effect.catchTag"/]
+ 51[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = unassigned, E2 = never, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = unassigned, E2 = never, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #125;
node: Effect.catchTag"/]
52[/"type: #quot;NotFound#quot;
node: #quot;NotFound#quot;"/]
53[["type: #40;#41; =#gt; Effect#lt;string, never, never#gt;
node: #40;#41; =#gt; Effect.succeed#40;#quot;missing#quot;#41;"]]
54[/"type: #quot;missing#quot;
node: #quot;missing#quot;"/]
@@ -61,7 +61,7 @@ flowchart TB
59[["type: #40;value: string#41; =#gt; string
node: #40;value#41; =#gt; value.toUpperCase#40;#41;"]]
60[/"type: string
node: value.toUpperCase#40;#41;"/]
61["type: Effect#lt;string, ValidationError, never#gt;
callee: Effect.catchTag
args: #91;#quot;Unauthorized#quot;, #40;#41; =#gt; Effect.succeed#40;#quot;denied#quot;#41;#93;"]
- 62[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #125;
node: Effect.catchTag"/]
+ 62[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = unassigned, E2 = never, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = unassigned, E2 = never, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #125;
node: Effect.catchTag"/]
63[/"type: #quot;Unauthorized#quot;
node: #quot;Unauthorized#quot;"/]
64[["type: #40;#41; =#gt; Effect#lt;string, never, never#gt;
node: #40;#41; =#gt; Effect.succeed#40;#quot;denied#quot;#41;"]]
65[/"type: #quot;denied#quot;
node: #quot;denied#quot;"/]
@@ -69,7 +69,7 @@ flowchart TB
67[/"type: #lt;A#gt;#40;value: A#41; =#gt; Effect#lt;A, never, never#gt;
node: Effect.succeed"/]
68[/"type: Effect#lt;string, NotFound #124; Unauthorized #124; ValidationError, never#gt;
node: program"/]
69["type: Effect#lt;string, Unauthorized #124; ValidationError, never#gt;
callee: Effect.catchTag
args: #91;#quot;NotFound#quot;, #40;#41; =#gt; Effect.succeed#40;#quot;missing#quot;#41;, #40;error#41; =#gt; Effect.fail#40;error#41;#93;"]
- 70[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #125;
node: Effect.catchTag"/]
+ 70[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = unassigned, E2 = never, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = unassigned, E2 = never, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #125;
node: Effect.catchTag"/]
71[/"type: #quot;NotFound#quot;
node: #quot;NotFound#quot;"/]
72[["type: #40;#41; =#gt; Effect#lt;string, never, never#gt;
node: #40;#41; =#gt; Effect.succeed#40;#quot;missing#quot;#41;"]]
73[/"type: #quot;missing#quot;
node: #quot;missing#quot;"/]
@@ -80,7 +80,7 @@ flowchart TB
78["type: Effect#lt;never, Unauthorized #124; ValidationError, never#gt;
callee: Effect.fail
args: #91;#93;"]
79[/"type: #lt;E#gt;#40;error: E#41; =#gt; Effect#lt;never, E, never#gt;
node: Effect.fail"/]
80["type: Effect#lt;string, ValidationError, never#gt;
callee: Effect.catchTag
args: #91;#quot;Unauthorized#quot;, #40;#41; =#gt; Effect.succeed#40;#quot;denied#quot;#41;#93;"]
- 81[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #125;
node: Effect.catchTag"/]
+ 81[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = unassigned, E2 = never, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = unassigned, E2 = never, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #125;
node: Effect.catchTag"/]
82[/"type: #quot;Unauthorized#quot;
node: #quot;Unauthorized#quot;"/]
83[["type: #40;#41; =#gt; Effect#lt;string, never, never#gt;
node: #40;#41; =#gt; Effect.succeed#40;#quot;denied#quot;#41;"]]
84[/"type: #quot;denied#quot;
node: #quot;denied#quot;"/]
@@ -88,14 +88,14 @@ flowchart TB
86[/"type: #lt;A#gt;#40;value: A#41; =#gt; Effect#lt;A, never, never#gt;
node: Effect.succeed"/]
87[/"type: Effect#lt;string, NotFound #124; Unauthorized #124; ValidationError, never#gt;
node: program"/]
88["type: Effect#lt;string, Retryable #124; Unauthorized #124; ValidationError, never#gt;
callee: Effect.catchTag
args: #91;#quot;NotFound#quot;, #40;#41; =#gt; Effect.fail#40;new Retryable#40;#41;#41;#93;"]
- 89[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #125;
node: Effect.catchTag"/]
+ 89[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = unassigned, E2 = never, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = unassigned, E2 = never, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #125;
node: Effect.catchTag"/]
90[/"type: #quot;NotFound#quot;
node: #quot;NotFound#quot;"/]
91[["type: #40;#41; =#gt; Effect#lt;never, Retryable, never#gt;
node: #40;#41; =#gt; Effect.fail#40;new Retryable#40;#41;#41;"]]
92[/"type: Retryable
node: new Retryable#40;#41;"/]
93["type: Effect#lt;never, Retryable, never#gt;
callee: Effect.fail
args: #91;#93;"]
94[/"type: #lt;E#gt;#40;error: E#41; =#gt; Effect#lt;never, E, never#gt;
node: Effect.fail"/]
95["type: Effect#lt;string, Unauthorized #124; ValidationError, never#gt;
callee: Effect.catchTag
args: #91;#quot;Retryable#quot;, #40;#41; =#gt; Effect.succeed#40;#quot;retried#quot;#41;#93;"]
- 96[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #125;
node: Effect.catchTag"/]
+ 96[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = unassigned, E2 = never, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = unassigned, E2 = never, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #125;
node: Effect.catchTag"/]
97[/"type: #quot;Retryable#quot;
node: #quot;Retryable#quot;"/]
98[["type: #40;#41; =#gt; Effect#lt;string, never, never#gt;
node: #40;#41; =#gt; Effect.succeed#40;#quot;retried#quot;#41;"]]
99[/"type: #quot;retried#quot;
node: #quot;retried#quot;"/]
@@ -103,7 +103,7 @@ flowchart TB
101[/"type: #lt;A#gt;#40;value: A#41; =#gt; Effect#lt;A, never, never#gt;
node: Effect.succeed"/]
102[/"type: Effect#lt;string, NotFound #124; Unauthorized #124; ValidationError, never#gt;
node: program"/]
103["type: Effect#lt;string, Unauthorized #124; ValidationError, never#gt;
callee: Effect.catchTag
args: #91;#quot;NotFound#quot;, #40;#41; =#gt; Effect.succeed#40;#quot;missing#quot;#41;#93;"]
- 104[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #125;
node: Effect.catchTag"/]
+ 104[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = unassigned, E2 = never, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = unassigned, E2 = never, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #125;
node: Effect.catchTag"/]
105[/"type: #quot;NotFound#quot;
node: #quot;NotFound#quot;"/]
106[["type: #40;#41; =#gt; Effect#lt;string, never, never#gt;
node: #40;#41; =#gt; Effect.succeed#40;#quot;missing#quot;#41;"]]
107[/"type: #quot;missing#quot;
node: #quot;missing#quot;"/]
@@ -111,14 +111,14 @@ flowchart TB
109[/"type: #lt;A#gt;#40;value: A#41; =#gt; Effect#lt;A, never, never#gt;
node: Effect.succeed"/]
110[/"type: Effect#lt;string, NotFound #124; Unauthorized #124; ValidationError, never#gt;
node: program"/]
111["type: Effect#lt;string, Unauthorized #124; ValidationError, never#gt;
callee: Effect.catchTag
args: #91;#quot;NotFound#quot;, #40;#41; =#gt; Effect.succeed#40;#quot;missing#quot;#41;#93;"]
- 112[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #125;
node: Effect.catchTag"/]
+ 112[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = unassigned, E2 = never, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = unassigned, E2 = never, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #125;
node: Effect.catchTag"/]
113[/"type: #quot;NotFound#quot;
node: #quot;NotFound#quot;"/]
114[["type: #40;#41; =#gt; Effect#lt;string, never, never#gt;
node: #40;#41; =#gt; Effect.succeed#40;#quot;missing#quot;#41;"]]
115[/"type: #quot;missing#quot;
node: #quot;missing#quot;"/]
116["type: Effect#lt;string, never, never#gt;
callee: Effect.succeed
args: #91;#93;"]
117[/"type: #lt;A#gt;#40;value: A#41; =#gt; Effect#lt;A, never, never#gt;
node: Effect.succeed"/]
118["type: Effect#lt;string, ValidationError, never#gt;
callee: Effect.catchTag
args: #91;#quot;Unauthorized#quot;, #40;#41; =#gt; Effect.succeed#40;#quot;denied#quot;#41;#93;"]
- 119[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #125;
node: Effect.catchTag"/]
+ 119[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = unassigned, E2 = never, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = unassigned, E2 = never, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #125;
node: Effect.catchTag"/]
120[/"type: #quot;Unauthorized#quot;
node: #quot;Unauthorized#quot;"/]
121[["type: #40;#41; =#gt; Effect#lt;string, never, never#gt;
node: #40;#41; =#gt; Effect.succeed#40;#quot;denied#quot;#41;"]]
122[/"type: #quot;denied#quot;
node: #quot;denied#quot;"/]
diff --git a/testdata/baselines/reference/effect-v4/multipleCatchTag_preview.flows.multipleCatchTag_preview.mermaid b/testdata/baselines/reference/effect-v4/multipleCatchTag_preview.flows.multipleCatchTag_preview.mermaid
index 8e6a56cd..84d71f5c 100644
--- a/testdata/baselines/reference/effect-v4/multipleCatchTag_preview.flows.multipleCatchTag_preview.mermaid
+++ b/testdata/baselines/reference/effect-v4/multipleCatchTag_preview.flows.multipleCatchTag_preview.mermaid
@@ -7,14 +7,14 @@ flowchart TB
5[/"type: #lt;Tag extends string#gt;#40;tag: Tag#41; =#gt; new #lt;A extends Record#lt;string, any#gt; = #123;#125;#gt;#40;args: VoidIfEmpty#lt;#123; readonly #91;P in keyof A as P extends #quot;_tag#quot; ? never : P#93;: A#91;P#93;; #125;#gt;#41; =#gt; YieldableError #amp; #123; readonly _tag: Tag; #125; #amp; Readonly#lt;A#gt;
node: Data.TaggedError"/]
6[/"type: Effect#lt;string, NotFound #124; Unauthorized, never#gt;
node: program"/]
7["type: Effect#lt;string, Unauthorized, never#gt;
callee: Effect.catchTag
args: #91;#quot;NotFound#quot;, #40;#41; =#gt; Effect.succeed#40;#quot;missing#quot;#41;#93;"]
- 8[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #125;
node: Effect.catchTag"/]
+ 8[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = unassigned, E2 = never, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = unassigned, E2 = never, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #125;
node: Effect.catchTag"/]
9[/"type: #quot;NotFound#quot;
node: #quot;NotFound#quot;"/]
10[["type: #40;#41; =#gt; Effect#lt;string, never, never#gt;
node: #40;#41; =#gt; Effect.succeed#40;#quot;missing#quot;#41;"]]
11[/"type: #quot;missing#quot;
node: #quot;missing#quot;"/]
12["type: Effect#lt;string, never, never#gt;
callee: Effect.succeed
args: #91;#93;"]
13[/"type: #lt;A#gt;#40;value: A#41; =#gt; Effect#lt;A, never, never#gt;
node: Effect.succeed"/]
14["type: Effect#lt;string, never, never#gt;
callee: Effect.catchTag
args: #91;#quot;Unauthorized#quot;, #40;#41; =#gt; Effect.succeed#40;#quot;denied#quot;#41;#93;"]
- 15[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #125;
node: Effect.catchTag"/]
+ 15[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = unassigned, E2 = never, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Effect#lt;A, E, R#gt;#41; =#gt; Effect#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = unassigned, E2 = never, R2 = never#gt;#40;self: Effect#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Effect#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Effect#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #125;
node: Effect.catchTag"/]
16[/"type: #quot;Unauthorized#quot;
node: #quot;Unauthorized#quot;"/]
17[["type: #40;#41; =#gt; Effect#lt;string, never, never#gt;
node: #40;#41; =#gt; Effect.succeed#40;#quot;denied#quot;#41;"]]
18[/"type: #quot;denied#quot;
node: #quot;denied#quot;"/]
diff --git a/testdata/baselines/reference/effect-v4/multipleCatchTag_stream.flows.multipleCatchTag_stream.mermaid b/testdata/baselines/reference/effect-v4/multipleCatchTag_stream.flows.multipleCatchTag_stream.mermaid
index c6c4a87f..3a5f17fc 100644
--- a/testdata/baselines/reference/effect-v4/multipleCatchTag_stream.flows.multipleCatchTag_stream.mermaid
+++ b/testdata/baselines/reference/effect-v4/multipleCatchTag_stream.flows.multipleCatchTag_stream.mermaid
@@ -10,14 +10,14 @@ flowchart TB
8[/"type: #lt;Tag extends string#gt;#40;tag: Tag#41; =#gt; new #lt;A extends Record#lt;string, any#gt; = #123;#125;#gt;#40;args: VoidIfEmpty#lt;#123; readonly #91;P in keyof A as P extends #quot;_tag#quot; ? never : P#93;: A#91;P#93;; #125;#gt;#41; =#gt; YieldableError #amp; #123; readonly _tag: Tag; #125; #amp; Readonly#lt;A#gt;
node: Data.TaggedError"/]
9[/"type: Stream#lt;string, NotFound #124; Unauthorized, never#gt;
node: stream"/]
10["type: Stream#lt;string, Unauthorized, never#gt;
callee: Stream.catchTag
args: #91;#quot;NotFound#quot;, #40;#41; =#gt; Stream.succeed#40;#quot;missing#quot;#41;#93;"]
- 11[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Stream#lt;A, E, R#gt;#41; =#gt; Stream#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;self: Stream#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Stream#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #125;
node: Stream.catchTag"/]
+ 11[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = unassigned, E2 = never, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Stream#lt;A, E, R#gt;#41; =#gt; Stream#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = unassigned, E2 = never, R2 = never#gt;#40;self: Stream#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Stream#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #125;
node: Stream.catchTag"/]
12[/"type: #quot;NotFound#quot;
node: #quot;NotFound#quot;"/]
13[["type: #40;#41; =#gt; Stream#lt;string, never, never#gt;
node: #40;#41; =#gt; Stream.succeed#40;#quot;missing#quot;#41;"]]
14[/"type: #quot;missing#quot;
node: #quot;missing#quot;"/]
15["type: Stream#lt;string, never, never#gt;
callee: Stream.succeed
args: #91;#93;"]
16[/"type: #lt;A#gt;#40;value: A#41; =#gt; Stream#lt;A, never, never#gt;
node: Stream.succeed"/]
17["type: Stream#lt;string, never, never#gt;
callee: Stream.catchTag
args: #91;#quot;Unauthorized#quot;, #40;#41; =#gt; Stream.succeed#40;#quot;denied#quot;#41;#93;"]
- 18[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Stream#lt;A, E, R#gt;#41; =#gt; Stream#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;self: Stream#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Stream#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #125;
node: Stream.catchTag"/]
+ 18[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = unassigned, E2 = never, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Stream#lt;A, E, R#gt;#41; =#gt; Stream#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = unassigned, E2 = never, R2 = never#gt;#40;self: Stream#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Stream#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #125;
node: Stream.catchTag"/]
19[/"type: #quot;Unauthorized#quot;
node: #quot;Unauthorized#quot;"/]
20[["type: #40;#41; =#gt; Stream#lt;string, never, never#gt;
node: #40;#41; =#gt; Stream.succeed#40;#quot;denied#quot;#41;"]]
21[/"type: #quot;denied#quot;
node: #quot;denied#quot;"/]
@@ -25,7 +25,7 @@ flowchart TB
23[/"type: #lt;A#gt;#40;value: A#41; =#gt; Stream#lt;A, never, never#gt;
node: Stream.succeed"/]
24[/"type: Stream#lt;string, NotFound #124; Unauthorized, never#gt;
node: stream"/]
25["type: Stream#lt;string, Unauthorized, never#gt;
callee: Stream.catchTag
args: #91;#quot;NotFound#quot;, #40;#41; =#gt; Stream.succeed#40;#quot;missing#quot;#41;#93;"]
- 26[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Stream#lt;A, E, R#gt;#41; =#gt; Stream#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;self: Stream#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Stream#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #125;
node: Stream.catchTag"/]
+ 26[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = unassigned, E2 = never, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Stream#lt;A, E, R#gt;#41; =#gt; Stream#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = unassigned, E2 = never, R2 = never#gt;#40;self: Stream#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Stream#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #125;
node: Stream.catchTag"/]
27[/"type: #quot;NotFound#quot;
node: #quot;NotFound#quot;"/]
28[["type: #40;#41; =#gt; Stream#lt;string, never, never#gt;
node: #40;#41; =#gt; Stream.succeed#40;#quot;missing#quot;#41;"]]
29[/"type: #quot;missing#quot;
node: #quot;missing#quot;"/]
@@ -36,7 +36,7 @@ flowchart TB
34[["type: #40;value: string#41; =#gt; string
node: #40;value#41; =#gt; value.toUpperCase#40;#41;"]]
35[/"type: string
node: value.toUpperCase#40;#41;"/]
36["type: Stream#lt;string, never, never#gt;
callee: Stream.catchTag
args: #91;#quot;Unauthorized#quot;, #40;#41; =#gt; Stream.succeed#40;#quot;denied#quot;#41;#93;"]
- 37[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Stream#lt;A, E, R#gt;#41; =#gt; Stream#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;self: Stream#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Stream#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #125;
node: Stream.catchTag"/]
+ 37[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = unassigned, E2 = never, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Stream#lt;A, E, R#gt;#41; =#gt; Stream#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = unassigned, E2 = never, R2 = never#gt;#40;self: Stream#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Stream#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #125;
node: Stream.catchTag"/]
38[/"type: #quot;Unauthorized#quot;
node: #quot;Unauthorized#quot;"/]
39[["type: #40;#41; =#gt; Stream#lt;string, never, never#gt;
node: #40;#41; =#gt; Stream.succeed#40;#quot;denied#quot;#41;"]]
40[/"type: #quot;denied#quot;
node: #quot;denied#quot;"/]
@@ -44,7 +44,7 @@ flowchart TB
42[/"type: #lt;A#gt;#40;value: A#41; =#gt; Stream#lt;A, never, never#gt;
node: Stream.succeed"/]
43[/"type: Stream#lt;string, NotFound #124; Unauthorized, never#gt;
node: stream"/]
44["type: Stream#lt;string, Unauthorized, never#gt;
callee: Stream.catchTag
args: #91;#quot;NotFound#quot;, #40;#41; =#gt; Stream.succeed#40;#quot;missing#quot;#41;, #40;error#41; =#gt; Stream.fail#40;error#41;#93;"]
- 45[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Stream#lt;A, E, R#gt;#41; =#gt; Stream#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;self: Stream#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Stream#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #125;
node: Stream.catchTag"/]
+ 45[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = unassigned, E2 = never, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Stream#lt;A, E, R#gt;#41; =#gt; Stream#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = unassigned, E2 = never, R2 = never#gt;#40;self: Stream#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Stream#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #125;
node: Stream.catchTag"/]
46[/"type: #quot;NotFound#quot;
node: #quot;NotFound#quot;"/]
47[["type: #40;#41; =#gt; Stream#lt;string, never, never#gt;
node: #40;#41; =#gt; Stream.succeed#40;#quot;missing#quot;#41;"]]
48[/"type: #quot;missing#quot;
node: #quot;missing#quot;"/]
@@ -55,7 +55,7 @@ flowchart TB
53["type: Stream#lt;never, Unauthorized, never#gt;
callee: Stream.fail
args: #91;#93;"]
54[/"type: #lt;E#gt;#40;error: E#41; =#gt; Stream#lt;never, E, never#gt;
node: Stream.fail"/]
55["type: Stream#lt;string, never, never#gt;
callee: Stream.catchTag
args: #91;#quot;Unauthorized#quot;, #40;#41; =#gt; Stream.succeed#40;#quot;denied#quot;#41;#93;"]
- 56[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Stream#lt;A, E, R#gt;#41; =#gt; Stream#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;self: Stream#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Stream#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #125;
node: Stream.catchTag"/]
+ 56[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = unassigned, E2 = never, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Stream#lt;A, E, R#gt;#41; =#gt; Stream#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = unassigned, E2 = never, R2 = never#gt;#40;self: Stream#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Stream#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #125;
node: Stream.catchTag"/]
57[/"type: #quot;Unauthorized#quot;
node: #quot;Unauthorized#quot;"/]
58[["type: #40;#41; =#gt; Stream#lt;string, never, never#gt;
node: #40;#41; =#gt; Stream.succeed#40;#quot;denied#quot;#41;"]]
59[/"type: #quot;denied#quot;
node: #quot;denied#quot;"/]
@@ -63,14 +63,14 @@ flowchart TB
61[/"type: #lt;A#gt;#40;value: A#41; =#gt; Stream#lt;A, never, never#gt;
node: Stream.succeed"/]
62[/"type: Stream#lt;string, NotFound #124; Unauthorized, never#gt;
node: stream"/]
63["type: Stream#lt;string, Retryable #124; Unauthorized, never#gt;
callee: Stream.catchTag
args: #91;#quot;NotFound#quot;, #40;#41; =#gt; Stream.fail#40;new Retryable#40;#41;#41;#93;"]
- 64[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Stream#lt;A, E, R#gt;#41; =#gt; Stream#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;self: Stream#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Stream#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #125;
node: Stream.catchTag"/]
+ 64[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = unassigned, E2 = never, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Stream#lt;A, E, R#gt;#41; =#gt; Stream#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = unassigned, E2 = never, R2 = never#gt;#40;self: Stream#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Stream#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #125;
node: Stream.catchTag"/]
65[/"type: #quot;NotFound#quot;
node: #quot;NotFound#quot;"/]
66[["type: #40;#41; =#gt; Stream#lt;never, Retryable, never#gt;
node: #40;#41; =#gt; Stream.fail#40;new Retryable#40;#41;#41;"]]
67[/"type: Retryable
node: new Retryable#40;#41;"/]
68["type: Stream#lt;never, Retryable, never#gt;
callee: Stream.fail
args: #91;#93;"]
69[/"type: #lt;E#gt;#40;error: E#41; =#gt; Stream#lt;never, E, never#gt;
node: Stream.fail"/]
70["type: Stream#lt;string, Unauthorized, never#gt;
callee: Stream.catchTag
args: #91;#quot;Retryable#quot;, #40;#41; =#gt; Stream.succeed#40;#quot;retried#quot;#41;#93;"]
- 71[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Stream#lt;A, E, R#gt;#41; =#gt; Stream#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = never, E2 = ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;, R2 = never#gt;#40;self: Stream#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Stream#lt;A #124; A1 #124; A2, E1 #124; E2, R #124; R1 #124; R2#gt;; #125;
node: Stream.catchTag"/]
+ 71[/"type: #123; #lt;const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, E, A1, E1, R1, A2 = unassigned, E2 = never, R2 = never#gt;#40;k: K, f: #40;e: ExtractTag#lt;NoInfer#lt;E#gt;, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A2, E2, R2#gt;#41; #124; undefined#41;: #lt;A, R#gt;#40;self: Stream#lt;A, E, R#gt;#41; =#gt; Stream#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #lt;A, E, R, const K extends Tags#lt;E#gt; #124; Arr.NonEmptyReadonlyArray#lt;Tags#lt;E#gt;#gt;, R1, E1, A1, A2 = unassigned, E2 = never, R2 = never#gt;#40;self: Stream#lt;A, E, R#gt;, k: K, f: #40;e: ExtractTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A1, E1, R1#gt;, orElse?: #40;#40;e: ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt;#41; =#gt; Stream#lt;A2, E2, R2#gt;#41; #124; undefined#41;: Stream#lt;A #124; A1 #124; Exclude#lt;A2, unassigned#gt;, E1 #124; E2 #124; #40;A2 extends unassigned ? ExcludeTag#lt;E, K extends readonly #91;string, ...string#91;#93;#93; ? K#91;number#93; : K#gt; : never#41;, R #124; R1 #124; R2#gt;; #125;
node: Stream.catchTag"/]
72[/"type: #quot;Retryable#quot;
node: #quot;Retryable#quot;"/]
73[["type: #40;#41; =#gt; Stream#lt;string, never, never#gt;
node: #40;#41; =#gt; Stream.succeed#40;#quot;retried#quot;#41;"]]
74[/"type: #quot;retried#quot;
node: #quot;retried#quot;"/]
diff --git a/testdata/baselines/reference/effect-v4/outdatedApi.errors.txt b/testdata/baselines/reference/effect-v4/outdatedApi.errors.txt
index 69c0c896..720a58c9 100644
--- a/testdata/baselines/reference/effect-v4/outdatedApi.errors.txt
+++ b/testdata/baselines/reference/effect-v4/outdatedApi.errors.txt
@@ -131,7 +131,7 @@ Effect version: 4.0.0
export const p_catchAllCause = Effect.catchAllCause(Effect.fail("err"), (_cause) => Effect.succeed(0))
~~~~~~~~~~~~~
!!! error TS2551: Property 'catchAllCause' does not exist on type 'typeof import("/node_modules/effect/dist/Effect")'. Did you mean 'catchCause'?
-!!! related TS2728 /node_modules/effect/dist/Effect.d.ts(4565,22): 'catchCause' is declared here.
+!!! related TS2728 /node_modules/effect/dist/Effect.d.ts(4712,22): 'catchCause' is declared here.
~~~~~~~~~~~~~
!!! warning TS377052: This project targets Effect v4, but this code uses the Effect v3 API `catchAllCause`. The referenced API belongs to the v3 surface rather than the configured v4 surface. Renamed to catchCause. effect(outdatedApi)
~~~~~~
@@ -141,7 +141,7 @@ Effect version: 4.0.0
export const p_catchAllDefect = Effect.catchAllDefect(Effect.die("defect"), (_defect) => Effect.succeed(0))
~~~~~~~~~~~~~~
!!! error TS2551: Property 'catchAllDefect' does not exist on type 'typeof import("/node_modules/effect/dist/Effect")'. Did you mean 'catchDefect'?
-!!! related TS2728 /node_modules/effect/dist/Effect.d.ts(4706,22): 'catchDefect' is declared here.
+!!! related TS2728 /node_modules/effect/dist/Effect.d.ts(4835,22): 'catchDefect' is declared here.
~~~~~~~~~~~~~~
!!! warning TS377052: This project targets Effect v4, but this code uses the Effect v3 API `catchAllDefect`. The referenced API belongs to the v3 surface rather than the configured v4 surface. Renamed to catchDefect. effect(outdatedApi)
~~~~~~~
@@ -167,7 +167,7 @@ Effect version: 4.0.0
export const p_async = Effect.async((resume) => {
~~~~~
!!! error TS2551: Property 'async' does not exist on type 'typeof import("/node_modules/effect/dist/Effect")'. Did you mean 'sync'?
-!!! related TS2728 /node_modules/effect/dist/Effect.d.ts(1499,22): 'sync' is declared here.
+!!! related TS2728 /node_modules/effect/dist/Effect.d.ts(1407,22): 'sync' is declared here.
~~~~~
!!! warning TS377052: This project targets Effect v4, but this code uses the Effect v3 API `async`. The referenced API belongs to the v3 surface rather than the configured v4 surface. Renamed to callback. Note: in v4 the callback receives a Scheduler as 'this' context. effect(outdatedApi)
~~~~~~
@@ -219,5 +219,5 @@ Effect version: 4.0.0
!!! error TS2365: Operator '>' cannot be applied to types 'Effect' and 'number'.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2322: Type 'Effect | Effect, never, never>' is not assignable to type 'Result'.
-!!! related TS6502 /node_modules/effect/dist/Filter.d.ts(29,18): The expected type comes from the return type of this signature.
+!!! related TS6502 /node_modules/effect/dist/Filter.d.ts(41,18): The expected type comes from the return type of this signature.
diff --git a/testdata/baselines/reference/effect-v4/parsingGen.errors.txt b/testdata/baselines/reference/effect-v4/parsingGen.errors.txt
index 1030146b..8ea4456c 100644
--- a/testdata/baselines/reference/effect-v4/parsingGen.errors.txt
+++ b/testdata/baselines/reference/effect-v4/parsingGen.errors.txt
@@ -10,7 +10,7 @@ Effect version: 4.0.0
export const program = Effect.gen(function*(){
~~~~~~~~
!!! error TS2345: Argument of type '() => Generator, number, any>' is not assignable to parameter of type '() => Generator, number, never>'.
-!!! related TS2728 /node_modules/effect/dist/Effect.d.ts(148,14): '[TypeId]' is declared here.
+!!! related TS2728 /node_modules/effect/dist/Effect.d.ts(81,14): '[TypeId]' is declared here.
const option = yield* Option.some(1)
return option
})
diff --git a/testdata/baselines/reference/effect-v4/schemaStructWithTag.flows.schemaStructWithTag.mermaid b/testdata/baselines/reference/effect-v4/schemaStructWithTag.flows.schemaStructWithTag.mermaid
index 13055490..26766344 100644
--- a/testdata/baselines/reference/effect-v4/schemaStructWithTag.flows.schemaStructWithTag.mermaid
+++ b/testdata/baselines/reference/effect-v4/schemaStructWithTag.flows.schemaStructWithTag.mermaid
@@ -2,7 +2,7 @@ flowchart TB
0[/"type: #123; _tag: Literal#lt;#quot;User#quot;#gt;; name: String; age: Finite; #125;
node: #123;#92;n _tag: Schema.Literal#40;#quot;User#quot;#41;, // #lt;- this is the tag#92;n name: Schema.String,#92;n age: Schema.Finite#92;n#125;"/]
1[/"type: #quot;User#quot;
node: #quot;User#quot;"/]
2["type: Literal#lt;#quot;User#quot;#gt;
callee: Schema.Literal
args: #91;#93;"]
- 3[/"type: #lt;L extends AST.LiteralValue#gt;#40;literal: L#41; =#gt; Literal#lt;L#gt;
node: Schema.Literal"/]
+ 3[/"type: #lt;L extends SchemaAST.LiteralValue#gt;#40;literal: L#41; =#gt; Literal#lt;L#gt;
node: Schema.Literal"/]
4["type: Struct#lt;#123; readonly _tag: Literal#lt;#quot;User#quot;#gt;; readonly name: String; readonly age: Finite; #125;#gt;
callee: Schema.Struct
args: #91;#93;"]
5[/"type: #lt;const Fields extends Struct.Fields#gt;#40;fields: Fields#41; =#gt; Struct#lt;Fields#gt;
node: Schema.Struct"/]
6[/"type: TaggedStruct#lt;#quot;User#quot;, #123; readonly name: String; readonly age: Finite; #125;#gt;
node: Schema.TaggedStruct#40;#quot;User#quot;, #123;#92;n name: Schema.String,#92;n age: Schema.Finite#92;n#125;#41;"/]
diff --git a/testdata/baselines/reference/effect-v4/schemaStructWithTag_preview.flows.schemaStructWithTag_preview.mermaid b/testdata/baselines/reference/effect-v4/schemaStructWithTag_preview.flows.schemaStructWithTag_preview.mermaid
index 0d55e530..b046d306 100644
--- a/testdata/baselines/reference/effect-v4/schemaStructWithTag_preview.flows.schemaStructWithTag_preview.mermaid
+++ b/testdata/baselines/reference/effect-v4/schemaStructWithTag_preview.flows.schemaStructWithTag_preview.mermaid
@@ -2,7 +2,7 @@ flowchart TB
0[/"type: #123; _tag: Literal#lt;#quot;User#quot;#gt;; name: String; #125;
node: #123;#92;n _tag: Schema.Literal#40;#quot;User#quot;#41;,#92;n name: Schema.String#92;n#125;"/]
1[/"type: #quot;User#quot;
node: #quot;User#quot;"/]
2["type: Literal#lt;#quot;User#quot;#gt;
callee: Schema.Literal
args: #91;#93;"]
- 3[/"type: #lt;L extends AST.LiteralValue#gt;#40;literal: L#41; =#gt; Literal#lt;L#gt;
node: Schema.Literal"/]
+ 3[/"type: #lt;L extends SchemaAST.LiteralValue#gt;#40;literal: L#41; =#gt; Literal#lt;L#gt;
node: Schema.Literal"/]
4["type: Struct#lt;#123; readonly _tag: Literal#lt;#quot;User#quot;#gt;; readonly name: String; #125;#gt;
callee: Schema.Struct
args: #91;#93;"]
5[/"type: #lt;const Fields extends Struct.Fields#gt;#40;fields: Fields#41; =#gt; Struct#lt;Fields#gt;
node: Schema.Struct"/]
1 -->|"kind: pipe"| 2
diff --git a/testdata/baselines/reference/effect-v4/schemaSyncInEffect.flows.schemaSyncInEffect.mermaid b/testdata/baselines/reference/effect-v4/schemaSyncInEffect.flows.schemaSyncInEffect.mermaid
index f68c7323..27fc9ce5 100644
--- a/testdata/baselines/reference/effect-v4/schemaSyncInEffect.flows.schemaSyncInEffect.mermaid
+++ b/testdata/baselines/reference/effect-v4/schemaSyncInEffect.flows.schemaSyncInEffect.mermaid
@@ -7,88 +7,46 @@ flowchart TB
5[/"type: #123; name: string; age: number; #125;
node: #123; name: #quot;John#quot;, age: 30 #125;"/]
6["type: Effect#lt;#123; name: string; age: number; #125;, never, never#gt;
callee: Effect.succeed
args: #91;#93;"]
7[/"type: #lt;A#gt;#40;value: A#41; =#gt; Effect#lt;A, never, never#gt;
node: Effect.succeed"/]
- 8[/"type: Struct#lt;#123; readonly name: String; readonly age: Finite; #125;#gt;
node: Person"/]
- 9["type: #40;input: #123; readonly name: string; readonly age: number; #125;, options?: ParseOptions #124; undefined#41; =#gt; #123; readonly name: string; readonly age: number; #125;
callee: Schema.decodeSync
args: #91;#93;"]
- 10[/"type: #lt;S extends Decoder#lt;unknown#gt;#gt;#40;schema: S#41; =#gt; #40;input: S#91;#quot;Encoded#quot;#93;, options?: ParseOptions #124; undefined#41; =#gt; S#91;#quot;Type#quot;#93;
node: Schema.decodeSync"/]
- 11((("type: Effect#lt;#123; readonly name: string; readonly age: number; #125;, never, never#gt;
node: Effect.gen#40;function*#40;#41; #123;#92;n const input: unknown = yield* Effect.succeed#40;#123; name: #quot;Jane#quot;, age: 25 #125;#41;#92;n const person = Schema.decodeUnknownSync#40;Person#41;#40;input#41;#92;n // ^- should suggest using Schema.decodeUnknown instead#92;n return person#92;n#125;#41;")))
- 12[/"type: #123; readonly name: string; readonly age: number; #125;
node: person"/]
- 13[/"type: #123; name: string; age: number; #125;
node: #123; name: #quot;Jane#quot;, age: 25 #125;"/]
- 14["type: Effect#lt;#123; name: string; age: number; #125;, never, never#gt;
callee: Effect.succeed
args: #91;#93;"]
- 15[/"type: #lt;A#gt;#40;value: A#41; =#gt; Effect#lt;A, never, never#gt;
node: Effect.succeed"/]
- 16[/"type: Struct#lt;#123; readonly name: String; readonly age: Finite; #125;#gt;
node: Person"/]
- 17["type: #40;input: unknown, options?: ParseOptions #124; undefined#41; =#gt; #123; readonly name: string; readonly age: number; #125;
callee: Schema.decodeUnknownSync
args: #91;#93;"]
- 18[/"type: #lt;S extends Schema.Decoder#lt;unknown#gt;#gt;#40;schema: S#41; =#gt; #40;input: unknown, options?: ParseOptions #124; undefined#41; =#gt; S#91;#quot;Type#quot;#93;
node: Schema.decodeUnknownSync"/]
- 19((("type: Effect#lt;#123; readonly name: string; readonly age: number; #125;, never, never#gt;
node: Effect.gen#40;function*#40;#41; #123;#92;n const person = #123; name: #quot;Bob#quot;, age: 40 #125;#92;n const encoded = Schema.encodeSync#40;Person#41;#40;person#41;#92;n // ^- should suggest using Schema.encode instead#92;n return encoded#92;n#125;#41;")))
- 20[/"type: #123; readonly name: string; readonly age: number; #125;
node: encoded"/]
- 21[/"type: Struct#lt;#123; readonly name: String; readonly age: Finite; #125;#gt;
node: Person"/]
- 22["type: #40;input: #123; readonly name: string; readonly age: number; #125;, options?: ParseOptions #124; undefined#41; =#gt; #123; readonly name: string; readonly age: number; #125;
callee: Schema.encodeSync
args: #91;#93;"]
- 23[/"type: #lt;S extends Encoder#lt;unknown#gt;#gt;#40;schema: S#41; =#gt; #40;input: S#91;#quot;Type#quot;#93;, options?: ParseOptions #124; undefined#41; =#gt; S#91;#quot;Encoded#quot;#93;
node: Schema.encodeSync"/]
- 24((("type: Effect#lt;#123; readonly name: string; readonly age: number; #125;, never, never#gt;
node: Effect.gen#40;function*#40;#41; #123;#92;n const person: unknown = #123; name: #quot;Alice#quot;, age: 35 #125;#92;n const encoded = Schema.encodeUnknownSync#40;Person#41;#40;person as any#41;#92;n // ^- should suggest using Schema.encodeUnknown instead#92;n return encoded#92;n#125;#41;")))
- 25[/"type: #123; readonly name: string; readonly age: number; #125;
node: encoded"/]
- 26[/"type: Struct#lt;#123; readonly name: String; readonly age: Finite; #125;#gt;
node: Person"/]
- 27["type: #40;input: unknown, options?: ParseOptions #124; undefined#41; =#gt; #123; readonly name: string; readonly age: number; #125;
callee: Schema.encodeUnknownSync
args: #91;#93;"]
- 28[/"type: #lt;S extends Schema.Encoder#lt;unknown#gt;#gt;#40;schema: S#41; =#gt; #40;input: unknown, options?: ParseOptions #124; undefined#41; =#gt; S#91;#quot;Encoded#quot;#93;
node: Schema.encodeUnknownSync"/]
- 29[["type: #40;#41; =#gt; #123; readonly name: string; readonly age: number; #125;
node: #40;#41; =#gt; #123;#92;n const input = #123; name: #quot;Test#quot;, age: 20 #125;#92;n const person = Schema.decodeSync#40;Person#41;#40;input#41;#92;n return person#92;n#125;"]]
- 30[/"type: #123; readonly name: string; readonly age: number; #125;
node: person"/]
- 31[/"type: Struct#lt;#123; readonly name: String; readonly age: Finite; #125;#gt;
node: Person"/]
- 32["type: #40;input: #123; readonly name: string; readonly age: number; #125;, options?: ParseOptions #124; undefined#41; =#gt; #123; readonly name: string; readonly age: number; #125;
callee: Schema.decodeSync
args: #91;#93;"]
- 33[/"type: #lt;S extends Decoder#lt;unknown#gt;#gt;#40;schema: S#41; =#gt; #40;input: S#91;#quot;Encoded#quot;#93;, options?: ParseOptions #124; undefined#41; =#gt; S#91;#quot;Type#quot;#93;
node: Schema.decodeSync"/]
- 34((("type: Effect#lt;#40;#41; =#gt; #123; readonly name: string; readonly age: number; #125;, never, never#gt;
node: Effect.gen#40;function*#40;#41; #123;#92;n const person: unknown = #123; name: #quot;Alice#quot;, age: 35 #125;#92;n const method = #40;#41; =#gt; Schema.encodeUnknownSync#40;Person#41;#40;person as any#41;#92;n // ^- this is inside another function context, should NOT trigger#92;n return method#92;n#125;#41;")))
- 35[/"type: #40;#41; =#gt; #123; readonly name: string; readonly age: number; #125;
node: method"/]
- 36[["type: #40;#41; =#gt; #123; readonly name: string; readonly age: number; #125;
node: #40;#41; =#gt; Schema.encodeUnknownSync#40;Person#41;#40;person as any#41;"]]
- 37[/"type: #123; readonly name: string; readonly age: number; #125;
node: Schema.encodeUnknownSync#40;Person#41;#40;person as any#41;"/]
- 38[/"type: Struct#lt;#123; readonly name: String; readonly age: Finite; #125;#gt;
node: Person"/]
- 39["type: #40;input: unknown, options?: ParseOptions #124; undefined#41; =#gt; #123; readonly name: string; readonly age: number; #125;
callee: Schema.encodeUnknownSync
args: #91;#93;"]
- 40[/"type: #lt;S extends Schema.Encoder#lt;unknown#gt;#gt;#40;schema: S#41; =#gt; #40;input: unknown, options?: ParseOptions #124; undefined#41; =#gt; S#91;#quot;Encoded#quot;#93;
node: Schema.encodeUnknownSync"/]
- 41((("type: Effect#lt;#123; readonly name: string; readonly age: number; #125;, never, never#gt;
node: function*#40;#41; #123;#92;n const input = #123; name: #quot;John#quot;, age: 30 #125;#92;n const person = Schema.decodeSync#40;Person#41;#40;input#41;#92;n // ^- should suggest using Schema.decode instead#92;n return person#92;n#125;")))
- 42[/"type: #123; readonly name: string; readonly age: number; #125;
node: person"/]
- 43[/"type: Struct#lt;#123; readonly name: String; readonly age: Finite; #125;#gt;
node: Person"/]
- 44["type: #40;input: #123; readonly name: string; readonly age: number; #125;, options?: ParseOptions #124; undefined#41; =#gt; #123; readonly name: string; readonly age: number; #125;
callee: Schema.decodeSync
args: #91;#93;"]
- 45[/"type: #lt;S extends Decoder#lt;unknown#gt;#gt;#40;schema: S#41; =#gt; #40;input: S#91;#quot;Encoded#quot;#93;, options?: ParseOptions #124; undefined#41; =#gt; S#91;#quot;Type#quot;#93;
node: Schema.decodeSync"/]
- 46[["type: #40;#41; =#gt; Effect#lt;#123; readonly name: string; readonly age: number; #125;, never, never#gt;
node: Effect.fn#40;#quot;fn1#quot;#41;#40;function*#40;#41; #123;#92;n const input = #123; name: #quot;John#quot;, age: 30 #125;#92;n const person = Schema.decodeSync#40;Person#41;#40;input#41;#92;n // ^- should suggest using Schema.decode instead#92;n return person#92;n#125;#41;"]]
+ 8((("type: Effect#lt;#123; readonly name: string; readonly age: number; #125;, never, never#gt;
node: Effect.gen#40;function*#40;#41; #123;#92;n const input: unknown = yield* Effect.succeed#40;#123; name: #quot;Jane#quot;, age: 25 #125;#41;#92;n const person = Schema.decodeUnknownSync#40;Person#41;#40;input#41;#92;n // ^- should suggest using Schema.decodeUnknown instead#92;n return person#92;n#125;#41;")))
+ 9[/"type: #123; readonly name: string; readonly age: number; #125;
node: person"/]
+ 10[/"type: #123; name: string; age: number; #125;
node: #123; name: #quot;Jane#quot;, age: 25 #125;"/]
+ 11["type: Effect#lt;#123; name: string; age: number; #125;, never, never#gt;
callee: Effect.succeed
args: #91;#93;"]
+ 12[/"type: #lt;A#gt;#40;value: A#41; =#gt; Effect#lt;A, never, never#gt;
node: Effect.succeed"/]
+ 13((("type: Effect#lt;#123; readonly name: string; readonly age: number; #125;, never, never#gt;
node: Effect.gen#40;function*#40;#41; #123;#92;n const person = #123; name: #quot;Bob#quot;, age: 40 #125;#92;n const encoded = Schema.encodeSync#40;Person#41;#40;person#41;#92;n // ^- should suggest using Schema.encode instead#92;n return encoded#92;n#125;#41;")))
+ 14[/"type: #123; readonly name: string; readonly age: number; #125;
node: encoded"/]
+ 15((("type: Effect#lt;#123; readonly name: string; readonly age: number; #125;, never, never#gt;
node: Effect.gen#40;function*#40;#41; #123;#92;n const person: unknown = #123; name: #quot;Alice#quot;, age: 35 #125;#92;n const encoded = Schema.encodeUnknownSync#40;Person#41;#40;person as any#41;#92;n // ^- should suggest using Schema.encodeUnknown instead#92;n return encoded#92;n#125;#41;")))
+ 16[/"type: #123; readonly name: string; readonly age: number; #125;
node: encoded"/]
+ 17[["type: #40;#41; =#gt; #123; readonly name: string; readonly age: number; #125;
node: #40;#41; =#gt; #123;#92;n const input = #123; name: #quot;Test#quot;, age: 20 #125;#92;n const person = Schema.decodeSync#40;Person#41;#40;input#41;#92;n return person#92;n#125;"]]
+ 18[/"type: #123; readonly name: string; readonly age: number; #125;
node: person"/]
+ 19((("type: Effect#lt;#40;#41; =#gt; #123; readonly name: string; readonly age: number; #125;, never, never#gt;
node: Effect.gen#40;function*#40;#41; #123;#92;n const person: unknown = #123; name: #quot;Alice#quot;, age: 35 #125;#92;n const method = #40;#41; =#gt; Schema.encodeUnknownSync#40;Person#41;#40;person as any#41;#92;n // ^- this is inside another function context, should NOT trigger#92;n return method#92;n#125;#41;")))
+ 20[/"type: #40;#41; =#gt; #123; readonly name: string; readonly age: number; #125;
node: method"/]
+ 21[["type: #40;#41; =#gt; #123; readonly name: string; readonly age: number; #125;
node: #40;#41; =#gt; Schema.encodeUnknownSync#40;Person#41;#40;person as any#41;"]]
+ 22[/"type: #123; readonly name: string; readonly age: number; #125;
node: Schema.encodeUnknownSync#40;Person#41;#40;person as any#41;"/]
+ 23((("type: Effect#lt;#123; readonly name: string; readonly age: number; #125;, never, never#gt;
node: function*#40;#41; #123;#92;n const input = #123; name: #quot;John#quot;, age: 30 #125;#92;n const person = Schema.decodeSync#40;Person#41;#40;input#41;#92;n // ^- should suggest using Schema.decode instead#92;n return person#92;n#125;")))
+ 24[/"type: #123; readonly name: string; readonly age: number; #125;
node: person"/]
+ 25[["type: #40;#41; =#gt; Effect#lt;#123; readonly name: string; readonly age: number; #125;, never, never#gt;
node: Effect.fn#40;#quot;fn1#quot;#41;#40;function*#40;#41; #123;#92;n const input = #123; name: #quot;John#quot;, age: 30 #125;#92;n const person = Schema.decodeSync#40;Person#41;#40;input#41;#92;n // ^- should suggest using Schema.decode instead#92;n return person#92;n#125;#41;"]]
0 -->|"kind: pipe"| 1
2 -->|"kind: transformCallee"| 1
4 -->|"kind: potentialReturn"| 3
5 -->|"kind: pipe"| 6
7 -->|"kind: transformCallee"| 6
6 -->|"kind: yieldable"| 3
- 8 -->|"kind: pipe"| 9
- 10 -->|"kind: transformCallee"| 9
- 9 -->|"kind: usedBy"| 3
4 -->|"kind: usedBy"| 3
- 12 -->|"kind: potentialReturn"| 11
- 13 -->|"kind: pipe"| 14
- 15 -->|"kind: transformCallee"| 14
- 14 -->|"kind: yieldable"| 11
- 16 -->|"kind: pipe"| 17
- 18 -->|"kind: transformCallee"| 17
- 17 -->|"kind: usedBy"| 11
- 12 -->|"kind: usedBy"| 11
+ 9 -->|"kind: potentialReturn"| 8
+ 10 -->|"kind: pipe"| 11
+ 12 -->|"kind: transformCallee"| 11
+ 11 -->|"kind: yieldable"| 8
+ 9 -->|"kind: usedBy"| 8
+ 14 -->|"kind: potentialReturn"| 13
+ 14 -->|"kind: usedBy"| 13
+ 16 -->|"kind: potentialReturn"| 15
+ 16 -->|"kind: usedBy"| 15
+ 18 -->|"kind: potentialReturn"| 17
+ 18 -->|"kind: usedBy"| 17
20 -->|"kind: potentialReturn"| 19
- 21 -->|"kind: pipe"| 22
- 23 -->|"kind: transformCallee"| 22
- 22 -->|"kind: usedBy"| 19
+ 22 -->|"kind: potentialReturn"| 21
+ 21 -->|"kind: usedBy"| 19
20 -->|"kind: usedBy"| 19
- 25 -->|"kind: potentialReturn"| 24
- 26 -->|"kind: pipe"| 27
- 28 -->|"kind: transformCallee"| 27
- 27 -->|"kind: usedBy"| 24
- 25 -->|"kind: usedBy"| 24
- 30 -->|"kind: potentialReturn"| 29
- 31 -->|"kind: pipe"| 32
- 33 -->|"kind: transformCallee"| 32
- 32 -->|"kind: usedBy"| 29
- 30 -->|"kind: usedBy"| 29
- 35 -->|"kind: potentialReturn"| 34
- 38 -->|"kind: pipe"| 39
- 40 -->|"kind: transformCallee"| 39
- 39 -->|"kind: usedBy"| 37
- 37 -->|"kind: potentialReturn"| 36
- 36 -->|"kind: usedBy"| 34
- 35 -->|"kind: usedBy"| 34
- 42 -->|"kind: potentialReturn"| 41
- 43 -->|"kind: pipe"| 44
- 45 -->|"kind: transformCallee"| 44
- 44 -->|"kind: usedBy"| 41
- 42 -->|"kind: usedBy"| 41
- 41 -->|"kind: potentialReturn"| 46
\ No newline at end of file
+ 24 -->|"kind: potentialReturn"| 23
+ 24 -->|"kind: usedBy"| 23
+ 23 -->|"kind: potentialReturn"| 25
\ No newline at end of file
diff --git a/testdata/baselines/reference/effect-v4/schemaSyncInEffect_thunks.flows.schemaSyncInEffect_thunks.mermaid b/testdata/baselines/reference/effect-v4/schemaSyncInEffect_thunks.flows.schemaSyncInEffect_thunks.mermaid
index 7f30d9a6..ab1dde26 100644
--- a/testdata/baselines/reference/effect-v4/schemaSyncInEffect_thunks.flows.schemaSyncInEffect_thunks.mermaid
+++ b/testdata/baselines/reference/effect-v4/schemaSyncInEffect_thunks.flows.schemaSyncInEffect_thunks.mermaid
@@ -7,84 +7,54 @@ flowchart TB
5[/"type: #lt;const Fields extends Struct.Fields#gt;#40;fields: Fields#41; =#gt; Struct#lt;Fields#gt;
node: Schema.Struct"/]
6[["type: #40;#41; =#gt; #123; readonly name: string; readonly age: number; #125;
node: #40;#41; =#gt; Schema.decodeSync#40;Person#41;#40;#123; name: #quot;John#quot;, age: 30 #125;#41;"]]
7[/"type: #123; readonly name: string; readonly age: number; #125;
node: Schema.decodeSync#40;Person#41;#40;#123; name: #quot;John#quot;, age: 30 #125;#41;"/]
- 8[/"type: Struct#lt;#123; readonly name: String; readonly age: Finite; #125;#gt;
node: Person"/]
- 9["type: #40;input: #123; readonly name: string; readonly age: number; #125;, options?: ParseOptions #124; undefined#41; =#gt; #123; readonly name: string; readonly age: number; #125;
callee: Schema.decodeSync
args: #91;#93;"]
- 10[/"type: #lt;S extends Decoder#lt;unknown#gt;#gt;#40;schema: S#41; =#gt; #40;input: S#91;#quot;Encoded#quot;#93;, options?: ParseOptions #124; undefined#41; =#gt; S#91;#quot;Type#quot;#93;
node: Schema.decodeSync"/]
- 11["type: Effect#lt;#123; readonly name: string; readonly age: number; #125;, never, never#gt;
callee: Effect.sync
args: #91;#93;"]
- 12[/"type: #lt;A#gt;#40;thunk: LazyArg#lt;A#gt;#41; =#gt; Effect#lt;A, never, never#gt;
node: Effect.sync"/]
- 13[/"type: #123; try: #40;#41; =#gt; #123; readonly name: string; readonly age: number; #125;; catch: #40;#41; =#gt; ExampleError; #125;
node: #123;#92;n try: #40;#41; =#gt; Schema.decodeSync#40;Person#41;#40;#123; name: #quot;Jane#quot;, age: 25 #125;#41;,#92;n catch: #40;#41; =#gt; new ExampleError#40;#41;#92;n#125;"/]
- 14[["type: #40;#41; =#gt; #123; readonly name: string; readonly age: number; #125;
node: #40;#41; =#gt; Schema.decodeSync#40;Person#41;#40;#123; name: #quot;Jane#quot;, age: 25 #125;#41;"]]
- 15[/"type: #123; readonly name: string; readonly age: number; #125;
node: Schema.decodeSync#40;Person#41;#40;#123; name: #quot;Jane#quot;, age: 25 #125;#41;"/]
- 16[/"type: Struct#lt;#123; readonly name: String; readonly age: Finite; #125;#gt;
node: Person"/]
- 17["type: #40;input: #123; readonly name: string; readonly age: number; #125;, options?: ParseOptions #124; undefined#41; =#gt; #123; readonly name: string; readonly age: number; #125;
callee: Schema.decodeSync
args: #91;#93;"]
- 18[/"type: #lt;S extends Decoder#lt;unknown#gt;#gt;#40;schema: S#41; =#gt; #40;input: S#91;#quot;Encoded#quot;#93;, options?: ParseOptions #124; undefined#41; =#gt; S#91;#quot;Type#quot;#93;
node: Schema.decodeSync"/]
- 19[["type: #40;#41; =#gt; ExampleError
node: #40;#41; =#gt; new ExampleError#40;#41;"]]
- 20[/"type: ExampleError
node: new ExampleError#40;#41;"/]
- 21["type: Effect#lt;#123; readonly name: string; readonly age: number; #125;, ExampleError, never#gt;
callee: Effect.try
args: #91;#93;"]
- 22[/"type: #lt;A, E#gt;#40;options: #123; try: LazyArg#lt;A#gt;; catch: #40;error: unknown#41; =#gt; E; #125;#41; =#gt; Effect#lt;A, E, never#gt;
node: Effect.try"/]
- 23[["type: #40;#41; =#gt; Promise#lt;#123; readonly name: string; readonly age: number; #125;#gt;
node: async #40;#41; =#gt; Schema.encodeSync#40;Person#41;#40;#123; name: #quot;Bob#quot;, age: 40 #125;#41;"]]
- 24[/"type: #123; readonly name: string; readonly age: number; #125;
node: Schema.encodeSync#40;Person#41;#40;#123; name: #quot;Bob#quot;, age: 40 #125;#41;"/]
- 25[/"type: Struct#lt;#123; readonly name: String; readonly age: Finite; #125;#gt;
node: Person"/]
- 26["type: #40;input: #123; readonly name: string; readonly age: number; #125;, options?: ParseOptions #124; undefined#41; =#gt; #123; readonly name: string; readonly age: number; #125;
callee: Schema.encodeSync
args: #91;#93;"]
- 27[/"type: #lt;S extends Encoder#lt;unknown#gt;#gt;#40;schema: S#41; =#gt; #40;input: S#91;#quot;Type#quot;#93;, options?: ParseOptions #124; undefined#41; =#gt; S#91;#quot;Encoded#quot;#93;
node: Schema.encodeSync"/]
- 28["type: Effect#lt;#123; readonly name: string; readonly age: number; #125;, UnknownError, never#gt;
callee: Effect.tryPromise
args: #91;#93;"]
- 29[/"type: #lt;A, E = UnknownError#gt;#40;options: #123; readonly try: #40;signal: AbortSignal#41; =#gt; PromiseLike#lt;A#gt;; readonly catch: #40;error: unknown#41; =#gt; E; #125; #124; #40;#40;signal: AbortSignal#41; =#gt; PromiseLike#lt;A#gt;#41;#41; =#gt; Effect#lt;A, E, never#gt;
node: Effect.tryPromise"/]
- 30[/"type: #123; try: #40;#41; =#gt; Promise#lt;#123; readonly name: string; readonly age: number; #125;#gt;; catch: #40;#41; =#gt; ExampleError; #125;
node: #123;#92;n try: async #40;#41; =#gt; Schema.encodeUnknownSync#40;Person#41;#40;#123; name: #quot;Carol#quot;, age: 50 #125;#41;,#92;n catch: #40;#41; =#gt; new ExampleError#40;#41;#92;n#125;"/]
- 31[["type: #40;#41; =#gt; Promise#lt;#123; readonly name: string; readonly age: number; #125;#gt;
node: async #40;#41; =#gt; Schema.encodeUnknownSync#40;Person#41;#40;#123; name: #quot;Carol#quot;, age: 50 #125;#41;"]]
- 32[/"type: #123; readonly name: string; readonly age: number; #125;
node: Schema.encodeUnknownSync#40;Person#41;#40;#123; name: #quot;Carol#quot;, age: 50 #125;#41;"/]
- 33[/"type: Struct#lt;#123; readonly name: String; readonly age: Finite; #125;#gt;
node: Person"/]
- 34["type: #40;input: unknown, options?: ParseOptions #124; undefined#41; =#gt; #123; readonly name: string; readonly age: number; #125;
callee: Schema.encodeUnknownSync
args: #91;#93;"]
- 35[/"type: #lt;S extends Schema.Encoder#lt;unknown#gt;#gt;#40;schema: S#41; =#gt; #40;input: unknown, options?: ParseOptions #124; undefined#41; =#gt; S#91;#quot;Encoded#quot;#93;
node: Schema.encodeUnknownSync"/]
- 36[["type: #40;#41; =#gt; ExampleError
node: #40;#41; =#gt; new ExampleError#40;#41;"]]
- 37[/"type: ExampleError
node: new ExampleError#40;#41;"/]
- 38["type: Effect#lt;#123; readonly name: string; readonly age: number; #125;, ExampleError, never#gt;
callee: Effect.tryPromise
args: #91;#93;"]
- 39[/"type: #lt;A, E = UnknownError#gt;#40;options: #123; readonly try: #40;signal: AbortSignal#41; =#gt; PromiseLike#lt;A#gt;; readonly catch: #40;error: unknown#41; =#gt; E; #125; #124; #40;#40;signal: AbortSignal#41; =#gt; PromiseLike#lt;A#gt;#41;#41; =#gt; Effect#lt;A, E, never#gt;
node: Effect.tryPromise"/]
- 40[["type: #40;#41; =#gt; #40;#41; =#gt; #123; readonly name: string; readonly age: number; #125;
node: #40;#41; =#gt; #40;#41; =#gt; Schema.decodeSync#40;Person#41;#40;#123; name: #quot;Nested#quot;, age: 10 #125;#41;"]]
- 41[["type: #40;#41; =#gt; #123; readonly name: string; readonly age: number; #125;
node: #40;#41; =#gt; Schema.decodeSync#40;Person#41;#40;#123; name: #quot;Nested#quot;, age: 10 #125;#41;"]]
- 42[/"type: #123; readonly name: string; readonly age: number; #125;
node: Schema.decodeSync#40;Person#41;#40;#123; name: #quot;Nested#quot;, age: 10 #125;#41;"/]
- 43[/"type: Struct#lt;#123; readonly name: String; readonly age: Finite; #125;#gt;
node: Person"/]
- 44["type: #40;input: #123; readonly name: string; readonly age: number; #125;, options?: ParseOptions #124; undefined#41; =#gt; #123; readonly name: string; readonly age: number; #125;
callee: Schema.decodeSync
args: #91;#93;"]
- 45[/"type: #lt;S extends Decoder#lt;unknown#gt;#gt;#40;schema: S#41; =#gt; #40;input: S#91;#quot;Encoded#quot;#93;, options?: ParseOptions #124; undefined#41; =#gt; S#91;#quot;Type#quot;#93;
node: Schema.decodeSync"/]
- 46["type: Effect#lt;#40;#41; =#gt; #123; readonly name: string; readonly age: number; #125;, never, never#gt;
callee: Effect.sync
args: #91;#93;"]
- 47[/"type: #lt;A#gt;#40;thunk: LazyArg#lt;A#gt;#41; =#gt; Effect#lt;A, never, never#gt;
node: Effect.sync"/]
+ 8["type: Effect#lt;#123; readonly name: string; readonly age: number; #125;, never, never#gt;
callee: Effect.sync
args: #91;#93;"]
+ 9[/"type: #lt;A#gt;#40;thunk: LazyArg#lt;A#gt;#41; =#gt; Effect#lt;A, never, never#gt;
node: Effect.sync"/]
+ 10[/"type: #123; try: #40;#41; =#gt; #123; readonly name: string; readonly age: number; #125;; catch: #40;#41; =#gt; ExampleError; #125;
node: #123;#92;n try: #40;#41; =#gt; Schema.decodeSync#40;Person#41;#40;#123; name: #quot;Jane#quot;, age: 25 #125;#41;,#92;n catch: #40;#41; =#gt; new ExampleError#40;#41;#92;n#125;"/]
+ 11[["type: #40;#41; =#gt; #123; readonly name: string; readonly age: number; #125;
node: #40;#41; =#gt; Schema.decodeSync#40;Person#41;#40;#123; name: #quot;Jane#quot;, age: 25 #125;#41;"]]
+ 12[/"type: #123; readonly name: string; readonly age: number; #125;
node: Schema.decodeSync#40;Person#41;#40;#123; name: #quot;Jane#quot;, age: 25 #125;#41;"/]
+ 13[["type: #40;#41; =#gt; ExampleError
node: #40;#41; =#gt; new ExampleError#40;#41;"]]
+ 14[/"type: ExampleError
node: new ExampleError#40;#41;"/]
+ 15["type: Effect#lt;#123; readonly name: string; readonly age: number; #125;, ExampleError, never#gt;
callee: Effect.try
args: #91;#93;"]
+ 16[/"type: #lt;A, E#gt;#40;options: #123; try: LazyArg#lt;A#gt;; catch: #40;error: unknown#41; =#gt; E; #125;#41; =#gt; Effect#lt;A, E, never#gt;
node: Effect.try"/]
+ 17[["type: #40;#41; =#gt; Promise#lt;#123; readonly name: string; readonly age: number; #125;#gt;
node: async #40;#41; =#gt; Schema.encodeSync#40;Person#41;#40;#123; name: #quot;Bob#quot;, age: 40 #125;#41;"]]
+ 18[/"type: #123; readonly name: string; readonly age: number; #125;
node: Schema.encodeSync#40;Person#41;#40;#123; name: #quot;Bob#quot;, age: 40 #125;#41;"/]
+ 19["type: Effect#lt;#123; readonly name: string; readonly age: number; #125;, UnknownError, never#gt;
callee: Effect.tryPromise
args: #91;#93;"]
+ 20[/"type: #lt;A, E = UnknownError#gt;#40;options: #123; readonly try: #40;signal: AbortSignal#41; =#gt; PromiseLike#lt;A#gt;; readonly catch: #40;error: unknown#41; =#gt; E; #125; #124; #40;#40;signal: AbortSignal#41; =#gt; PromiseLike#lt;A#gt;#41;#41; =#gt; Effect#lt;A, E, never#gt;
node: Effect.tryPromise"/]
+ 21[/"type: #123; try: #40;#41; =#gt; Promise#lt;#123; readonly name: string; readonly age: number; #125;#gt;; catch: #40;#41; =#gt; ExampleError; #125;
node: #123;#92;n try: async #40;#41; =#gt; Schema.encodeUnknownSync#40;Person#41;#40;#123; name: #quot;Carol#quot;, age: 50 #125;#41;,#92;n catch: #40;#41; =#gt; new ExampleError#40;#41;#92;n#125;"/]
+ 22[["type: #40;#41; =#gt; Promise#lt;#123; readonly name: string; readonly age: number; #125;#gt;
node: async #40;#41; =#gt; Schema.encodeUnknownSync#40;Person#41;#40;#123; name: #quot;Carol#quot;, age: 50 #125;#41;"]]
+ 23[/"type: #123; readonly name: string; readonly age: number; #125;
node: Schema.encodeUnknownSync#40;Person#41;#40;#123; name: #quot;Carol#quot;, age: 50 #125;#41;"/]
+ 24[["type: #40;#41; =#gt; ExampleError
node: #40;#41; =#gt; new ExampleError#40;#41;"]]
+ 25[/"type: ExampleError
node: new ExampleError#40;#41;"/]
+ 26["type: Effect#lt;#123; readonly name: string; readonly age: number; #125;, ExampleError, never#gt;
callee: Effect.tryPromise
args: #91;#93;"]
+ 27[/"type: #lt;A, E = UnknownError#gt;#40;options: #123; readonly try: #40;signal: AbortSignal#41; =#gt; PromiseLike#lt;A#gt;; readonly catch: #40;error: unknown#41; =#gt; E; #125; #124; #40;#40;signal: AbortSignal#41; =#gt; PromiseLike#lt;A#gt;#41;#41; =#gt; Effect#lt;A, E, never#gt;
node: Effect.tryPromise"/]
+ 28[["type: #40;#41; =#gt; #40;#41; =#gt; #123; readonly name: string; readonly age: number; #125;
node: #40;#41; =#gt; #40;#41; =#gt; Schema.decodeSync#40;Person#41;#40;#123; name: #quot;Nested#quot;, age: 10 #125;#41;"]]
+ 29[["type: #40;#41; =#gt; #123; readonly name: string; readonly age: number; #125;
node: #40;#41; =#gt; Schema.decodeSync#40;Person#41;#40;#123; name: #quot;Nested#quot;, age: 10 #125;#41;"]]
+ 30[/"type: #123; readonly name: string; readonly age: number; #125;
node: Schema.decodeSync#40;Person#41;#40;#123; name: #quot;Nested#quot;, age: 10 #125;#41;"/]
+ 31["type: Effect#lt;#40;#41; =#gt; #123; readonly name: string; readonly age: number; #125;, never, never#gt;
callee: Effect.sync
args: #91;#93;"]
+ 32[/"type: #lt;A#gt;#40;thunk: LazyArg#lt;A#gt;#41; =#gt; Effect#lt;A, never, never#gt;
node: Effect.sync"/]
0 -->|"kind: pipe"| 1
2 -->|"kind: transformCallee"| 1
3 -->|"kind: pipe"| 4
5 -->|"kind: transformCallee"| 4
- 8 -->|"kind: pipe"| 9
- 10 -->|"kind: transformCallee"| 9
- 9 -->|"kind: usedBy"| 7
7 -->|"kind: potentialReturn"| 6
- 6 -->|"kind: pipe"| 11
- 12 -->|"kind: transformCallee"| 11
- 16 -->|"kind: pipe"| 17
- 18 -->|"kind: transformCallee"| 17
- 17 -->|"kind: usedBy"| 15
- 15 -->|"kind: potentialReturn"| 14
- 14 -->|"kind: usedBy"| 13
- 20 -->|"kind: potentialReturn"| 19
- 19 -->|"kind: usedBy"| 13
- 13 -->|"kind: pipe"| 21
- 22 -->|"kind: transformCallee"| 21
- 25 -->|"kind: pipe"| 26
+ 6 -->|"kind: pipe"| 8
+ 9 -->|"kind: transformCallee"| 8
+ 12 -->|"kind: potentialReturn"| 11
+ 11 -->|"kind: usedBy"| 10
+ 14 -->|"kind: potentialReturn"| 13
+ 13 -->|"kind: usedBy"| 10
+ 10 -->|"kind: pipe"| 15
+ 16 -->|"kind: transformCallee"| 15
+ 18 -->|"kind: potentialReturn"| 17
+ 17 -->|"kind: pipe"| 19
+ 20 -->|"kind: transformCallee"| 19
+ 23 -->|"kind: potentialReturn"| 22
+ 22 -->|"kind: usedBy"| 21
+ 25 -->|"kind: potentialReturn"| 24
+ 24 -->|"kind: usedBy"| 21
+ 21 -->|"kind: pipe"| 26
27 -->|"kind: transformCallee"| 26
- 26 -->|"kind: usedBy"| 24
- 24 -->|"kind: potentialReturn"| 23
- 23 -->|"kind: pipe"| 28
- 29 -->|"kind: transformCallee"| 28
- 33 -->|"kind: pipe"| 34
- 35 -->|"kind: transformCallee"| 34
- 34 -->|"kind: usedBy"| 32
- 32 -->|"kind: potentialReturn"| 31
- 31 -->|"kind: usedBy"| 30
- 37 -->|"kind: potentialReturn"| 36
- 36 -->|"kind: usedBy"| 30
- 30 -->|"kind: pipe"| 38
- 39 -->|"kind: transformCallee"| 38
- 43 -->|"kind: pipe"| 44
- 45 -->|"kind: transformCallee"| 44
- 44 -->|"kind: usedBy"| 42
- 42 -->|"kind: potentialReturn"| 41
- 41 -->|"kind: potentialReturn"| 40
- 40 -->|"kind: pipe"| 46
- 47 -->|"kind: transformCallee"| 46
\ No newline at end of file
+ 30 -->|"kind: potentialReturn"| 29
+ 29 -->|"kind: potentialReturn"| 28
+ 28 -->|"kind: pipe"| 31
+ 32 -->|"kind: transformCallee"| 31
\ No newline at end of file
diff --git a/testdata/baselines/reference/effect-v4/unnecessaryFailYieldableError.flows.unnecessaryFailYieldableError.mermaid b/testdata/baselines/reference/effect-v4/unnecessaryFailYieldableError.flows.unnecessaryFailYieldableError.mermaid
index 6c6d8e2e..cbc7c735 100644
--- a/testdata/baselines/reference/effect-v4/unnecessaryFailYieldableError.flows.unnecessaryFailYieldableError.mermaid
+++ b/testdata/baselines/reference/effect-v4/unnecessaryFailYieldableError.flows.unnecessaryFailYieldableError.mermaid
@@ -10,7 +10,7 @@ flowchart TB
8[/"type: #lt;Self = never, Brand = #123;#125;#gt;#40;identifier: string#41; =#gt; #123; #lt;const Fields extends Struct.Fields#gt;#40;fields: Fields, annotations?: Declaration#lt;Self, readonly #91;Struct#lt;Fields#gt;#93;#gt; #124; undefined#41;: #91;Self#93; extends #91;never#93; ? #quot;Missing `Self` generic - use `class Self extends Schema.ErrorClass#lt;Self#gt;#40;...#41;`#quot; : Class#lt;Self, Struct#lt;Fields#gt;, YieldableError #amp; Brand#gt;; #lt;S extends Struct#lt;Struct.Fields#gt;#gt;#40;schema: S, annotations?: Declaration#lt;Self, readonly #91;S#93;#gt; #124; undefined#41;: #91;Self#93; extends #91;never#93; ? #quot;Missing `Self` generic - use `class Self extends Schema.ErrorClass#lt;Self#gt;#40;...#41;`#quot; : Class#lt;Self, S, YieldableError #amp; Brand#gt;; #125;
node: Schema.ErrorClass"/]
9[/"type: #quot;SchemaError#quot;
node: #quot;SchemaError#quot;"/]
10["type: tag#lt;#quot;SchemaError#quot;#gt;
callee: Schema.tag
args: #91;#93;"]
- 11[/"type: #lt;Tag extends AST.LiteralValue#gt;#40;literal: Tag#41; =#gt; tag#lt;Tag#gt;
node: Schema.tag"/]
+ 11[/"type: #lt;Tag extends SchemaAST.LiteralValue#gt;#40;literal: Tag#41; =#gt; tag#lt;Tag#gt;
node: Schema.tag"/]
12((("type: Effect#lt;void, DataTaggedError #124; NonYieldable #124; SchemaError, never#gt;
node: Effect.gen#40;function*#40;#41; #123;#92;n // should not report#92;n yield* Effect.fail#40;new NonYieldable#40;#quot;non-yieldable error#quot;#41;#41;#92;n const err = new DataTaggedError#40;#41;#92;n console.log#40;err#41;#92;n // should report#92;n yield* Effect.fail#40;new DataTaggedError#40;#41;#41;#92;n yield* Effect.fail#40;new SchemaError#40;#123;#125;#41;#41;#92;n#125;#41;")))
13[/"type: NonYieldable
node: new NonYieldable#40;#quot;non-yieldable error#quot;#41;"/]
14["type: Effect#lt;never, NonYieldable, never#gt;
callee: Effect.fail
args: #91;#93;"]
diff --git a/testdata/baselines/reference/inlayHints/effectInlayHintsDisabledPassthrough.baseline b/testdata/baselines/reference/inlayHints/effectInlayHintsDisabledPassthrough.baseline
index 396c3dc9..70e5e78e 100644
--- a/testdata/baselines/reference/inlayHints/effectInlayHintsDisabledPassthrough.baseline
+++ b/testdata/baselines/reference/inlayHints/effectInlayHintsDisabledPassthrough.baseline
@@ -53,11 +53,11 @@ export const sample = Effect.gen(function*() {
"uri": "file:///node_modules/effect/dist/Effect.d.ts",
"range": {
"start": {
- "line": 146,
+ "line": 79,
"character": 17
},
"end": {
- "line": 146,
+ "line": 79,
"character": 23
}
}
diff --git a/testdata/baselines/reference/metadata.json b/testdata/baselines/reference/metadata.json
index 97527566..72ac492a 100644
--- a/testdata/baselines/reference/metadata.json
+++ b/testdata/baselines/reference/metadata.json
@@ -752,7 +752,7 @@
377037
],
"preview": {
- "sourceText": "import * as Effect from \"effect/Effect\"\nimport * as Schema from \"effect/Schema\"\n\nconst Person = Schema.Struct({ name: Schema.String, age: Schema.Number })\n\nexport const preview = Effect.gen(function*() {\n const input = yield* Effect.succeed({ name: \"Ada\", age: 1 })\n return Schema.decodeSync(Person)(input)\n})",
+ "sourceText": "import * as Effect from \"effect/Effect\"\nimport * as Schema from \"effect/Schema\"\n\nconst Person = Schema.Struct({ name: Schema.String, age: Schema.Finite })\n\nexport const preview = Effect.gen(function*() {\n const input = yield* Effect.succeed({ name: \"Ada\", age: 1 })\n return Schema.decodeSync(Person)(input)\n})\n",
"diagnostics": [
{
"start": 276,
@@ -1385,6 +1385,30 @@
]
}
},
+ {
+ "name": "catchToOrElseSucceed",
+ "group": "style",
+ "description": "Suggests using Effect.orElseSucceed instead of Effect.catch + Effect.succeed",
+ "defaultSeverity": "suggestion",
+ "fixable": true,
+ "supportedEffect": [
+ "v3",
+ "v4"
+ ],
+ "codes": [
+ 377095
+ ],
+ "preview": {
+ "sourceText": "import { Effect } from \"effect\"\n\nexport const program = Effect.fail(\"error\").pipe(\n Effect.catch(() =\u003e Effect.succeed(42))\n)\n",
+ "diagnostics": [
+ {
+ "start": 85,
+ "end": 97,
+ "text": "`Effect.orElseSucceed` expresses the same recovery more directly than `Effect.catch` followed by `Effect.succeed`. effect(catchToOrElseSucceed)"
+ }
+ ]
+ }
+ },
{
"name": "deterministicKeys",
"group": "style",
@@ -1543,7 +1567,7 @@
377050
],
"preview": {
- "sourceText": "import { identity, Schema } from \"effect\"\n\nconst User = Schema.Struct({ id: Schema.Number })\nexport const preview = identity(identity(Schema.decodeEffect(User)({ id: 1 })))\n",
+ "sourceText": "import { identity, Schema } from \"effect\"\n\nconst User = Schema.Struct({ id: Schema.Finite })\nexport const preview = identity(identity(Schema.decodeEffect(User)({ id: 1 })))\n",
"diagnostics": [
{
"start": 116,
@@ -1624,6 +1648,29 @@
]
}
},
+ {
+ "name": "newSchemaClass",
+ "group": "style",
+ "description": "Suggests using Schema make instead of new for Schema classes",
+ "defaultSeverity": "off",
+ "fixable": true,
+ "supportedEffect": [
+ "v4"
+ ],
+ "codes": [
+ 377094
+ ],
+ "preview": {
+ "sourceText": "import { Schema } from \"effect\"\n\nclass User extends Schema.Class\u003cUser\u003e(\"User\")({ name: Schema.String }) {}\n\nexport const preview = new User({ name: \"John\" })\n",
+ "diagnostics": [
+ {
+ "start": 135,
+ "end": 139,
+ "text": "This Schema class is constructed with `new`. `User.make(...)` can be used to construct the Schema class instance. effect(newSchemaClass)"
+ }
+ ]
+ }
+ },
{
"name": "redundantMapError",
"group": "style",
@@ -1649,6 +1696,31 @@
]
}
},
+ {
+ "name": "redundantOrDie",
+ "group": "style",
+ "description": "Suggests hoisting a repeated trailing Effect.orDie from every yield in an Effect generator",
+ "defaultSeverity": "suggestion",
+ "fixable": false,
+ "supportedEffect": [
+ "v3",
+ "v4"
+ ],
+ "codes": [
+ 377096,
+ 377097
+ ],
+ "preview": {
+ "sourceText": "import { Effect } from \"effect\"\n\ndeclare const first: Effect.Effect\u003cnumber, unknown\u003e\ndeclare const second: Effect.Effect\u003cstring, unknown\u003e\n\nexport const program = Effect.gen(function*() {\n yield* first.pipe(Effect.orDie)\n\n return yield* second.pipe(Effect.orDie)\n})\n",
+ "diagnostics": [
+ {
+ "start": 173,
+ "end": 182,
+ "text": "This generator applies `Effect.orDie` to every yielded effect. Hoist it once to the generator result: `Effect.gen(...).pipe(Effect.orDie)`, or `Effect.fn(function*(){ ... }, Effect.orDie)`. effect(redundantOrDie)"
+ }
+ ]
+ }
+ },
{
"name": "redundantSchemaTagIdentifier",
"group": "style",
@@ -1673,6 +1745,34 @@
]
}
},
+ {
+ "name": "schemaNumber",
+ "group": "style",
+ "description": "Suggests Schema.Finite and Schema.FiniteFromString instead of Schema.Number APIs when describing domain numbers",
+ "defaultSeverity": "suggestion",
+ "fixable": true,
+ "supportedEffect": [
+ "v4"
+ ],
+ "codes": [
+ 377098
+ ],
+ "preview": {
+ "sourceText": "\nimport { Schema } from \"effect\"\n\nexport const User = Schema.Struct({\n age: Schema.Number,\n score: Schema.NumberFromString\n})\n",
+ "diagnostics": [
+ {
+ "start": 84,
+ "end": 90,
+ "text": "This Schema number API accepts `NaN`, `Infinity`, and `-Infinity`. Use `Schema.Finite` for finite domain numbers. If non-finite values are intentional, disable this diagnostic for that line. effect(schemaNumber)"
+ },
+ {
+ "start": 108,
+ "end": 124,
+ "text": "This Schema number API accepts `NaN`, `Infinity`, and `-Infinity`. Use `Schema.FiniteFromString` for finite domain numbers. If non-finite values are intentional, disable this diagnostic for that line. effect(schemaNumber)"
+ }
+ ]
+ }
+ },
{
"name": "schemaStructWithTag",
"group": "style",
@@ -1906,7 +2006,7 @@
377090
],
"preview": {
- "sourceText": "import { Schema } from \"effect\"\n\nexport namespace UsersRepo {\n export const User = Schema.Struct({ id: Schema.Number })\n export type User = typeof User.Type\n}\n\nexport const preview: typeof UsersRepo.User.Type = { id: 1 }\n",
+ "sourceText": "import { Schema } from \"effect\"\n\nexport namespace UsersRepo {\n export const User = Schema.Struct({ id: Schema.Finite })\n export type User = typeof User.Type\n}\n\nexport const preview: typeof UsersRepo.User.Type = { id: 1 }\n",
"diagnostics": [
{
"start": 184,
diff --git a/testdata/tests/effect-v4-document-symbols/package.json b/testdata/tests/effect-v4-document-symbols/package.json
index 34749e29..e0ce15e2 100644
--- a/testdata/tests/effect-v4-document-symbols/package.json
+++ b/testdata/tests/effect-v4-document-symbols/package.json
@@ -2,7 +2,7 @@
"name": "effect-v4-document-symbols-tests",
"private": true,
"dependencies": {
- "effect": "4.0.0-beta.66",
+ "effect": "4.0.0-beta.83",
"@standard-schema/spec": "^1.1.0",
"fast-check": "^4.4.0",
"pure-rand": "^7.0.0",
diff --git a/testdata/tests/effect-v4-refactors/package.json b/testdata/tests/effect-v4-refactors/package.json
index b9b937ae..19ab611e 100644
--- a/testdata/tests/effect-v4-refactors/package.json
+++ b/testdata/tests/effect-v4-refactors/package.json
@@ -2,7 +2,7 @@
"name": "effect-v4-refactors-tests",
"private": true,
"dependencies": {
- "effect": "4.0.0-beta.66",
+ "effect": "4.0.0-beta.83",
"@standard-schema/spec": "^1.1.0",
"fast-check": "^4.4.0",
"pure-rand": "^7.0.0",
diff --git a/testdata/tests/effect-v4/package.json b/testdata/tests/effect-v4/package.json
index 45dd6663..c05312d5 100644
--- a/testdata/tests/effect-v4/package.json
+++ b/testdata/tests/effect-v4/package.json
@@ -2,7 +2,7 @@
"name": "effect-v4-tests",
"private": true,
"dependencies": {
- "effect": "4.0.0-beta.66",
+ "effect": "4.0.0-beta.83",
"@standard-schema/spec": "^1.1.0",
"fast-check": "^4.4.0",
"pure-rand": "^7.0.0",