@sayoriqwq/effect-harness 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/HARNESS.md +34 -0
- package/README.md +113 -0
- package/dist/bin/effect-harness.d.ts +2 -0
- package/dist/bin/effect-harness.js +39 -0
- package/dist/bin/effect-harness.js.map +1 -0
- package/dist/src/cli/Main.d.ts +6 -0
- package/dist/src/cli/Main.js +141 -0
- package/dist/src/cli/Main.js.map +1 -0
- package/dist/src/harness/CraftSkills.d.ts +14 -0
- package/dist/src/harness/CraftSkills.js +164 -0
- package/dist/src/harness/CraftSkills.js.map +1 -0
- package/dist/src/harness/Errors.d.ts +24 -0
- package/dist/src/harness/Errors.js +26 -0
- package/dist/src/harness/Errors.js.map +1 -0
- package/dist/src/harness/GuardrailRules.d.ts +6 -0
- package/dist/src/harness/GuardrailRules.js +303 -0
- package/dist/src/harness/GuardrailRules.js.map +1 -0
- package/dist/src/harness/Guardrails.d.ts +10 -0
- package/dist/src/harness/Guardrails.js +69 -0
- package/dist/src/harness/Guardrails.js.map +1 -0
- package/dist/src/harness/Init.d.ts +9 -0
- package/dist/src/harness/Init.js +234 -0
- package/dist/src/harness/Init.js.map +1 -0
- package/dist/src/harness/Model.d.ts +44 -0
- package/dist/src/harness/Model.js +169 -0
- package/dist/src/harness/Model.js.map +1 -0
- package/dist/src/harness/ModuleSources.d.ts +5 -0
- package/dist/src/harness/ModuleSources.js +47 -0
- package/dist/src/harness/ModuleSources.js.map +1 -0
- package/dist/src/harness/PnpmWorkspace.d.ts +2 -0
- package/dist/src/harness/PnpmWorkspace.js +23 -0
- package/dist/src/harness/PnpmWorkspace.js.map +1 -0
- package/dist/src/harness/Publish.d.ts +53 -0
- package/dist/src/harness/Publish.js +282 -0
- package/dist/src/harness/Publish.js.map +1 -0
- package/dist/src/harness/SelfVerify.d.ts +4 -0
- package/dist/src/harness/SelfVerify.js +56 -0
- package/dist/src/harness/SelfVerify.js.map +1 -0
- package/dist/src/harness/SourcePin.d.ts +12 -0
- package/dist/src/harness/SourcePin.js +320 -0
- package/dist/src/harness/SourcePin.js.map +1 -0
- package/dist/src/harness/Status.d.ts +12 -0
- package/dist/src/harness/Status.js +88 -0
- package/dist/src/harness/Status.js.map +1 -0
- package/dist/src/harness/TargetVerify.d.ts +8 -0
- package/dist/src/harness/TargetVerify.js +432 -0
- package/dist/src/harness/TargetVerify.js.map +1 -0
- package/dist/src/harness/TestContract.d.ts +6 -0
- package/dist/src/harness/TestContract.js +45 -0
- package/dist/src/harness/TestContract.js.map +1 -0
- package/dist/src/platform/Json.d.ts +8 -0
- package/dist/src/platform/Json.js +35 -0
- package/dist/src/platform/Json.js.map +1 -0
- package/dist/src/platform/ManagedFiles.d.ts +8 -0
- package/dist/src/platform/ManagedFiles.js +59 -0
- package/dist/src/platform/ManagedFiles.js.map +1 -0
- package/dist/src/platform/Process.d.ts +8 -0
- package/dist/src/platform/Process.js +80 -0
- package/dist/src/platform/Process.js.map +1 -0
- package/guide/default-capabilities.md +38 -0
- package/guide/index.md +49 -0
- package/guide/setup.md +64 -0
- package/harness/default-capabilities.md +32 -0
- package/harness/exposure.md +46 -0
- package/harness/feedback/index.md +60 -0
- package/harness/index.md +22 -0
- package/harness/official-inventory.md +85 -0
- package/harness/runtime/codex/AGENTS.fragment.md +28 -0
- package/harness/runtime/codex/agents/effect-worker.md +26 -0
- package/harness/runtime/codex/skills/effect-code/SKILL.md +72 -0
- package/harness/runtime/codex/skills/effect-code/agents/openai.yaml +4 -0
- package/harness/runtime/codex/skills/effect-feedback/SKILL.md +66 -0
- package/harness/runtime/codex/skills/effect-feedback/agents/openai.yaml +4 -0
- package/harness/source.md +52 -0
- package/harness/target-agent-contract.md +205 -0
- package/package.json +68 -0
- package/repos/craft-skills.manifest.json +34 -0
- package/repos/effect/.agents/skills/grill-me/SKILL.md +43 -0
- package/repos/effect/.agents/skills/jsdocs/SKILL.md +203 -0
- package/repos/effect/.agents/skills/scratchpad/SKILL.md +44 -0
- package/repos/effect/.agents/skills/scratchpad/agents/openai.yaml +7 -0
- package/repos/effect/.agents/skills/scratchpad/scripts/extract-example.mjs +260 -0
- package/repos/effect/.changeset/add-bigdecimal-sumall-multiplyall.md +5 -0
- package/repos/effect/.changeset/add-chunk-schema.md +5 -0
- package/repos/effect/.changeset/add-command-hidden.md +19 -0
- package/repos/effect/.changeset/add-config-nested.md +5 -0
- package/repos/effect/.changeset/add-flag-hidden.md +15 -0
- package/repos/effect/.changeset/add-from-string-schemas.md +5 -0
- package/repos/effect/.changeset/add-headers-remove-many.md +5 -0
- package/repos/effect/.changeset/add-indexeddb-kvs-layer.md +5 -0
- package/repos/effect/.changeset/add-make-msgpack.md +5 -0
- package/repos/effect/.changeset/add-make-option.md +5 -0
- package/repos/effect/.changeset/add-missing-tx-modules.md +11 -0
- package/repos/effect/.changeset/add-newtype-module.md +5 -0
- package/repos/effect/.changeset/add-scalar-show-operation-id.md +5 -0
- package/repos/effect/.changeset/add-schedule-tap.md +5 -0
- package/repos/effect/.changeset/add-schema-annotate-encoded.md +5 -0
- package/repos/effect/.changeset/add-schema-array-ensure.md +5 -0
- package/repos/effect/.changeset/add-schema-bigdecimal.md +5 -0
- package/repos/effect/.changeset/add-schema-datetime.md +5 -0
- package/repos/effect/.changeset/add-schema-option-from-optional-nullor.md +5 -0
- package/repos/effect/.changeset/add-schema-option-from-undefined-nullish.md +5 -0
- package/repos/effect/.changeset/add-schema-string-encoding.md +5 -0
- package/repos/effect/.changeset/add-sql-pglite.md +5 -0
- package/repos/effect/.changeset/add-standard-jsdoc-rule.md +5 -0
- package/repos/effect/.changeset/add-stream-broadcastn.md +5 -0
- package/repos/effect/.changeset/add-unstable-encoding-export.md +5 -0
- package/repos/effect/.changeset/afraid-cobras-like.md +5 -0
- package/repos/effect/.changeset/ai-openai-config-field-leak.md +6 -0
- package/repos/effect/.changeset/ai-openai-file-nullable-fields.md +5 -0
- package/repos/effect/.changeset/anthropic-4-6-structured-output.md +5 -0
- package/repos/effect/.changeset/asyncresult-exhaustive.md +5 -0
- package/repos/effect/.changeset/atom-stream-error-type.md +5 -0
- package/repos/effect/.changeset/beige-paths-sort.md +5 -0
- package/repos/effect/.changeset/better-apples-nail.md +5 -0
- package/repos/effect/.changeset/better-rocks-arrive.md +5 -0
- package/repos/effect/.changeset/big-pans-look.md +5 -0
- package/repos/effect/.changeset/blue-dingos-greet.md +5 -0
- package/repos/effect/.changeset/blue-ligers-cheat.md +5 -0
- package/repos/effect/.changeset/blue-onions-smile.md +5 -0
- package/repos/effect/.changeset/blue-ravens-type.md +5 -0
- package/repos/effect/.changeset/blue-trams-kiss.md +7 -0
- package/repos/effect/.changeset/bold-chairs-yawn.md +5 -0
- package/repos/effect/.changeset/bold-planets-shout.md +30 -0
- package/repos/effect/.changeset/breezy-meals-see.md +5 -0
- package/repos/effect/.changeset/bright-bugs-bow.md +5 -0
- package/repos/effect/.changeset/bright-canyons-clean.md +5 -0
- package/repos/effect/.changeset/bright-dogs-fail.md +5 -0
- package/repos/effect/.changeset/bright-flags-stand.md +5 -0
- package/repos/effect/.changeset/bright-laws-teach.md +5 -0
- package/repos/effect/.changeset/bright-lemons-dance.md +5 -0
- package/repos/effect/.changeset/bright-planes-smash.md +5 -0
- package/repos/effect/.changeset/bright-rats-attend.md +5 -0
- package/repos/effect/.changeset/bright-toes-rush.md +5 -0
- package/repos/effect/.changeset/bumpy-boxes-teach.md +5 -0
- package/repos/effect/.changeset/busy-lions-sneeze.md +5 -0
- package/repos/effect/.changeset/busy-maps-attend.md +7 -0
- package/repos/effect/.changeset/calm-buckets-own.md +5 -0
- package/repos/effect/.changeset/calm-carrots-march.md +7 -0
- package/repos/effect/.changeset/calm-cars-rest.md +5 -0
- package/repos/effect/.changeset/calm-panthers-nail.md +5 -0
- package/repos/effect/.changeset/calm-seas-smile.md +5 -0
- package/repos/effect/.changeset/calm-squids-hug.md +5 -0
- package/repos/effect/.changeset/chatty-poets-type.md +5 -0
- package/repos/effect/.changeset/chilled-mice-wash.md +5 -0
- package/repos/effect/.changeset/chilly-pumas-rule.md +5 -0
- package/repos/effect/.changeset/chubby-buckets-feel.md +5 -0
- package/repos/effect/.changeset/chubby-parents-flow.md +5 -0
- package/repos/effect/.changeset/chubby-planets-fall.md +5 -0
- package/repos/effect/.changeset/clean-balloons-tan.md +5 -0
- package/repos/effect/.changeset/clean-bulldogs-care.md +5 -0
- package/repos/effect/.changeset/clean-dryers-sneeze.md +5 -0
- package/repos/effect/.changeset/clean-geese-work.md +5 -0
- package/repos/effect/.changeset/clean-goats-wave.md +5 -0
- package/repos/effect/.changeset/clean-needles-shake.md +23 -0
- package/repos/effect/.changeset/clean-tires-guess.md +5 -0
- package/repos/effect/.changeset/clear-spies-boil.md +5 -0
- package/repos/effect/.changeset/cli-help-choices.md +5 -0
- package/repos/effect/.changeset/cold-knives-lie.md +35 -0
- package/repos/effect/.changeset/cold-rooms-show.md +5 -0
- package/repos/effect/.changeset/cold-sloths-wave.md +5 -0
- package/repos/effect/.changeset/compact-json-schema-enum.md +25 -0
- package/repos/effect/.changeset/config-withdefault-eager.md +7 -0
- package/repos/effect/.changeset/config.json +24 -0
- package/repos/effect/.changeset/consolidate-encoding.md +5 -0
- package/repos/effect/.changeset/consolidate-sql-error.md +16 -0
- package/repos/effect/.changeset/crisp-seas-warn.md +5 -0
- package/repos/effect/.changeset/cuddly-rooms-bet.md +5 -0
- package/repos/effect/.changeset/curly-poems-talk.md +5 -0
- package/repos/effect/.changeset/curly-spies-relax.md +5 -0
- package/repos/effect/.changeset/curvy-apples-float.md +5 -0
- package/repos/effect/.changeset/custom-http-security-openapi-generator.md +5 -0
- package/repos/effect/.changeset/cute-heads-thank.md +5 -0
- package/repos/effect/.changeset/cyan-loops-grow.md +5 -0
- package/repos/effect/.changeset/cyan-radios-switch.md +5 -0
- package/repos/effect/.changeset/deep-rivers-spend.md +5 -0
- package/repos/effect/.changeset/dirty-lamps-trade.md +5 -0
- package/repos/effect/.changeset/dirty-laws-wear.md +5 -0
- package/repos/effect/.changeset/duration-temporal-object-input.md +7 -0
- package/repos/effect/.changeset/eager-coats-cheat.md +5 -0
- package/repos/effect/.changeset/early-birds-dream.md +5 -0
- package/repos/effect/.changeset/early-donuts-argue.md +5 -0
- package/repos/effect/.changeset/early-peaches-check.md +6 -0
- package/repos/effect/.changeset/eff-691-default-logger-ordering.md +5 -0
- package/repos/effect/.changeset/eff-693-rpcgroup-handler-deps.md +5 -0
- package/repos/effect/.changeset/eff-694-cli-completions-module.md +5 -0
- package/repos/effect/.changeset/eff-695-layer-mock-dual-api.md +5 -0
- package/repos/effect/.changeset/eff-697-rpcserialization-json-array-decode.md +5 -0
- package/repos/effect/.changeset/eff-698-rpcserialization-unreachable-branch.md +5 -0
- package/repos/effect/.changeset/eff-700-httpapi-middleware-errors.md +12 -0
- package/repos/effect/.changeset/eff-701-httpapierror-respondable.md +5 -0
- package/repos/effect/.changeset/eff-704-stream-merge-predicate.md +5 -0
- package/repos/effect/.changeset/eff-705-layer-tap-apis.md +5 -0
- package/repos/effect/.changeset/eff-706-servicemap-mutate.md +6 -0
- package/repos/effect/.changeset/eff-716-response-id-tracker-map.md +5 -0
- package/repos/effect/.changeset/eff-717-openai-socket-cancel.md +5 -0
- package/repos/effect/.changeset/eff-718-embedding-model-surface.md +13 -0
- package/repos/effect/.changeset/eff-725-fix-catch-jsdoc.md +5 -0
- package/repos/effect/.changeset/eff-726-model-dimensions.md +7 -0
- package/repos/effect/.changeset/eff-727-cli-help-alignment.md +5 -0
- package/repos/effect/.changeset/eff-730-language-model-incremental-fallback.md +5 -0
- package/repos/effect/.changeset/eff-736-cached-with-ttl.md +5 -0
- package/repos/effect/.changeset/eff-738-cron-prev.md +5 -0
- package/repos/effect/.changeset/eff-739-openai-function-call-done.md +5 -0
- package/repos/effect/.changeset/eff-740-missing-summary-parts.md +5 -0
- package/repos/effect/.changeset/eff-742-http-client-request-web.md +5 -0
- package/repos/effect/.changeset/eff-744-sqlite-migrator-lock.md +5 -0
- package/repos/effect/.changeset/eff-746-fixed-iteration-catchup.md +5 -0
- package/repos/effect/.changeset/eff-747-unify-effect.md +5 -0
- package/repos/effect/.changeset/eff-754-url-builder-any.md +6 -0
- package/repos/effect/.changeset/eff-755-references-core.md +5 -0
- package/repos/effect/.changeset/eff-769-select-text-highlight.md +5 -0
- package/repos/effect/.changeset/eff-774-mutable-list-append-all-empty-array.md +5 -0
- package/repos/effect/.changeset/eff-777-schema-make-effect.md +5 -0
- package/repos/effect/.changeset/eff-778-http-middleware-path-logger.md +5 -0
- package/repos/effect/.changeset/eff-779-keyvaluestore-layer-sql.md +5 -0
- package/repos/effect/.changeset/eff-780-layer-unify.md +5 -0
- package/repos/effect/.changeset/eff-781-fix-stream-toqueue-types.md +5 -0
- package/repos/effect/.changeset/eff-782-httpapi-status-literals.md +5 -0
- package/repos/effect/.changeset/eff-783-atom-http-api-errors.md +5 -0
- package/repos/effect/.changeset/eff-819-cluster-workflow-shard-groups.md +5 -0
- package/repos/effect/.changeset/eight-turkeys-own.md +7 -0
- package/repos/effect/.changeset/eighty-lies-deny.md +5 -0
- package/repos/effect/.changeset/eighty-poets-draw.md +9 -0
- package/repos/effect/.changeset/eighty-swans-scream.md +5 -0
- package/repos/effect/.changeset/eighty-teeth-sniff.md +5 -0
- package/repos/effect/.changeset/eleven-apes-share.md +5 -0
- package/repos/effect/.changeset/eleven-numbers-bake.md +5 -0
- package/repos/effect/.changeset/empty-gifts-beg.md +5 -0
- package/repos/effect/.changeset/empty-http-rpc-client.md +5 -0
- package/repos/effect/.changeset/eventlog-unencrypted.md +5 -0
- package/repos/effect/.changeset/expand-schema-filter-output.md +24 -0
- package/repos/effect/.changeset/export-schema-encode-keys-interface.md +7 -0
- package/repos/effect/.changeset/extract-semaphore-latch.md +10 -0
- package/repos/effect/.changeset/fair-bees-relax.md +5 -0
- package/repos/effect/.changeset/fair-buttons-share.md +7 -0
- package/repos/effect/.changeset/fair-cooks-stop.md +5 -0
- package/repos/effect/.changeset/fair-cups-train.md +5 -0
- package/repos/effect/.changeset/fair-dryers-speak.md +5 -0
- package/repos/effect/.changeset/fair-forks-shake.md +5 -0
- package/repos/effect/.changeset/fair-pandas-prove.md +5 -0
- package/repos/effect/.changeset/fair-pants-float.md +5 -0
- package/repos/effect/.changeset/fair-poems-visit.md +5 -0
- package/repos/effect/.changeset/famous-wolves-lead.md +5 -0
- package/repos/effect/.changeset/fancy-glasses-grow.md +5 -0
- package/repos/effect/.changeset/fast-times-camp.md +5 -0
- package/repos/effect/.changeset/few-birds-matter.md +5 -0
- package/repos/effect/.changeset/few-cougars-dig.md +5 -0
- package/repos/effect/.changeset/few-foxes-grin.md +5 -0
- package/repos/effect/.changeset/few-mirrors-pull.md +14 -0
- package/repos/effect/.changeset/few-socks-poke.md +5 -0
- package/repos/effect/.changeset/fiber-runtime-start-metrics.md +5 -0
- package/repos/effect/.changeset/fiery-jokes-care.md +5 -0
- package/repos/effect/.changeset/fiery-mammals-call.md +5 -0
- package/repos/effect/.changeset/fine-walls-decide.md +5 -0
- package/repos/effect/.changeset/first-success-of.md +5 -0
- package/repos/effect/.changeset/five-parents-relax.md +5 -0
- package/repos/effect/.changeset/five-worms-rhyme.md +5 -0
- package/repos/effect/.changeset/fix-1332.md +5 -0
- package/repos/effect/.changeset/fix-1917.md +11 -0
- package/repos/effect/.changeset/fix-1927.md +5 -0
- package/repos/effect/.changeset/fix-1940.md +7 -0
- package/repos/effect/.changeset/fix-1947.md +7 -0
- package/repos/effect/.changeset/fix-2002.md +5 -0
- package/repos/effect/.changeset/fix-2012.md +5 -0
- package/repos/effect/.changeset/fix-2015.md +5 -0
- package/repos/effect/.changeset/fix-2260.md +5 -0
- package/repos/effect/.changeset/fix-2268.md +5 -0
- package/repos/effect/.changeset/fix-2271.md +5 -0
- package/repos/effect/.changeset/fix-2384.md +7 -0
- package/repos/effect/.changeset/fix-ai-empty-params-structured-output.md +5 -0
- package/repos/effect/.changeset/fix-ai-text-toolkit-typing.md +5 -0
- package/repos/effect/.changeset/fix-catch-orelse-error-erasure.md +5 -0
- package/repos/effect/.changeset/fix-class-constructor-defaults.md +5 -0
- package/repos/effect/.changeset/fix-cli-mixed-global-flag-context.md +7 -0
- package/repos/effect/.changeset/fix-config-withDefault.md +5 -0
- package/repos/effect/.changeset/fix-config-withdefault-filter.md +7 -0
- package/repos/effect/.changeset/fix-datetime-gmt.md +5 -0
- package/repos/effect/.changeset/fix-devtools-flush-on-teardown.md +10 -0
- package/repos/effect/.changeset/fix-duration-symmetric-rounding.md +5 -0
- package/repos/effect/.changeset/fix-entity-manager-defect-replay.md +5 -0
- package/repos/effect/.changeset/fix-entity-proxy-rpc-handler-context.md +5 -0
- package/repos/effect/.changeset/fix-entity-proxy-server-path-params.md +5 -0
- package/repos/effect/.changeset/fix-from-readable-stream-cancel-defect.md +5 -0
- package/repos/effect/.changeset/fix-graph-undirected-traversal.md +5 -0
- package/repos/effect/.changeset/fix-has-interrupts-only-empty.md +5 -0
- package/repos/effect/.changeset/fix-hashmap-bit31-ordering.md +5 -0
- package/repos/effect/.changeset/fix-headers-proto-enumerability.md +5 -0
- package/repos/effect/.changeset/fix-http-incoming-message-parse-options.md +5 -0
- package/repos/effect/.changeset/fix-httpapi-endpoint-error-inference.md +5 -0
- package/repos/effect/.changeset/fix-httpapi-schema-types.md +5 -0
- package/repos/effect/.changeset/fix-httpapi-security-middleware-cache.md +5 -0
- package/repos/effect/.changeset/fix-is-json-dag.md +7 -0
- package/repos/effect/.changeset/fix-json-schema-anyof-oneof-siblings.md +5 -0
- package/repos/effect/.changeset/fix-json-schema-import-json.md +5 -0
- package/repos/effect/.changeset/fix-keepalive-blocked-timers.md +5 -0
- package/repos/effect/.changeset/fix-mcp-param-name-resolution.md +5 -0
- package/repos/effect/.changeset/fix-mermaid-escape-special-chars.md +5 -0
- package/repos/effect/.changeset/fix-mutable-list-filter-length.md +5 -0
- package/repos/effect/.changeset/fix-object-keyword-json-schema.md +5 -0
- package/repos/effect/.changeset/fix-openai-mcp-tool-names.md +5 -0
- package/repos/effect/.changeset/fix-openapi-generator-form-urlencoded.md +5 -0
- package/repos/effect/.changeset/fix-openapi-generator-swagger2openapi.md +5 -0
- package/repos/effect/.changeset/fix-openapi-preserve-multiple-response-content-types.md +5 -0
- package/repos/effect/.changeset/fix-openrouter-sparse-array.md +5 -0
- package/repos/effect/.changeset/fix-otel-logger-clock-skew.md +7 -0
- package/repos/effect/.changeset/fix-otel-logger-severity-number.md +20 -0
- package/repos/effect/.changeset/fix-queue-collect-duplication.md +5 -0
- package/repos/effect/.changeset/fix-random-string-seeds.md +5 -0
- package/repos/effect/.changeset/fix-ratelimiter-tokenbucket-redis-ttl.md +5 -0
- package/repos/effect/.changeset/fix-remainder-scientific-notation.md +5 -0
- package/repos/effect/.changeset/fix-request-resolver-pending-batches-leak.md +5 -0
- package/repos/effect/.changeset/fix-retry-transient-autocomplete.md +5 -0
- package/repos/effect/.changeset/fix-rpc-http-requestids-finalizer.md +5 -0
- package/repos/effect/.changeset/fix-rpc-json-id-edges.md +5 -0
- package/repos/effect/.changeset/fix-schedule-fixed-double-exec.md +9 -0
- package/repos/effect/.changeset/fix-schedule-reduce-sync-state.md +5 -0
- package/repos/effect/.changeset/fix-schema-arbitrary-exclusive-bounds.md +5 -0
- package/repos/effect/.changeset/fix-schema-defect-message.md +5 -0
- package/repos/effect/.changeset/fix-schema-encode-keys-property-keys.md +5 -0
- package/repos/effect/.changeset/fix-schema-encodekeys-class.md +5 -0
- package/repos/effect/.changeset/fix-schema-encodekeys-struct.md +5 -0
- package/repos/effect/.changeset/fix-schema-identifier-expected-message.md +5 -0
- package/repos/effect/.changeset/fix-schema-is-uuid.md +5 -0
- package/repos/effect/.changeset/fix-schema-option-non-schema-failures.md +17 -0
- package/repos/effect/.changeset/fix-schema-parser-checks.md +9 -0
- package/repos/effect/.changeset/fix-searchparam-initial-decode.md +5 -0
- package/repos/effect/.changeset/fix-serializable-wire-transfer.md +7 -0
- package/repos/effect/.changeset/fix-stream-grouped-within-flush.md +5 -0
- package/repos/effect/.changeset/fix-stream-run-for-each-while.md +5 -0
- package/repos/effect/.changeset/fix-stream-scan-effect.md +5 -0
- package/repos/effect/.changeset/fix-stream-scoped-scope.md +5 -0
- package/repos/effect/.changeset/fix-strip-approval-artifacts-multi-round.md +13 -0
- package/repos/effect/.changeset/fix-struct-utility-types-simplify.md +5 -0
- package/repos/effect/.changeset/fix-structwithrest-index-signatures.md +6 -0
- package/repos/effect/.changeset/fix-tagged-union-class-sentinels.md +5 -0
- package/repos/effect/.changeset/fix-tagged-union-match-unify.md +6 -0
- package/repos/effect/.changeset/fix-to-tagged-union-isanyof-custom-tags.md +10 -0
- package/repos/effect/.changeset/fix-tuple-with-rest-post-rest-index-drift.md +5 -0
- package/repos/effect/.changeset/fix-tuple-with-rest-post-rest-validation.md +5 -0
- package/repos/effect/.changeset/fix-types-voidifempty.md +5 -0
- package/repos/effect/.changeset/fix-void-response-encoding.md +5 -0
- package/repos/effect/.changeset/fix-workflow-proxy-rpc-handler-context.md +5 -0
- package/repos/effect/.changeset/flat-chicken-remain.md +5 -0
- package/repos/effect/.changeset/floppy-cows-spend.md +5 -0
- package/repos/effect/.changeset/floppy-items-admire.md +5 -0
- package/repos/effect/.changeset/floppy-pigs-kiss.md +5 -0
- package/repos/effect/.changeset/fluffy-meals-matter.md +5 -0
- package/repos/effect/.changeset/fluffy-pumas-push.md +5 -0
- package/repos/effect/.changeset/forked-memo-maps.md +6 -0
- package/repos/effect/.changeset/forty-hounds-cheer.md +5 -0
- package/repos/effect/.changeset/forty-otters-cry.md +5 -0
- package/repos/effect/.changeset/forty-rings-film.md +7 -0
- package/repos/effect/.changeset/forty-signs-stay.md +5 -0
- package/repos/effect/.changeset/forty-swans-divide.md +5 -0
- package/repos/effect/.changeset/forty-trees-pay.md +5 -0
- package/repos/effect/.changeset/four-papayas-bow.md +5 -0
- package/repos/effect/.changeset/four-points-repeat.md +5 -0
- package/repos/effect/.changeset/fresh-cats-smash.md +5 -0
- package/repos/effect/.changeset/fresh-emus-cheat.md +5 -0
- package/repos/effect/.changeset/fresh-monkeys-smoke.md +9 -0
- package/repos/effect/.changeset/fruity-houses-learn.md +6 -0
- package/repos/effect/.changeset/full-adults-double.md +5 -0
- package/repos/effect/.changeset/funny-crabs-hang.md +6 -0
- package/repos/effect/.changeset/funny-forks-move.md +5 -0
- package/repos/effect/.changeset/fuzzy-camels-hunt.md +5 -0
- package/repos/effect/.changeset/fuzzy-dodos-help.md +5 -0
- package/repos/effect/.changeset/fuzzy-lions-perform.md +5 -0
- package/repos/effect/.changeset/fuzzy-planets-sneeze.md +5 -0
- package/repos/effect/.changeset/gold-meteors-move.md +5 -0
- package/repos/effect/.changeset/gold-readers-hug.md +5 -0
- package/repos/effect/.changeset/gold-rings-start.md +5 -0
- package/repos/effect/.changeset/good-tools-work.md +7 -0
- package/repos/effect/.changeset/graph-algorithm-fixes.md +5 -0
- package/repos/effect/.changeset/great-trains-mate.md +5 -0
- package/repos/effect/.changeset/great-trams-report.md +5 -0
- package/repos/effect/.changeset/green-beds-unref.md +7 -0
- package/repos/effect/.changeset/green-chips-wash.md +5 -0
- package/repos/effect/.changeset/green-moons-smile.md +5 -0
- package/repos/effect/.changeset/green-pugs-play.md +5 -0
- package/repos/effect/.changeset/green-rings-prove.md +5 -0
- package/repos/effect/.changeset/happy-mirrors-dream.md +5 -0
- package/repos/effect/.changeset/heavy-loops-cut.md +5 -0
- package/repos/effect/.changeset/heavy-trams-fix.md +5 -0
- package/repos/effect/.changeset/hip-socks-travel.md +5 -0
- package/repos/effect/.changeset/honest-pens-thank.md +5 -0
- package/repos/effect/.changeset/honest-rivers-notice.md +5 -0
- package/repos/effect/.changeset/hot-taxis-fry.md +5 -0
- package/repos/effect/.changeset/httpapi-endpoint-relax-constraints.md +5 -0
- package/repos/effect/.changeset/httpapi-schema-service-types.md +6 -0
- package/repos/effect/.changeset/huge-moons-rhyme.md +5 -0
- package/repos/effect/.changeset/humble-pigs-dig.md +5 -0
- package/repos/effect/.changeset/icy-flies-cross.md +5 -0
- package/repos/effect/.changeset/itchy-radios-poke.md +5 -0
- package/repos/effect/.changeset/itchy-results-bet.md +5 -0
- package/repos/effect/.changeset/itchy-shrimps-deny.md +5 -0
- package/repos/effect/.changeset/itchy-toes-promise.md +5 -0
- package/repos/effect/.changeset/k8s-last-transition-null.md +5 -0
- package/repos/effect/.changeset/khaki-cats-learn.md +5 -0
- package/repos/effect/.changeset/khaki-melons-appear.md +5 -0
- package/repos/effect/.changeset/kind-hounds-float.md +5 -0
- package/repos/effect/.changeset/kind-windows-fall.md +5 -0
- package/repos/effect/.changeset/late-hotels-rule.md +5 -0
- package/repos/effect/.changeset/late-lamps-care.md +5 -0
- package/repos/effect/.changeset/late-rivers-applaud.md +5 -0
- package/repos/effect/.changeset/layer-map-dynamic-idle-ttl.md +5 -0
- package/repos/effect/.changeset/lazy-queens-rush.md +5 -0
- package/repos/effect/.changeset/lazy-recursive-forward-refs.md +5 -0
- package/repos/effect/.changeset/lazy-timers-exist.md +5 -0
- package/repos/effect/.changeset/legal-pants-drop.md +5 -0
- package/repos/effect/.changeset/lemon-taxis-sin.md +5 -0
- package/repos/effect/.changeset/light-kids-sneeze.md +5 -0
- package/repos/effect/.changeset/little-dryers-allow.md +7 -0
- package/repos/effect/.changeset/long-cameras-think.md +5 -0
- package/repos/effect/.changeset/lovely-cobras-change.md +5 -0
- package/repos/effect/.changeset/lovely-frogs-rescue.md +5 -0
- package/repos/effect/.changeset/lucky-buttons-jump.md +5 -0
- package/repos/effect/.changeset/lucky-phones-listen.md +5 -0
- package/repos/effect/.changeset/lucky-worms-type.md +5 -0
- package/repos/effect/.changeset/mean-dingos-share.md +5 -0
- package/repos/effect/.changeset/mean-trains-smash.md +5 -0
- package/repos/effect/.changeset/metal-parts-yell.md +5 -0
- package/repos/effect/.changeset/mighty-games-matter.md +5 -0
- package/repos/effect/.changeset/modern-uuid-guid-filter.md +5 -0
- package/repos/effect/.changeset/nasty-geese-grow.md +5 -0
- package/repos/effect/.changeset/neat-goats-wave.md +5 -0
- package/repos/effect/.changeset/neat-kings-chew.md +5 -0
- package/repos/effect/.changeset/neat-lions-rest.md +5 -0
- package/repos/effect/.changeset/neat-snails-wash.md +5 -0
- package/repos/effect/.changeset/neat-taxis-notice.md +5 -0
- package/repos/effect/.changeset/new-dogs-swim.md +5 -0
- package/repos/effect/.changeset/new-toes-stop.md +5 -0
- package/repos/effect/.changeset/ninety-geese-exist.md +5 -0
- package/repos/effect/.changeset/odd-boats-think.md +5 -0
- package/repos/effect/.changeset/odd-bulldogs-sleep.md +5 -0
- package/repos/effect/.changeset/odd-fans-glow.md +5 -0
- package/repos/effect/.changeset/odd-forks-talk.md +5 -0
- package/repos/effect/.changeset/odd-laws-draw.md +5 -0
- package/repos/effect/.changeset/odd-owls-smoke.md +5 -0
- package/repos/effect/.changeset/odd-socks-boil.md +5 -0
- package/repos/effect/.changeset/odd-suns-dance.md +5 -0
- package/repos/effect/.changeset/old-brooms-cry.md +5 -0
- package/repos/effect/.changeset/old-facts-stand.md +5 -0
- package/repos/effect/.changeset/old-mirrors-float.md +5 -0
- package/repos/effect/.changeset/olive-poems-visit.md +5 -0
- package/repos/effect/.changeset/open-hotels-remain.md +5 -0
- package/repos/effect/.changeset/openai-compat-nullable-tool-name.md +7 -0
- package/repos/effect/.changeset/openai-compat-reasoning.md +5 -0
- package/repos/effect/.changeset/otel-resource-env-precedence.md +5 -0
- package/repos/effect/.changeset/perfect-buckets-tickle.md +5 -0
- package/repos/effect/.changeset/petite-months-allow.md +6 -0
- package/repos/effect/.changeset/platform-crypto-service.md +9 -0
- package/repos/effect/.changeset/platform-node-shared-barrel.md +5 -0
- package/repos/effect/.changeset/plenty-moons-pull.md +5 -0
- package/repos/effect/.changeset/polite-brooms-tickle.md +5 -0
- package/repos/effect/.changeset/polite-pigs-speak.md +5 -0
- package/repos/effect/.changeset/polite-tables-kneel.md +5 -0
- package/repos/effect/.changeset/port-react-hydration.md +8 -0
- package/repos/effect/.changeset/pre.json +588 -0
- package/repos/effect/.changeset/public-deer-ring.md +5 -0
- package/repos/effect/.changeset/public-jeans-stop.md +5 -0
- package/repos/effect/.changeset/pubsub-publish-false.md +5 -0
- package/repos/effect/.changeset/puny-pens-clap.md +6 -0
- package/repos/effect/.changeset/purple-bars-prove.md +5 -0
- package/repos/effect/.changeset/purple-schools-float.md +5 -0
- package/repos/effect/.changeset/purple-turtles-draw.md +5 -0
- package/repos/effect/.changeset/quick-dragons-fix.md +5 -0
- package/repos/effect/.changeset/quick-falcons-travel.md +5 -0
- package/repos/effect/.changeset/quick-geese-relax.md +5 -0
- package/repos/effect/.changeset/quick-lamps-dig.md +5 -0
- package/repos/effect/.changeset/quick-lizards-fall.md +5 -0
- package/repos/effect/.changeset/quick-trees-join.md +5 -0
- package/repos/effect/.changeset/quiet-carpets-grin.md +5 -0
- package/repos/effect/.changeset/quiet-files-hunt.md +5 -0
- package/repos/effect/.changeset/quiet-lamps-jam.md +5 -0
- package/repos/effect/.changeset/quiet-radios-wave.md +5 -0
- package/repos/effect/.changeset/quiet-redis-scripts.md +5 -0
- package/repos/effect/.changeset/ready-olives-divide.md +5 -0
- package/repos/effect/.changeset/real-trains-ring.md +5 -0
- package/repos/effect/.changeset/red-pigs-repair.md +5 -0
- package/repos/effect/.changeset/redacted-representation-options.md +7 -0
- package/repos/effect/.changeset/refactor-cli-global-flags.md +27 -0
- package/repos/effect/.changeset/refactor-config-provider.md +23 -0
- package/repos/effect/.changeset/refactor-representation-references.md +5 -0
- package/repos/effect/.changeset/remove-effect-transactionwith.md +5 -0
- package/repos/effect/.changeset/remove-http-span-counter.md +5 -0
- package/repos/effect/.changeset/remove-nullor.md +5 -0
- package/repos/effect/.changeset/remove-openapi-fromapi-options.md +7 -0
- package/repos/effect/.changeset/remove-types-mergerecord.md +5 -0
- package/repos/effect/.changeset/remove-unused-utils-apis.md +5 -0
- package/repos/effect/.changeset/rename-rebuild-out.md +5 -0
- package/repos/effect/.changeset/restore-schema-parse-options.md +5 -0
- package/repos/effect/.changeset/rich-dots-push.md +5 -0
- package/repos/effect/.changeset/rich-hoops-nail.md +5 -0
- package/repos/effect/.changeset/rich-sloths-draw.md +5 -0
- package/repos/effect/.changeset/ripe-lies-battle.md +5 -0
- package/repos/effect/.changeset/rpc-middleware-provides-fix.md +5 -0
- package/repos/effect/.changeset/scalar-custom-fetch.md +5 -0
- package/repos/effect/.changeset/schema-as-class.md +17 -0
- package/repos/effect/.changeset/schema-asserts-signature.md +5 -0
- package/repos/effect/.changeset/schema-clean-up-additionalProperties.md +7 -0
- package/repos/effect/.changeset/schema-datetime-utc-from-string.md +5 -0
- package/repos/effect/.changeset/schema-decoding-defaults-services.md +7 -0
- package/repos/effect/.changeset/schema-defaults-issue-channel.md +7 -0
- package/repos/effect/.changeset/schema-dollar-prefix.md +5 -0
- package/repos/effect/.changeset/schema-missing-self-generic.md +5 -0
- package/repos/effect/.changeset/schema-ordered-arbitrary-constraints.md +12 -0
- package/repos/effect/.changeset/schema-parser-adapter-errors.md +5 -0
- package/repos/effect/.changeset/schema-refactor-toCodecJson.md +5 -0
- package/repos/effect/.changeset/schema-remove-annotate-in.md +5 -0
- package/repos/effect/.changeset/schema-rename-makeUnsafe-to-make.md +7 -0
- package/repos/effect/.changeset/schema-rename-parser-makeUnsafe.md +5 -0
- package/repos/effect/.changeset/schema-result-combinators.md +5 -0
- package/repos/effect/.changeset/schema-struct-simplify.md +5 -0
- package/repos/effect/.changeset/seven-mugs-marry.md +5 -0
- package/repos/effect/.changeset/shaggy-birds-stay.md +5 -0
- package/repos/effect/.changeset/shaggy-cities-push.md +5 -0
- package/repos/effect/.changeset/shaggy-numbers-accept.md +5 -0
- package/repos/effect/.changeset/sharp-emus-applaud.md +5 -0
- package/repos/effect/.changeset/sharp-goats-wink.md +5 -0
- package/repos/effect/.changeset/sharp-pandas-care.md +5 -0
- package/repos/effect/.changeset/sharp-peas-march.md +5 -0
- package/repos/effect/.changeset/sharp-rules-draw.md +5 -0
- package/repos/effect/.changeset/sharp-singers-sort.md +5 -0
- package/repos/effect/.changeset/shiny-trains-hug.md +5 -0
- package/repos/effect/.changeset/short-cows-relate.md +5 -0
- package/repos/effect/.changeset/short-foxes-admire.md +5 -0
- package/repos/effect/.changeset/shy-cycles-flow.md +5 -0
- package/repos/effect/.changeset/shy-geckos-sniff.md +30 -0
- package/repos/effect/.changeset/silent-geckos-matter.md +5 -0
- package/repos/effect/.changeset/silent-needles-design.md +6 -0
- package/repos/effect/.changeset/silent-plants-matter.md +8 -0
- package/repos/effect/.changeset/silent-spoons-stare.md +5 -0
- package/repos/effect/.changeset/silly-loops-tickle.md +5 -0
- package/repos/effect/.changeset/silver-bulk-indexeddb.md +5 -0
- package/repos/effect/.changeset/silver-emus-smoke.md +5 -0
- package/repos/effect/.changeset/silver-kings-poke.md +5 -0
- package/repos/effect/.changeset/silver-snails-sqlite.md +17 -0
- package/repos/effect/.changeset/silver-wings-watch.md +5 -0
- package/repos/effect/.changeset/six-cups-taste.md +5 -0
- package/repos/effect/.changeset/sixty-mails-shout.md +5 -0
- package/repos/effect/.changeset/sixty-socks-yell.md +5 -0
- package/repos/effect/.changeset/slimy-planets-divide.md +5 -0
- package/repos/effect/.changeset/slimy-turtles-juggle.md +5 -0
- package/repos/effect/.changeset/slow-beans-battle.md +28 -0
- package/repos/effect/.changeset/slow-berries-enjoy.md +5 -0
- package/repos/effect/.changeset/small-bugs-hunt.md +5 -0
- package/repos/effect/.changeset/small-crabs-care.md +9 -0
- package/repos/effect/.changeset/small-pets-sit.md +6 -0
- package/repos/effect/.changeset/smart-ducks-jump.md +6 -0
- package/repos/effect/.changeset/smart-pillows-buy.md +6 -0
- package/repos/effect/.changeset/smart-timers-fly.md +5 -0
- package/repos/effect/.changeset/smart-tips-sort.md +5 -0
- package/repos/effect/.changeset/social-pumas-prove.md +5 -0
- package/repos/effect/.changeset/soft-comics-wink.md +5 -0
- package/repos/effect/.changeset/soft-delete-sqlmodel.md +5 -0
- package/repos/effect/.changeset/soft-seals-allow.md +5 -0
- package/repos/effect/.changeset/solid-cougars-attack.md +5 -0
- package/repos/effect/.changeset/solid-doors-ring.md +5 -0
- package/repos/effect/.changeset/solid-items-tease.md +5 -0
- package/repos/effect/.changeset/solid-towns-smoke.md +5 -0
- package/repos/effect/.changeset/sour-canyons-rescue.md +5 -0
- package/repos/effect/.changeset/sparkly-bears-act.md +5 -0
- package/repos/effect/.changeset/sparkly-coins-sit.md +5 -0
- package/repos/effect/.changeset/spotty-comics-fry.md +5 -0
- package/repos/effect/.changeset/sql-migrator-mjs-mts.md +5 -0
- package/repos/effect/.changeset/stale-dots-tell.md +5 -0
- package/repos/effect/.changeset/stale-snakes-know.md +5 -0
- package/repos/effect/.changeset/strict-areas-end.md +5 -0
- package/repos/effect/.changeset/strict-buckets-hug.md +8 -0
- package/repos/effect/.changeset/strip-resolved-approvals.md +5 -0
- package/repos/effect/.changeset/strong-balloons-tickle.md +5 -0
- package/repos/effect/.changeset/strong-bees-queue.md +5 -0
- package/repos/effect/.changeset/struct-record.md +5 -0
- package/repos/effect/.changeset/sunny-ads-hang.md +5 -0
- package/repos/effect/.changeset/sunny-bikes-sleep.md +5 -0
- package/repos/effect/.changeset/sunny-rooms-invent.md +5 -0
- package/repos/effect/.changeset/sweet-donuts-bet.md +5 -0
- package/repos/effect/.changeset/sweet-hotels-give.md +5 -0
- package/repos/effect/.changeset/sweet-views-learn.md +5 -0
- package/repos/effect/.changeset/swift-spiders-unpack.md +5 -0
- package/repos/effect/.changeset/swift-symbols-stand.md +5 -0
- package/repos/effect/.changeset/tagged-error-class-optional-empty-props.md +5 -0
- package/repos/effect/.changeset/tall-hairs-return.md +5 -0
- package/repos/effect/.changeset/tall-mails-listen.md +5 -0
- package/repos/effect/.changeset/tall-queens-cheer.md +5 -0
- package/repos/effect/.changeset/tall-wombats-wave.md +5 -0
- package/repos/effect/.changeset/tangy-colts-lose.md +5 -0
- package/repos/effect/.changeset/tasty-comics-send.md +5 -0
- package/repos/effect/.changeset/ten-kings-fry.md +5 -0
- package/repos/effect/.changeset/thick-pandas-wait.md +5 -0
- package/repos/effect/.changeset/thin-ducks-wonder.md +5 -0
- package/repos/effect/.changeset/thirty-ducks-go.md +5 -0
- package/repos/effect/.changeset/thirty-pans-love.md +5 -0
- package/repos/effect/.changeset/three-corners-sort.md +5 -0
- package/repos/effect/.changeset/three-ravens-jam.md +5 -0
- package/repos/effect/.changeset/three-tomatoes-wave.md +5 -0
- package/repos/effect/.changeset/tidy-foxes-own.md +5 -0
- package/repos/effect/.changeset/tidy-icons-glow.md +5 -0
- package/repos/effect/.changeset/tidy-stacks-encode.md +5 -0
- package/repos/effect/.changeset/tidy-stars-drive.md +5 -0
- package/repos/effect/.changeset/tiny-buckets-wave.md +5 -0
- package/repos/effect/.changeset/tiny-lilies-flash.md +5 -0
- package/repos/effect/.changeset/tiny-rabbits-smile.md +5 -0
- package/repos/effect/.changeset/tocodecjson-return-json-type.md +10 -0
- package/repos/effect/.changeset/tool-get-json-schema-tests.md +5 -0
- package/repos/effect/.changeset/true-actors-battle.md +5 -0
- package/repos/effect/.changeset/twenty-buttons-cheer.md +5 -0
- package/repos/effect/.changeset/two-roses-double.md +5 -0
- package/repos/effect/.changeset/unify-error-defect-stack-options.md +23 -0
- package/repos/effect/.changeset/update-schema-arbitrary-report.md +22 -0
- package/repos/effect/.changeset/upset-colts-stick.md +5 -0
- package/repos/effect/.changeset/vast-bananas-send.md +5 -0
- package/repos/effect/.changeset/vast-deserts-travel.md +5 -0
- package/repos/effect/.changeset/violet-peaches-feel.md +5 -0
- package/repos/effect/.changeset/vitest-layer-top-level-options.md +5 -0
- package/repos/effect/.changeset/wacky-grapes-poke.md +5 -0
- package/repos/effect/.changeset/wacky-rice-add.md +5 -0
- package/repos/effect/.changeset/warm-dolls-brake.md +5 -0
- package/repos/effect/.changeset/warm-friends-tie.md +5 -0
- package/repos/effect/.changeset/warm-snails-shop.md +7 -0
- package/repos/effect/.changeset/wet-news-invent.md +5 -0
- package/repos/effect/.changeset/wild-readers-clean.md +5 -0
- package/repos/effect/.changeset/wild-suns-bearer-space.md +5 -0
- package/repos/effect/.changeset/wise-ants-wave.md +6 -0
- package/repos/effect/.changeset/wise-flags-shift.md +22 -0
- package/repos/effect/.changeset/wise-oranges-stay.md +5 -0
- package/repos/effect/.changeset/witty-lobsters-share.md +5 -0
- package/repos/effect/.changeset/yellow-adults-study.md +5 -0
- package/repos/effect/.changeset/yellow-clocks-dance.md +5 -0
- package/repos/effect/.changeset/yellow-dingos-jump.md +5 -0
- package/repos/effect/.changeset/young-doors-change.md +5 -0
- package/repos/effect/.envrc +1 -0
- package/repos/effect/.github/actions/setup/action.yaml +33 -0
- package/repos/effect/.github/workflows/ai-codegen.yml +66 -0
- package/repos/effect/.github/workflows/bundle-comment.yml +72 -0
- package/repos/effect/.github/workflows/check.yml +195 -0
- package/repos/effect/.github/workflows/release.yml +47 -0
- package/repos/effect/.github/workflows/snapshot.yml +34 -0
- package/repos/effect/.oxlintrc.json +25 -0
- package/repos/effect/.patterns/effect.md +102 -0
- package/repos/effect/.patterns/jsdoc.md +53 -0
- package/repos/effect/.patterns/testing.md +44 -0
- package/repos/effect/.specs/README.md +2 -0
- package/repos/effect/.vscode/extensions.json +6 -0
- package/repos/effect/.vscode/settings.json +44 -0
- package/repos/effect/AGENTS.md +139 -0
- package/repos/effect/LICENSE +21 -0
- package/repos/effect/LLMS.md +343 -0
- package/repos/effect/MIGRATION.md +83 -0
- package/repos/effect/README.md +3 -0
- package/repos/effect/TODOS.md +28 -0
- package/repos/effect/ai-docs/README.md +44 -0
- package/repos/effect/ai-docs/package.json +36 -0
- package/repos/effect/ai-docs/src/01_effect/01_basics/01_effect-gen.ts +30 -0
- package/repos/effect/ai-docs/src/01_effect/01_basics/02_effect-fn.ts +39 -0
- package/repos/effect/ai-docs/src/01_effect/01_basics/10_creating-effects.ts +74 -0
- package/repos/effect/ai-docs/src/01_effect/01_basics/index.md +5 -0
- package/repos/effect/ai-docs/src/01_effect/02_services/01_service.ts +45 -0
- package/repos/effect/ai-docs/src/01_effect/02_services/10_reference.ts +10 -0
- package/repos/effect/ai-docs/src/01_effect/02_services/20_layer-composition.ts +70 -0
- package/repos/effect/ai-docs/src/01_effect/02_services/20_layer-unwrap.ts +66 -0
- package/repos/effect/ai-docs/src/01_effect/02_services/index.md +5 -0
- package/repos/effect/ai-docs/src/01_effect/03_errors/01_error-handling.ts +30 -0
- package/repos/effect/ai-docs/src/01_effect/03_errors/10_catch-tags.ts +24 -0
- package/repos/effect/ai-docs/src/01_effect/03_errors/20_reason-errors.ts +64 -0
- package/repos/effect/ai-docs/src/01_effect/03_errors/index.md +1 -0
- package/repos/effect/ai-docs/src/01_effect/04_resources/10_acquire-release.ts +105 -0
- package/repos/effect/ai-docs/src/01_effect/04_resources/20_layer-side-effects.ts +31 -0
- package/repos/effect/ai-docs/src/01_effect/04_resources/30_layer-map.ts +86 -0
- package/repos/effect/ai-docs/src/01_effect/04_resources/index.md +3 -0
- package/repos/effect/ai-docs/src/01_effect/05_running/10_run-main.ts +30 -0
- package/repos/effect/ai-docs/src/01_effect/05_running/20_layer-launch.ts +27 -0
- package/repos/effect/ai-docs/src/01_effect/05_running/index.md +1 -0
- package/repos/effect/ai-docs/src/01_effect/06_pubsub/10_pubsub.ts +56 -0
- package/repos/effect/ai-docs/src/01_effect/06_pubsub/index.md +3 -0
- package/repos/effect/ai-docs/src/02_stream/10_creating-streams.ts +103 -0
- package/repos/effect/ai-docs/src/02_stream/20_consuming-streams.ts +137 -0
- package/repos/effect/ai-docs/src/02_stream/30_encoding.ts +165 -0
- package/repos/effect/ai-docs/src/02_stream/index.md +4 -0
- package/repos/effect/ai-docs/src/03_integration/10_managed-runtime.ts +129 -0
- package/repos/effect/ai-docs/src/03_integration/index.md +5 -0
- package/repos/effect/ai-docs/src/05_batching/10_request-resolver.ts +89 -0
- package/repos/effect/ai-docs/src/05_batching/index.md +3 -0
- package/repos/effect/ai-docs/src/06_schedule/10_schedules.ts +102 -0
- package/repos/effect/ai-docs/src/06_schedule/index.md +3 -0
- package/repos/effect/ai-docs/src/07_datetime/10_creating-and-formatting.ts +30 -0
- package/repos/effect/ai-docs/src/07_datetime/20_time-zones.ts +44 -0
- package/repos/effect/ai-docs/src/07_datetime/index.md +5 -0
- package/repos/effect/ai-docs/src/08_observability/10_logging.ts +66 -0
- package/repos/effect/ai-docs/src/08_observability/20_otlp-tracing.ts +95 -0
- package/repos/effect/ai-docs/src/08_observability/index.md +7 -0
- package/repos/effect/ai-docs/src/09_testing/10_effect-tests.ts +55 -0
- package/repos/effect/ai-docs/src/09_testing/20_layer-tests.ts +138 -0
- package/repos/effect/ai-docs/src/09_testing/index.md +1 -0
- package/repos/effect/ai-docs/src/50_http-client/10_basics.ts +102 -0
- package/repos/effect/ai-docs/src/50_http-client/index.md +3 -0
- package/repos/effect/ai-docs/src/51_http-server/10_basics.ts +116 -0
- package/repos/effect/ai-docs/src/51_http-server/fixtures/api/Api.ts +14 -0
- package/repos/effect/ai-docs/src/51_http-server/fixtures/api/Authorization.ts +36 -0
- package/repos/effect/ai-docs/src/51_http-server/fixtures/api/System.ts +10 -0
- package/repos/effect/ai-docs/src/51_http-server/fixtures/api/Users.ts +91 -0
- package/repos/effect/ai-docs/src/51_http-server/fixtures/domain/User.ts +12 -0
- package/repos/effect/ai-docs/src/51_http-server/fixtures/domain/UserErrors.ts +22 -0
- package/repos/effect/ai-docs/src/51_http-server/fixtures/server/Authorization.ts +36 -0
- package/repos/effect/ai-docs/src/51_http-server/fixtures/server/Users/http.ts +71 -0
- package/repos/effect/ai-docs/src/51_http-server/fixtures/server/Users.ts +62 -0
- package/repos/effect/ai-docs/src/51_http-server/index.md +3 -0
- package/repos/effect/ai-docs/src/60_child-process/10_working-with-child-processes.ts +117 -0
- package/repos/effect/ai-docs/src/60_child-process/index.md +3 -0
- package/repos/effect/ai-docs/src/70_cli/10_basics.ts +136 -0
- package/repos/effect/ai-docs/src/70_cli/index.md +5 -0
- package/repos/effect/ai-docs/src/71_ai/10_language-model.ts +156 -0
- package/repos/effect/ai-docs/src/71_ai/20_tools.ts +226 -0
- package/repos/effect/ai-docs/src/71_ai/30_chat.ts +158 -0
- package/repos/effect/ai-docs/src/71_ai/fixtures/domain/LaunchPlan.ts +9 -0
- package/repos/effect/ai-docs/src/71_ai/index.md +5 -0
- package/repos/effect/ai-docs/src/80_cluster/10_entities.ts +97 -0
- package/repos/effect/ai-docs/src/80_cluster/index.md +4 -0
- package/repos/effect/ai-docs/src/index.md +12 -0
- package/repos/effect/ai-docs/tsconfig.json +24 -0
- package/repos/effect/cookbooks/schedule.md +3507 -0
- package/repos/effect/deno.json +33 -0
- package/repos/effect/docker-compose.yaml +18 -0
- package/repos/effect/dprint.json +32 -0
- package/repos/effect/flake.lock +27 -0
- package/repos/effect/flake.nix +24 -0
- package/repos/effect/jsdocs.config.json +16 -0
- package/repos/effect/migration/cause.md +163 -0
- package/repos/effect/migration/equality.md +72 -0
- package/repos/effect/migration/error-handling.md +106 -0
- package/repos/effect/migration/fiber-keep-alive.md +74 -0
- package/repos/effect/migration/fiberref.md +109 -0
- package/repos/effect/migration/forking.md +94 -0
- package/repos/effect/migration/generators.md +32 -0
- package/repos/effect/migration/layer-memoization.md +98 -0
- package/repos/effect/migration/runtime.md +88 -0
- package/repos/effect/migration/schema.md +1032 -0
- package/repos/effect/migration/scope.md +50 -0
- package/repos/effect/migration/services.md +235 -0
- package/repos/effect/migration/v3-to-v4.md +421 -0
- package/repos/effect/migration/yieldable.md +173 -0
- package/repos/effect/package.json +104 -0
- package/repos/effect/packages/ai/anthropic/CHANGELOG.md +611 -0
- package/repos/effect/packages/ai/anthropic/codegen.yml +63 -0
- package/repos/effect/packages/ai/anthropic/docgen.json +26 -0
- package/repos/effect/packages/ai/anthropic/package.json +67 -0
- package/repos/effect/packages/ai/anthropic/src/AnthropicClient.ts +432 -0
- package/repos/effect/packages/ai/anthropic/src/AnthropicConfig.ts +84 -0
- package/repos/effect/packages/ai/anthropic/src/AnthropicError.ts +212 -0
- package/repos/effect/packages/ai/anthropic/src/AnthropicLanguageModel.ts +3098 -0
- package/repos/effect/packages/ai/anthropic/src/AnthropicTelemetry.ts +132 -0
- package/repos/effect/packages/ai/anthropic/src/AnthropicTool.ts +2512 -0
- package/repos/effect/packages/ai/anthropic/src/Generated.ts +12600 -0
- package/repos/effect/packages/ai/anthropic/src/index.ts +40 -0
- package/repos/effect/packages/ai/anthropic/src/internal/errors.ts +370 -0
- package/repos/effect/packages/ai/anthropic/src/internal/utilities.ts +26 -0
- package/repos/effect/packages/ai/anthropic/test/AnthropicLanguageModel.test.ts +300 -0
- package/repos/effect/packages/ai/anthropic/tsconfig.json +8 -0
- package/repos/effect/packages/ai/anthropic/vitest.config.ts +6 -0
- package/repos/effect/packages/ai/openai/CHANGELOG.md +668 -0
- package/repos/effect/packages/ai/openai/codegen.yaml +41 -0
- package/repos/effect/packages/ai/openai/docgen.json +24 -0
- package/repos/effect/packages/ai/openai/package.json +67 -0
- package/repos/effect/packages/ai/openai/src/Generated.ts +35774 -0
- package/repos/effect/packages/ai/openai/src/OpenAiClient.ts +730 -0
- package/repos/effect/packages/ai/openai/src/OpenAiClientGenerated.ts +202 -0
- package/repos/effect/packages/ai/openai/src/OpenAiConfig.ts +93 -0
- package/repos/effect/packages/ai/openai/src/OpenAiEmbeddingModel.ts +258 -0
- package/repos/effect/packages/ai/openai/src/OpenAiError.ts +242 -0
- package/repos/effect/packages/ai/openai/src/OpenAiLanguageModel.ts +3133 -0
- package/repos/effect/packages/ai/openai/src/OpenAiSchema.ts +1286 -0
- package/repos/effect/packages/ai/openai/src/OpenAiTelemetry.ts +162 -0
- package/repos/effect/packages/ai/openai/src/OpenAiTool.ts +342 -0
- package/repos/effect/packages/ai/openai/src/index.ts +55 -0
- package/repos/effect/packages/ai/openai/src/internal/errors.ts +349 -0
- package/repos/effect/packages/ai/openai/src/internal/utilities.ts +33 -0
- package/repos/effect/packages/ai/openai/test/OpenAiClient.test.ts +798 -0
- package/repos/effect/packages/ai/openai/test/OpenAiEmbeddingModel.test.ts +289 -0
- package/repos/effect/packages/ai/openai/test/OpenAiLanguageModel.test.ts +1528 -0
- package/repos/effect/packages/ai/openai/test/OpenAiSchema.test.ts +273 -0
- package/repos/effect/packages/ai/openai/tsconfig.json +8 -0
- package/repos/effect/packages/ai/openai/vitest.config.ts +6 -0
- package/repos/effect/packages/ai/openai-compat/CHANGELOG.md +626 -0
- package/repos/effect/packages/ai/openai-compat/docgen.json +24 -0
- package/repos/effect/packages/ai/openai-compat/package.json +69 -0
- package/repos/effect/packages/ai/openai-compat/src/OpenAiClient.ts +1221 -0
- package/repos/effect/packages/ai/openai-compat/src/OpenAiConfig.ts +87 -0
- package/repos/effect/packages/ai/openai-compat/src/OpenAiEmbeddingModel.ts +254 -0
- package/repos/effect/packages/ai/openai-compat/src/OpenAiError.ts +178 -0
- package/repos/effect/packages/ai/openai-compat/src/OpenAiLanguageModel.ts +1951 -0
- package/repos/effect/packages/ai/openai-compat/src/OpenAiTelemetry.ts +164 -0
- package/repos/effect/packages/ai/openai-compat/src/index.ts +35 -0
- package/repos/effect/packages/ai/openai-compat/src/internal/errors.ts +327 -0
- package/repos/effect/packages/ai/openai-compat/src/internal/utilities.ts +33 -0
- package/repos/effect/packages/ai/openai-compat/test/OpenAiClient.test.ts +474 -0
- package/repos/effect/packages/ai/openai-compat/test/OpenAiEmbeddingModel.test.ts +216 -0
- package/repos/effect/packages/ai/openai-compat/test/OpenAiLanguageModel.test.ts +1505 -0
- package/repos/effect/packages/ai/openai-compat/tsconfig.json +8 -0
- package/repos/effect/packages/ai/openai-compat/vitest.config.ts +6 -0
- package/repos/effect/packages/ai/openrouter/CHANGELOG.md +607 -0
- package/repos/effect/packages/ai/openrouter/codegen.yml +35 -0
- package/repos/effect/packages/ai/openrouter/docgen.json +24 -0
- package/repos/effect/packages/ai/openrouter/package.json +67 -0
- package/repos/effect/packages/ai/openrouter/src/Generated.ts +10028 -0
- package/repos/effect/packages/ai/openrouter/src/OpenRouterClient.ts +357 -0
- package/repos/effect/packages/ai/openrouter/src/OpenRouterConfig.ts +99 -0
- package/repos/effect/packages/ai/openrouter/src/OpenRouterError.ts +225 -0
- package/repos/effect/packages/ai/openrouter/src/OpenRouterLanguageModel.ts +1796 -0
- package/repos/effect/packages/ai/openrouter/src/index.ts +30 -0
- package/repos/effect/packages/ai/openrouter/src/internal/errors.ts +375 -0
- package/repos/effect/packages/ai/openrouter/src/internal/utilities.ts +92 -0
- package/repos/effect/packages/ai/openrouter/tsconfig.json +10 -0
- package/repos/effect/packages/ai/openrouter/vitest.config.ts +6 -0
- package/repos/effect/packages/atom/react/CHANGELOG.md +599 -0
- package/repos/effect/packages/atom/react/LICENSE +21 -0
- package/repos/effect/packages/atom/react/README.md +7 -0
- package/repos/effect/packages/atom/react/docgen.json +25 -0
- package/repos/effect/packages/atom/react/package.json +79 -0
- package/repos/effect/packages/atom/react/src/Hooks.ts +476 -0
- package/repos/effect/packages/atom/react/src/ReactHydration.ts +109 -0
- package/repos/effect/packages/atom/react/src/RegistryContext.ts +108 -0
- package/repos/effect/packages/atom/react/src/ScopedAtom.ts +151 -0
- package/repos/effect/packages/atom/react/src/index.ts +23 -0
- package/repos/effect/packages/atom/react/test/index.test.tsx +650 -0
- package/repos/effect/packages/atom/react/tsconfig.json +8 -0
- package/repos/effect/packages/atom/react/vitest.config.ts +9 -0
- package/repos/effect/packages/atom/react/vitest.setup.ts +8 -0
- package/repos/effect/packages/atom/solid/CHANGELOG.md +595 -0
- package/repos/effect/packages/atom/solid/LICENSE +21 -0
- package/repos/effect/packages/atom/solid/README.md +7 -0
- package/repos/effect/packages/atom/solid/docgen.json +26 -0
- package/repos/effect/packages/atom/solid/package.json +72 -0
- package/repos/effect/packages/atom/solid/src/Hooks.ts +359 -0
- package/repos/effect/packages/atom/solid/src/RegistryContext.ts +80 -0
- package/repos/effect/packages/atom/solid/src/index.ts +13 -0
- package/repos/effect/packages/atom/solid/test/index.test.tsx +296 -0
- package/repos/effect/packages/atom/solid/tsconfig.json +8 -0
- package/repos/effect/packages/atom/solid/vitest.config.ts +15 -0
- package/repos/effect/packages/atom/solid/vitest.setup.ts +8 -0
- package/repos/effect/packages/atom/vue/CHANGELOG.md +593 -0
- package/repos/effect/packages/atom/vue/LICENSE +21 -0
- package/repos/effect/packages/atom/vue/README.md +7 -0
- package/repos/effect/packages/atom/vue/docgen.json +24 -0
- package/repos/effect/packages/atom/vue/package.json +68 -0
- package/repos/effect/packages/atom/vue/src/index.ts +211 -0
- package/repos/effect/packages/atom/vue/test/index.test.ts +5 -0
- package/repos/effect/packages/atom/vue/tsconfig.json +14 -0
- package/repos/effect/packages/atom/vue/vitest.config.ts +8 -0
- package/repos/effect/packages/effect/CHANGELOG.md +1607 -0
- package/repos/effect/packages/effect/CONFIG.md +690 -0
- package/repos/effect/packages/effect/HTTPAPI.md +3213 -0
- package/repos/effect/packages/effect/LICENSE +21 -0
- package/repos/effect/packages/effect/MCP.md +369 -0
- package/repos/effect/packages/effect/OPTIC.md +620 -0
- package/repos/effect/packages/effect/README.md +53 -0
- package/repos/effect/packages/effect/SCHEMA.md +7284 -0
- package/repos/effect/packages/effect/benchmark/schema/Enums.ts +40 -0
- package/repos/effect/packages/effect/benchmark/schema/Optic.ts +79 -0
- package/repos/effect/packages/effect/benchmark/schema/array.ts +74 -0
- package/repos/effect/packages/effect/benchmark/schema/filter.ts +74 -0
- package/repos/effect/packages/effect/benchmark/schema/object.ts +82 -0
- package/repos/effect/packages/effect/benchmark/schema/tagged-union.ts +69 -0
- package/repos/effect/packages/effect/benchmark/schema/transformation.ts +91 -0
- package/repos/effect/packages/effect/benchmark/stream/splitLines.ts +46 -0
- package/repos/effect/packages/effect/docgen.json +38 -0
- package/repos/effect/packages/effect/package.json +127 -0
- package/repos/effect/packages/effect/src/Array.ts +4908 -0
- package/repos/effect/packages/effect/src/BigDecimal.ts +1943 -0
- package/repos/effect/packages/effect/src/BigInt.ts +1029 -0
- package/repos/effect/packages/effect/src/Boolean.ts +481 -0
- package/repos/effect/packages/effect/src/Brand.ts +318 -0
- package/repos/effect/packages/effect/src/Cache.ts +1295 -0
- package/repos/effect/packages/effect/src/Cause.ts +1939 -0
- package/repos/effect/packages/effect/src/Channel.ts +8615 -0
- package/repos/effect/packages/effect/src/ChannelSchema.ts +308 -0
- package/repos/effect/packages/effect/src/Chunk.ts +2976 -0
- package/repos/effect/packages/effect/src/Clock.ts +194 -0
- package/repos/effect/packages/effect/src/Combiner.ts +316 -0
- package/repos/effect/packages/effect/src/Config.ts +1416 -0
- package/repos/effect/packages/effect/src/ConfigProvider.ts +1159 -0
- package/repos/effect/packages/effect/src/Console.ts +653 -0
- package/repos/effect/packages/effect/src/Context.ts +1339 -0
- package/repos/effect/packages/effect/src/Cron.ts +1212 -0
- package/repos/effect/packages/effect/src/Crypto.ts +318 -0
- package/repos/effect/packages/effect/src/Data.ts +774 -0
- package/repos/effect/packages/effect/src/DateTime.ts +2922 -0
- package/repos/effect/packages/effect/src/Deferred.ts +917 -0
- package/repos/effect/packages/effect/src/Differ.ts +32 -0
- package/repos/effect/packages/effect/src/Duration.ts +1827 -0
- package/repos/effect/packages/effect/src/Effect.ts +15347 -0
- package/repos/effect/packages/effect/src/Effectable.ts +68 -0
- package/repos/effect/packages/effect/src/Encoding.ts +1046 -0
- package/repos/effect/packages/effect/src/Equal.ts +550 -0
- package/repos/effect/packages/effect/src/Equivalence.ts +870 -0
- package/repos/effect/packages/effect/src/ErrorReporter.ts +543 -0
- package/repos/effect/packages/effect/src/ExecutionPlan.ts +416 -0
- package/repos/effect/packages/effect/src/Exit.ts +1085 -0
- package/repos/effect/packages/effect/src/Fiber.ts +632 -0
- package/repos/effect/packages/effect/src/FiberHandle.ts +815 -0
- package/repos/effect/packages/effect/src/FiberMap.ts +1030 -0
- package/repos/effect/packages/effect/src/FiberSet.ts +713 -0
- package/repos/effect/packages/effect/src/FileSystem.ts +1394 -0
- package/repos/effect/packages/effect/src/Filter.ts +827 -0
- package/repos/effect/packages/effect/src/Formatter.ts +319 -0
- package/repos/effect/packages/effect/src/Function.ts +1415 -0
- package/repos/effect/packages/effect/src/Graph.ts +4892 -0
- package/repos/effect/packages/effect/src/HKT.ts +213 -0
- package/repos/effect/packages/effect/src/Hash.ts +539 -0
- package/repos/effect/packages/effect/src/HashMap.ts +1236 -0
- package/repos/effect/packages/effect/src/HashRing.ts +426 -0
- package/repos/effect/packages/effect/src/HashSet.ts +605 -0
- package/repos/effect/packages/effect/src/Inspectable.ts +329 -0
- package/repos/effect/packages/effect/src/Iterable.ts +2483 -0
- package/repos/effect/packages/effect/src/JsonPatch.ts +469 -0
- package/repos/effect/packages/effect/src/JsonPointer.ts +80 -0
- package/repos/effect/packages/effect/src/JsonSchema.ts +948 -0
- package/repos/effect/packages/effect/src/Latch.ts +373 -0
- package/repos/effect/packages/effect/src/Layer.ts +2773 -0
- package/repos/effect/packages/effect/src/LayerMap.ts +468 -0
- package/repos/effect/packages/effect/src/LogLevel.ts +412 -0
- package/repos/effect/packages/effect/src/Logger.ts +1284 -0
- package/repos/effect/packages/effect/src/ManagedRuntime.ts +381 -0
- package/repos/effect/packages/effect/src/Match.ts +2606 -0
- package/repos/effect/packages/effect/src/Metric.ts +4058 -0
- package/repos/effect/packages/effect/src/MutableHashMap.ts +845 -0
- package/repos/effect/packages/effect/src/MutableHashSet.ts +422 -0
- package/repos/effect/packages/effect/src/MutableList.ts +967 -0
- package/repos/effect/packages/effect/src/MutableRef.ts +822 -0
- package/repos/effect/packages/effect/src/Newtype.ts +319 -0
- package/repos/effect/packages/effect/src/NonEmptyIterable.ts +221 -0
- package/repos/effect/packages/effect/src/Number.ts +860 -0
- package/repos/effect/packages/effect/src/Optic.ts +1701 -0
- package/repos/effect/packages/effect/src/Option.ts +2664 -0
- package/repos/effect/packages/effect/src/Order.ts +982 -0
- package/repos/effect/packages/effect/src/Ordering.ts +182 -0
- package/repos/effect/packages/effect/src/PartitionedSemaphore.ts +561 -0
- package/repos/effect/packages/effect/src/Path.ts +870 -0
- package/repos/effect/packages/effect/src/Pipeable.ts +674 -0
- package/repos/effect/packages/effect/src/PlatformError.ts +221 -0
- package/repos/effect/packages/effect/src/Pool.ts +699 -0
- package/repos/effect/packages/effect/src/Predicate.ts +1872 -0
- package/repos/effect/packages/effect/src/PrimaryKey.ts +123 -0
- package/repos/effect/packages/effect/src/PubSub.ts +2797 -0
- package/repos/effect/packages/effect/src/Pull.ts +376 -0
- package/repos/effect/packages/effect/src/Queue.ts +1962 -0
- package/repos/effect/packages/effect/src/Random.ts +549 -0
- package/repos/effect/packages/effect/src/RcMap.ts +612 -0
- package/repos/effect/packages/effect/src/RcRef.ts +225 -0
- package/repos/effect/packages/effect/src/Record.ts +1563 -0
- package/repos/effect/packages/effect/src/Redactable.ts +168 -0
- package/repos/effect/packages/effect/src/Redacted.ts +314 -0
- package/repos/effect/packages/effect/src/Reducer.ts +178 -0
- package/repos/effect/packages/effect/src/Ref.ts +801 -0
- package/repos/effect/packages/effect/src/References.ts +786 -0
- package/repos/effect/packages/effect/src/RegExp.ts +82 -0
- package/repos/effect/packages/effect/src/Request.ts +598 -0
- package/repos/effect/packages/effect/src/RequestResolver.ts +1249 -0
- package/repos/effect/packages/effect/src/Resource.ts +184 -0
- package/repos/effect/packages/effect/src/Result.ts +1939 -0
- package/repos/effect/packages/effect/src/Runtime.ts +432 -0
- package/repos/effect/packages/effect/src/Schedule.ts +3564 -0
- package/repos/effect/packages/effect/src/Scheduler.ts +285 -0
- package/repos/effect/packages/effect/src/Schema.ts +14653 -0
- package/repos/effect/packages/effect/src/SchemaAST.ts +3903 -0
- package/repos/effect/packages/effect/src/SchemaGetter.ts +1870 -0
- package/repos/effect/packages/effect/src/SchemaIssue.ts +1176 -0
- package/repos/effect/packages/effect/src/SchemaParser.ts +1105 -0
- package/repos/effect/packages/effect/src/SchemaRepresentation.ts +3944 -0
- package/repos/effect/packages/effect/src/SchemaTransformation.ts +1818 -0
- package/repos/effect/packages/effect/src/SchemaUtils.ts +51 -0
- package/repos/effect/packages/effect/src/Scope.ts +572 -0
- package/repos/effect/packages/effect/src/ScopedCache.ts +820 -0
- package/repos/effect/packages/effect/src/ScopedRef.ts +192 -0
- package/repos/effect/packages/effect/src/Semaphore.ts +517 -0
- package/repos/effect/packages/effect/src/Sink.ts +2174 -0
- package/repos/effect/packages/effect/src/Stdio.ts +143 -0
- package/repos/effect/packages/effect/src/Stream.ts +11722 -0
- package/repos/effect/packages/effect/src/String.ts +1427 -0
- package/repos/effect/packages/effect/src/Struct.ts +979 -0
- package/repos/effect/packages/effect/src/SubscriptionRef.ts +1021 -0
- package/repos/effect/packages/effect/src/Symbol.ts +31 -0
- package/repos/effect/packages/effect/src/SynchronizedRef.ts +668 -0
- package/repos/effect/packages/effect/src/Take.ts +46 -0
- package/repos/effect/packages/effect/src/Terminal.ts +188 -0
- package/repos/effect/packages/effect/src/Tracer.ts +683 -0
- package/repos/effect/packages/effect/src/Trie.ts +953 -0
- package/repos/effect/packages/effect/src/Tuple.ts +737 -0
- package/repos/effect/packages/effect/src/TxChunk.ts +822 -0
- package/repos/effect/packages/effect/src/TxDeferred.ts +319 -0
- package/repos/effect/packages/effect/src/TxHashMap.ts +2165 -0
- package/repos/effect/packages/effect/src/TxHashSet.ts +908 -0
- package/repos/effect/packages/effect/src/TxPriorityQueue.ts +567 -0
- package/repos/effect/packages/effect/src/TxPubSub.ts +684 -0
- package/repos/effect/packages/effect/src/TxQueue.ts +1488 -0
- package/repos/effect/packages/effect/src/TxReentrantLock.ts +655 -0
- package/repos/effect/packages/effect/src/TxRef.ts +282 -0
- package/repos/effect/packages/effect/src/TxSemaphore.ts +707 -0
- package/repos/effect/packages/effect/src/TxSubscriptionRef.ts +518 -0
- package/repos/effect/packages/effect/src/Types.ts +1121 -0
- package/repos/effect/packages/effect/src/UndefinedOr.ts +239 -0
- package/repos/effect/packages/effect/src/Unify.ts +314 -0
- package/repos/effect/packages/effect/src/Utils.ts +221 -0
- package/repos/effect/packages/effect/src/index.ts +712 -0
- package/repos/effect/packages/effect/src/internal/array.ts +8 -0
- package/repos/effect/packages/effect/src/internal/concurrency.ts +52 -0
- package/repos/effect/packages/effect/src/internal/core.ts +666 -0
- package/repos/effect/packages/effect/src/internal/dateTime.ts +1264 -0
- package/repos/effect/packages/effect/src/internal/doNotation.ts +117 -0
- package/repos/effect/packages/effect/src/internal/effect.ts +6427 -0
- package/repos/effect/packages/effect/src/internal/equal.ts +28 -0
- package/repos/effect/packages/effect/src/internal/errors.ts +9 -0
- package/repos/effect/packages/effect/src/internal/executionPlan.ts +120 -0
- package/repos/effect/packages/effect/src/internal/hashMap.ts +1309 -0
- package/repos/effect/packages/effect/src/internal/hashSet.ts +190 -0
- package/repos/effect/packages/effect/src/internal/layer.ts +88 -0
- package/repos/effect/packages/effect/src/internal/matcher.ts +637 -0
- package/repos/effect/packages/effect/src/internal/metric.ts +2 -0
- package/repos/effect/packages/effect/src/internal/option.ts +98 -0
- package/repos/effect/packages/effect/src/internal/random.ts +20 -0
- package/repos/effect/packages/effect/src/internal/rcRef.ts +189 -0
- package/repos/effect/packages/effect/src/internal/record.ts +18 -0
- package/repos/effect/packages/effect/src/internal/redacted.ts +19 -0
- package/repos/effect/packages/effect/src/internal/references.ts +72 -0
- package/repos/effect/packages/effect/src/internal/request.ts +205 -0
- package/repos/effect/packages/effect/src/internal/result.ts +112 -0
- package/repos/effect/packages/effect/src/internal/schedule.ts +248 -0
- package/repos/effect/packages/effect/src/internal/schema/annotations.ts +37 -0
- package/repos/effect/packages/effect/src/internal/schema/arbitrary.ts +894 -0
- package/repos/effect/packages/effect/src/internal/schema/cause.ts +26 -0
- package/repos/effect/packages/effect/src/internal/schema/equivalence.ts +154 -0
- package/repos/effect/packages/effect/src/internal/schema/representation.ts +799 -0
- package/repos/effect/packages/effect/src/internal/schema/schema.ts +128 -0
- package/repos/effect/packages/effect/src/internal/stream.ts +28 -0
- package/repos/effect/packages/effect/src/internal/tracer.ts +41 -0
- package/repos/effect/packages/effect/src/internal/trie.ts +733 -0
- package/repos/effect/packages/effect/src/internal/version.ts +2 -0
- package/repos/effect/packages/effect/src/testing/FastCheck.ts +89 -0
- package/repos/effect/packages/effect/src/testing/TestClock.ts +547 -0
- package/repos/effect/packages/effect/src/testing/TestConsole.ts +369 -0
- package/repos/effect/packages/effect/src/testing/TestSchema.ts +567 -0
- package/repos/effect/packages/effect/src/testing/index.ts +25 -0
- package/repos/effect/packages/effect/src/unstable/ai/AiError.ts +1629 -0
- package/repos/effect/packages/effect/src/unstable/ai/AnthropicStructuredOutput.ts +407 -0
- package/repos/effect/packages/effect/src/unstable/ai/Chat.ts +931 -0
- package/repos/effect/packages/effect/src/unstable/ai/EmbeddingModel.ts +269 -0
- package/repos/effect/packages/effect/src/unstable/ai/IdGenerator.ts +300 -0
- package/repos/effect/packages/effect/src/unstable/ai/LanguageModel.ts +2221 -0
- package/repos/effect/packages/effect/src/unstable/ai/McpSchema.ts +2527 -0
- package/repos/effect/packages/effect/src/unstable/ai/McpServer.ts +1468 -0
- package/repos/effect/packages/effect/src/unstable/ai/Model.ts +166 -0
- package/repos/effect/packages/effect/src/unstable/ai/OpenAiStructuredOutput.ts +476 -0
- package/repos/effect/packages/effect/src/unstable/ai/Prompt.ts +2234 -0
- package/repos/effect/packages/effect/src/unstable/ai/Response.ts +2582 -0
- package/repos/effect/packages/effect/src/unstable/ai/ResponseIdTracker.ts +139 -0
- package/repos/effect/packages/effect/src/unstable/ai/Telemetry.ts +515 -0
- package/repos/effect/packages/effect/src/unstable/ai/Tokenizer.ts +176 -0
- package/repos/effect/packages/effect/src/unstable/ai/Tool.ts +2003 -0
- package/repos/effect/packages/effect/src/unstable/ai/Toolkit.ts +554 -0
- package/repos/effect/packages/effect/src/unstable/ai/index.ts +90 -0
- package/repos/effect/packages/effect/src/unstable/ai/internal/codec-transformer.ts +13 -0
- package/repos/effect/packages/effect/src/unstable/cli/Argument.ts +749 -0
- package/repos/effect/packages/effect/src/unstable/cli/CliError.ts +549 -0
- package/repos/effect/packages/effect/src/unstable/cli/CliOutput.ts +607 -0
- package/repos/effect/packages/effect/src/unstable/cli/Command.ts +1610 -0
- package/repos/effect/packages/effect/src/unstable/cli/Completions.ts +123 -0
- package/repos/effect/packages/effect/src/unstable/cli/Flag.ts +986 -0
- package/repos/effect/packages/effect/src/unstable/cli/GlobalFlag.ts +295 -0
- package/repos/effect/packages/effect/src/unstable/cli/HelpDoc.ts +323 -0
- package/repos/effect/packages/effect/src/unstable/cli/Param.ts +2193 -0
- package/repos/effect/packages/effect/src/unstable/cli/Primitive.ts +766 -0
- package/repos/effect/packages/effect/src/unstable/cli/Prompt.ts +3852 -0
- package/repos/effect/packages/effect/src/unstable/cli/SEMANTICS.md +157 -0
- package/repos/effect/packages/effect/src/unstable/cli/index.ts +60 -0
- package/repos/effect/packages/effect/src/unstable/cli/internal/ansi.ts +152 -0
- package/repos/effect/packages/effect/src/unstable/cli/internal/auto-suggest.ts +41 -0
- package/repos/effect/packages/effect/src/unstable/cli/internal/command.ts +340 -0
- package/repos/effect/packages/effect/src/unstable/cli/internal/completions/bash.ts +222 -0
- package/repos/effect/packages/effect/src/unstable/cli/internal/completions/descriptor.ts +133 -0
- package/repos/effect/packages/effect/src/unstable/cli/internal/completions/fish.ts +253 -0
- package/repos/effect/packages/effect/src/unstable/cli/internal/completions/zsh.ts +220 -0
- package/repos/effect/packages/effect/src/unstable/cli/internal/config.ts +272 -0
- package/repos/effect/packages/effect/src/unstable/cli/internal/help.ts +181 -0
- package/repos/effect/packages/effect/src/unstable/cli/internal/lexer.ts +70 -0
- package/repos/effect/packages/effect/src/unstable/cli/internal/parser.ts +932 -0
- package/repos/effect/packages/effect/src/unstable/cluster/ClusterCron.ts +163 -0
- package/repos/effect/packages/effect/src/unstable/cluster/ClusterError.ts +238 -0
- package/repos/effect/packages/effect/src/unstable/cluster/ClusterMetrics.ts +112 -0
- package/repos/effect/packages/effect/src/unstable/cluster/ClusterSchema.ts +170 -0
- package/repos/effect/packages/effect/src/unstable/cluster/ClusterWorkflowEngine.ts +778 -0
- package/repos/effect/packages/effect/src/unstable/cluster/DeliverAt.ts +58 -0
- package/repos/effect/packages/effect/src/unstable/cluster/Entity.ts +779 -0
- package/repos/effect/packages/effect/src/unstable/cluster/EntityAddress.ts +93 -0
- package/repos/effect/packages/effect/src/unstable/cluster/EntityId.ts +50 -0
- package/repos/effect/packages/effect/src/unstable/cluster/EntityProxy.ts +263 -0
- package/repos/effect/packages/effect/src/unstable/cluster/EntityProxyServer.ts +149 -0
- package/repos/effect/packages/effect/src/unstable/cluster/EntityResource.ts +184 -0
- package/repos/effect/packages/effect/src/unstable/cluster/EntityType.ts +52 -0
- package/repos/effect/packages/effect/src/unstable/cluster/Envelope.ts +433 -0
- package/repos/effect/packages/effect/src/unstable/cluster/HttpRunner.ts +345 -0
- package/repos/effect/packages/effect/src/unstable/cluster/K8sHttpClient.ts +297 -0
- package/repos/effect/packages/effect/src/unstable/cluster/MachineId.ts +54 -0
- package/repos/effect/packages/effect/src/unstable/cluster/Message.ts +314 -0
- package/repos/effect/packages/effect/src/unstable/cluster/MessageStorage.ts +1072 -0
- package/repos/effect/packages/effect/src/unstable/cluster/Reply.ts +455 -0
- package/repos/effect/packages/effect/src/unstable/cluster/Runner.ts +129 -0
- package/repos/effect/packages/effect/src/unstable/cluster/RunnerAddress.ts +112 -0
- package/repos/effect/packages/effect/src/unstable/cluster/RunnerHealth.ts +145 -0
- package/repos/effect/packages/effect/src/unstable/cluster/RunnerServer.ts +220 -0
- package/repos/effect/packages/effect/src/unstable/cluster/RunnerStorage.ts +243 -0
- package/repos/effect/packages/effect/src/unstable/cluster/Runners.ts +690 -0
- package/repos/effect/packages/effect/src/unstable/cluster/ShardId.ts +178 -0
- package/repos/effect/packages/effect/src/unstable/cluster/Sharding.ts +1488 -0
- package/repos/effect/packages/effect/src/unstable/cluster/ShardingConfig.ts +367 -0
- package/repos/effect/packages/effect/src/unstable/cluster/ShardingRegistrationEvent.ts +76 -0
- package/repos/effect/packages/effect/src/unstable/cluster/SingleRunner.ts +75 -0
- package/repos/effect/packages/effect/src/unstable/cluster/Singleton.ts +56 -0
- package/repos/effect/packages/effect/src/unstable/cluster/SingletonAddress.ts +49 -0
- package/repos/effect/packages/effect/src/unstable/cluster/Snowflake.ts +282 -0
- package/repos/effect/packages/effect/src/unstable/cluster/SocketRunner.ts +96 -0
- package/repos/effect/packages/effect/src/unstable/cluster/SqlMessageStorage.ts +1045 -0
- package/repos/effect/packages/effect/src/unstable/cluster/SqlRunnerStorage.ts +700 -0
- package/repos/effect/packages/effect/src/unstable/cluster/TestRunner.ts +36 -0
- package/repos/effect/packages/effect/src/unstable/cluster/index.ts +195 -0
- package/repos/effect/packages/effect/src/unstable/cluster/internal/entityManager.ts +678 -0
- package/repos/effect/packages/effect/src/unstable/cluster/internal/entityReaper.ts +58 -0
- package/repos/effect/packages/effect/src/unstable/cluster/internal/hash.ts +23 -0
- package/repos/effect/packages/effect/src/unstable/cluster/internal/interruptors.ts +2 -0
- package/repos/effect/packages/effect/src/unstable/cluster/internal/resourceMap.ts +100 -0
- package/repos/effect/packages/effect/src/unstable/cluster/internal/resourceRef.ts +99 -0
- package/repos/effect/packages/effect/src/unstable/devtools/DevTools.ts +68 -0
- package/repos/effect/packages/effect/src/unstable/devtools/DevToolsClient.ts +236 -0
- package/repos/effect/packages/effect/src/unstable/devtools/DevToolsSchema.ts +558 -0
- package/repos/effect/packages/effect/src/unstable/devtools/DevToolsServer.ts +94 -0
- package/repos/effect/packages/effect/src/unstable/devtools/index.ts +25 -0
- package/repos/effect/packages/effect/src/unstable/encoding/Msgpack.ts +383 -0
- package/repos/effect/packages/effect/src/unstable/encoding/Ndjson.ts +602 -0
- package/repos/effect/packages/effect/src/unstable/encoding/Sse.ts +593 -0
- package/repos/effect/packages/effect/src/unstable/encoding/index.ts +20 -0
- package/repos/effect/packages/effect/src/unstable/eventlog/Event.ts +447 -0
- package/repos/effect/packages/effect/src/unstable/eventlog/EventGroup.ts +193 -0
- package/repos/effect/packages/effect/src/unstable/eventlog/EventJournal.ts +795 -0
- package/repos/effect/packages/effect/src/unstable/eventlog/EventLog.ts +1030 -0
- package/repos/effect/packages/effect/src/unstable/eventlog/EventLogEncryption.ts +169 -0
- package/repos/effect/packages/effect/src/unstable/eventlog/EventLogMessage.ts +354 -0
- package/repos/effect/packages/effect/src/unstable/eventlog/EventLogRemote.ts +377 -0
- package/repos/effect/packages/effect/src/unstable/eventlog/EventLogServer.ts +242 -0
- package/repos/effect/packages/effect/src/unstable/eventlog/EventLogServerEncrypted.ts +268 -0
- package/repos/effect/packages/effect/src/unstable/eventlog/EventLogServerUnencrypted.ts +898 -0
- package/repos/effect/packages/effect/src/unstable/eventlog/EventLogSessionAuth.ts +524 -0
- package/repos/effect/packages/effect/src/unstable/eventlog/SqlEventJournal.ts +353 -0
- package/repos/effect/packages/effect/src/unstable/eventlog/SqlEventLogServerEncrypted.ts +343 -0
- package/repos/effect/packages/effect/src/unstable/eventlog/SqlEventLogServerUnencrypted.ts +527 -0
- package/repos/effect/packages/effect/src/unstable/eventlog/index.ts +75 -0
- package/repos/effect/packages/effect/src/unstable/eventlog/internal/identityRootSecretDerivation.ts +153 -0
- package/repos/effect/packages/effect/src/unstable/http/Cookies.ts +952 -0
- package/repos/effect/packages/effect/src/unstable/http/Etag.ts +141 -0
- package/repos/effect/packages/effect/src/unstable/http/FetchHttpClient.ts +123 -0
- package/repos/effect/packages/effect/src/unstable/http/FindMyWay.ts +15 -0
- package/repos/effect/packages/effect/src/unstable/http/Headers.ts +438 -0
- package/repos/effect/packages/effect/src/unstable/http/HttpBody.ts +545 -0
- package/repos/effect/packages/effect/src/unstable/http/HttpClient.ts +1630 -0
- package/repos/effect/packages/effect/src/unstable/http/HttpClientError.ts +328 -0
- package/repos/effect/packages/effect/src/unstable/http/HttpClientRequest.ts +968 -0
- package/repos/effect/packages/effect/src/unstable/http/HttpClientResponse.ts +408 -0
- package/repos/effect/packages/effect/src/unstable/http/HttpEffect.ts +400 -0
- package/repos/effect/packages/effect/src/unstable/http/HttpIncomingMessage.ts +153 -0
- package/repos/effect/packages/effect/src/unstable/http/HttpMethod.ts +124 -0
- package/repos/effect/packages/effect/src/unstable/http/HttpMiddleware.ts +394 -0
- package/repos/effect/packages/effect/src/unstable/http/HttpPlatform.ts +165 -0
- package/repos/effect/packages/effect/src/unstable/http/HttpRouter.ts +1341 -0
- package/repos/effect/packages/effect/src/unstable/http/HttpServer.ts +329 -0
- package/repos/effect/packages/effect/src/unstable/http/HttpServerError.ts +374 -0
- package/repos/effect/packages/effect/src/unstable/http/HttpServerRequest.ts +1081 -0
- package/repos/effect/packages/effect/src/unstable/http/HttpServerRespondable.ts +115 -0
- package/repos/effect/packages/effect/src/unstable/http/HttpServerResponse.ts +1381 -0
- package/repos/effect/packages/effect/src/unstable/http/HttpStaticServer.ts +464 -0
- package/repos/effect/packages/effect/src/unstable/http/HttpTraceContext.ts +160 -0
- package/repos/effect/packages/effect/src/unstable/http/Multipart.ts +830 -0
- package/repos/effect/packages/effect/src/unstable/http/Multipasta/HeadersParser.ts +14 -0
- package/repos/effect/packages/effect/src/unstable/http/Multipasta/Node.ts +14 -0
- package/repos/effect/packages/effect/src/unstable/http/Multipasta/Search.ts +14 -0
- package/repos/effect/packages/effect/src/unstable/http/Multipasta/Web.ts +14 -0
- package/repos/effect/packages/effect/src/unstable/http/Multipasta.ts +15 -0
- package/repos/effect/packages/effect/src/unstable/http/Template.ts +262 -0
- package/repos/effect/packages/effect/src/unstable/http/Url.ts +330 -0
- package/repos/effect/packages/effect/src/unstable/http/UrlParams.ts +678 -0
- package/repos/effect/packages/effect/src/unstable/http/index.ts +145 -0
- package/repos/effect/packages/effect/src/unstable/http/internal/preResponseHandler.ts +15 -0
- package/repos/effect/packages/effect/src/unstable/httpapi/HttpApi.ts +316 -0
- package/repos/effect/packages/effect/src/unstable/httpapi/HttpApiBuilder.ts +1015 -0
- package/repos/effect/packages/effect/src/unstable/httpapi/HttpApiClient.ts +1005 -0
- package/repos/effect/packages/effect/src/unstable/httpapi/HttpApiEndpoint.ts +1545 -0
- package/repos/effect/packages/effect/src/unstable/httpapi/HttpApiError.ts +443 -0
- package/repos/effect/packages/effect/src/unstable/httpapi/HttpApiGroup.ts +381 -0
- package/repos/effect/packages/effect/src/unstable/httpapi/HttpApiMiddleware.ts +478 -0
- package/repos/effect/packages/effect/src/unstable/httpapi/HttpApiScalar.ts +267 -0
- package/repos/effect/packages/effect/src/unstable/httpapi/HttpApiSchema.ts +733 -0
- package/repos/effect/packages/effect/src/unstable/httpapi/HttpApiSecurity.ts +244 -0
- package/repos/effect/packages/effect/src/unstable/httpapi/HttpApiSwagger.ts +68 -0
- package/repos/effect/packages/effect/src/unstable/httpapi/HttpApiTest.ts +112 -0
- package/repos/effect/packages/effect/src/unstable/httpapi/OpenApi.ts +1098 -0
- package/repos/effect/packages/effect/src/unstable/httpapi/index.ts +70 -0
- package/repos/effect/packages/effect/src/unstable/httpapi/internal/html.ts +18 -0
- package/repos/effect/packages/effect/src/unstable/httpapi/internal/httpApiScalar.ts +5 -0
- package/repos/effect/packages/effect/src/unstable/httpapi/internal/httpApiSwagger.ts +9 -0
- package/repos/effect/packages/effect/src/unstable/observability/Otlp.ts +172 -0
- package/repos/effect/packages/effect/src/unstable/observability/OtlpExporter.ts +149 -0
- package/repos/effect/packages/effect/src/unstable/observability/OtlpLogger.ts +340 -0
- package/repos/effect/packages/effect/src/unstable/observability/OtlpMetrics.ts +826 -0
- package/repos/effect/packages/effect/src/unstable/observability/OtlpResource.ts +288 -0
- package/repos/effect/packages/effect/src/unstable/observability/OtlpSerialization.ts +66 -0
- package/repos/effect/packages/effect/src/unstable/observability/OtlpTracer.ts +442 -0
- package/repos/effect/packages/effect/src/unstable/observability/PrometheusMetrics.ts +468 -0
- package/repos/effect/packages/effect/src/unstable/observability/index.ts +45 -0
- package/repos/effect/packages/effect/src/unstable/observability/internal/otlpEnv.ts +39 -0
- package/repos/effect/packages/effect/src/unstable/observability/internal/otlpProtobuf.ts +779 -0
- package/repos/effect/packages/effect/src/unstable/observability/internal/protobuf.ts +262 -0
- package/repos/effect/packages/effect/src/unstable/persistence/KeyValueStore.ts +864 -0
- package/repos/effect/packages/effect/src/unstable/persistence/Persistable.ts +252 -0
- package/repos/effect/packages/effect/src/unstable/persistence/PersistedCache.ts +111 -0
- package/repos/effect/packages/effect/src/unstable/persistence/PersistedQueue.ts +1196 -0
- package/repos/effect/packages/effect/src/unstable/persistence/Persistence.ts +1071 -0
- package/repos/effect/packages/effect/src/unstable/persistence/RateLimiter.ts +748 -0
- package/repos/effect/packages/effect/src/unstable/persistence/Redis.ts +188 -0
- package/repos/effect/packages/effect/src/unstable/persistence/index.ts +40 -0
- package/repos/effect/packages/effect/src/unstable/process/ChildProcess.ts +1036 -0
- package/repos/effect/packages/effect/src/unstable/process/ChildProcessSpawner.ts +285 -0
- package/repos/effect/packages/effect/src/unstable/process/index.ts +15 -0
- package/repos/effect/packages/effect/src/unstable/reactivity/AsyncResult.ts +1081 -0
- package/repos/effect/packages/effect/src/unstable/reactivity/Atom.ts +2520 -0
- package/repos/effect/packages/effect/src/unstable/reactivity/AtomHttpApi.ts +352 -0
- package/repos/effect/packages/effect/src/unstable/reactivity/AtomRef.ts +352 -0
- package/repos/effect/packages/effect/src/unstable/reactivity/AtomRegistry.ts +1127 -0
- package/repos/effect/packages/effect/src/unstable/reactivity/AtomRpc.ts +305 -0
- package/repos/effect/packages/effect/src/unstable/reactivity/Hydration.ts +155 -0
- package/repos/effect/packages/effect/src/unstable/reactivity/Reactivity.ts +348 -0
- package/repos/effect/packages/effect/src/unstable/reactivity/index.ts +45 -0
- package/repos/effect/packages/effect/src/unstable/rpc/Rpc.ts +1255 -0
- package/repos/effect/packages/effect/src/unstable/rpc/RpcClient.ts +1370 -0
- package/repos/effect/packages/effect/src/unstable/rpc/RpcClientError.ts +57 -0
- package/repos/effect/packages/effect/src/unstable/rpc/RpcGroup.ts +409 -0
- package/repos/effect/packages/effect/src/unstable/rpc/RpcMessage.ts +402 -0
- package/repos/effect/packages/effect/src/unstable/rpc/RpcMiddleware.ts +344 -0
- package/repos/effect/packages/effect/src/unstable/rpc/RpcSchema.ts +97 -0
- package/repos/effect/packages/effect/src/unstable/rpc/RpcSerialization.ts +546 -0
- package/repos/effect/packages/effect/src/unstable/rpc/RpcServer.ts +1492 -0
- package/repos/effect/packages/effect/src/unstable/rpc/RpcTest.ts +56 -0
- package/repos/effect/packages/effect/src/unstable/rpc/RpcWorker.ts +118 -0
- package/repos/effect/packages/effect/src/unstable/rpc/Utils.ts +120 -0
- package/repos/effect/packages/effect/src/unstable/rpc/index.ts +65 -0
- package/repos/effect/packages/effect/src/unstable/schema/Model.ts +862 -0
- package/repos/effect/packages/effect/src/unstable/schema/VariantSchema.ts +604 -0
- package/repos/effect/packages/effect/src/unstable/schema/index.ts +15 -0
- package/repos/effect/packages/effect/src/unstable/socket/Socket.ts +911 -0
- package/repos/effect/packages/effect/src/unstable/socket/SocketServer.ts +147 -0
- package/repos/effect/packages/effect/src/unstable/socket/index.ts +15 -0
- package/repos/effect/packages/effect/src/unstable/sql/Migrator.ts +440 -0
- package/repos/effect/packages/effect/src/unstable/sql/SqlClient.ts +342 -0
- package/repos/effect/packages/effect/src/unstable/sql/SqlConnection.ts +83 -0
- package/repos/effect/packages/effect/src/unstable/sql/SqlError.ts +590 -0
- package/repos/effect/packages/effect/src/unstable/sql/SqlModel.ts +359 -0
- package/repos/effect/packages/effect/src/unstable/sql/SqlResolver.ts +380 -0
- package/repos/effect/packages/effect/src/unstable/sql/SqlSchema.ts +172 -0
- package/repos/effect/packages/effect/src/unstable/sql/SqlStream.ts +81 -0
- package/repos/effect/packages/effect/src/unstable/sql/Statement.ts +1500 -0
- package/repos/effect/packages/effect/src/unstable/sql/index.ts +50 -0
- package/repos/effect/packages/effect/src/unstable/workers/Transferable.ts +191 -0
- package/repos/effect/packages/effect/src/unstable/workers/Worker.ts +245 -0
- package/repos/effect/packages/effect/src/unstable/workers/WorkerError.ts +148 -0
- package/repos/effect/packages/effect/src/unstable/workers/WorkerRunner.ts +57 -0
- package/repos/effect/packages/effect/src/unstable/workers/index.ts +25 -0
- package/repos/effect/packages/effect/src/unstable/workflow/Activity.ts +322 -0
- package/repos/effect/packages/effect/src/unstable/workflow/DurableClock.ts +117 -0
- package/repos/effect/packages/effect/src/unstable/workflow/DurableDeferred.ts +653 -0
- package/repos/effect/packages/effect/src/unstable/workflow/DurableQueue.ts +360 -0
- package/repos/effect/packages/effect/src/unstable/workflow/Workflow.ts +898 -0
- package/repos/effect/packages/effect/src/unstable/workflow/WorkflowEngine.ts +759 -0
- package/repos/effect/packages/effect/src/unstable/workflow/WorkflowProxy.ts +212 -0
- package/repos/effect/packages/effect/src/unstable/workflow/WorkflowProxyServer.ts +151 -0
- package/repos/effect/packages/effect/src/unstable/workflow/index.ts +45 -0
- package/repos/effect/packages/effect/src/unstable/workflow/internal/crypto.ts +15 -0
- package/repos/effect/packages/effect/test/Array.test.ts +1579 -0
- package/repos/effect/packages/effect/test/AtomRef.test.ts +27 -0
- package/repos/effect/packages/effect/test/BigDecimal.test.ts +525 -0
- package/repos/effect/packages/effect/test/BigInt.test.ts +57 -0
- package/repos/effect/packages/effect/test/Boolean.test.ts +289 -0
- package/repos/effect/packages/effect/test/Brand.test.ts +160 -0
- package/repos/effect/packages/effect/test/Cache.test.ts +1423 -0
- package/repos/effect/packages/effect/test/Cause.test.ts +834 -0
- package/repos/effect/packages/effect/test/Channel.test.ts +556 -0
- package/repos/effect/packages/effect/test/Chunk.test.ts +874 -0
- package/repos/effect/packages/effect/test/Combiner.test.ts +42 -0
- package/repos/effect/packages/effect/test/Config.test.ts +1416 -0
- package/repos/effect/packages/effect/test/ConfigProvider.test.ts +726 -0
- package/repos/effect/packages/effect/test/Cron.test.ts +401 -0
- package/repos/effect/packages/effect/test/Crypto.test.ts +86 -0
- package/repos/effect/packages/effect/test/Data.test.ts +269 -0
- package/repos/effect/packages/effect/test/DateTime.test.ts +953 -0
- package/repos/effect/packages/effect/test/Deferred.test.ts +165 -0
- package/repos/effect/packages/effect/test/Duration.test.ts +679 -0
- package/repos/effect/packages/effect/test/Effect.test.ts +2658 -0
- package/repos/effect/packages/effect/test/EffectEager.test.ts +678 -0
- package/repos/effect/packages/effect/test/EffectKeepAlive.test.ts +71 -0
- package/repos/effect/packages/effect/test/Equal.test.ts +1278 -0
- package/repos/effect/packages/effect/test/Equivalence.test.ts +170 -0
- package/repos/effect/packages/effect/test/ExecutionPlan.test.ts +117 -0
- package/repos/effect/packages/effect/test/Exit.test.ts +12 -0
- package/repos/effect/packages/effect/test/Fiber.test.ts +9 -0
- package/repos/effect/packages/effect/test/FiberHandle.test.ts +146 -0
- package/repos/effect/packages/effect/test/FiberMap.test.ts +171 -0
- package/repos/effect/packages/effect/test/FiberSet.test.ts +119 -0
- package/repos/effect/packages/effect/test/Formatter.test.ts +247 -0
- package/repos/effect/packages/effect/test/Function.test.ts +333 -0
- package/repos/effect/packages/effect/test/Graph.test.ts +3505 -0
- package/repos/effect/packages/effect/test/HashMap.test.ts +618 -0
- package/repos/effect/packages/effect/test/HashSet.test.ts +298 -0
- package/repos/effect/packages/effect/test/HttpClient.test.ts +131 -0
- package/repos/effect/packages/effect/test/Iterable.test.ts +486 -0
- package/repos/effect/packages/effect/test/JsonPatch.test.ts +948 -0
- package/repos/effect/packages/effect/test/JsonPointer.test.ts +353 -0
- package/repos/effect/packages/effect/test/JsonSchema.test.ts +1253 -0
- package/repos/effect/packages/effect/test/Latch.test.ts +21 -0
- package/repos/effect/packages/effect/test/Layer.test.ts +648 -0
- package/repos/effect/packages/effect/test/LayerMap.test.ts +98 -0
- package/repos/effect/packages/effect/test/LogLevel.test.ts +28 -0
- package/repos/effect/packages/effect/test/Logger.test.ts +154 -0
- package/repos/effect/packages/effect/test/ManagedRuntime.test.ts +58 -0
- package/repos/effect/packages/effect/test/Match.test.ts +27 -0
- package/repos/effect/packages/effect/test/Metric.test.ts +682 -0
- package/repos/effect/packages/effect/test/Migrator.test.ts +69 -0
- package/repos/effect/packages/effect/test/MutableHashMap.test.ts +309 -0
- package/repos/effect/packages/effect/test/MutableHashSet.test.ts +10 -0
- package/repos/effect/packages/effect/test/MutableList.test.ts +58 -0
- package/repos/effect/packages/effect/test/Newtype.test.ts +90 -0
- package/repos/effect/packages/effect/test/Number.test.ts +422 -0
- package/repos/effect/packages/effect/test/Optic.test.ts +452 -0
- package/repos/effect/packages/effect/test/Option.test.ts +564 -0
- package/repos/effect/packages/effect/test/Order.test.ts +163 -0
- package/repos/effect/packages/effect/test/Ordering.test.ts +18 -0
- package/repos/effect/packages/effect/test/PartitionedSemaphore.test.ts +74 -0
- package/repos/effect/packages/effect/test/Pathfinding.test.ts +426 -0
- package/repos/effect/packages/effect/test/Pool.test.ts +422 -0
- package/repos/effect/packages/effect/test/Predicate.test.ts +555 -0
- package/repos/effect/packages/effect/test/PubSub.test.ts +538 -0
- package/repos/effect/packages/effect/test/Queue.test.ts +317 -0
- package/repos/effect/packages/effect/test/Random.test.ts +238 -0
- package/repos/effect/packages/effect/test/RcMap.test.ts +237 -0
- package/repos/effect/packages/effect/test/RcRef.test.ts +97 -0
- package/repos/effect/packages/effect/test/Record.test.ts +395 -0
- package/repos/effect/packages/effect/test/Redacted.test.ts +59 -0
- package/repos/effect/packages/effect/test/Reducer.test.ts +12 -0
- package/repos/effect/packages/effect/test/Ref.test.ts +187 -0
- package/repos/effect/packages/effect/test/Request.test.ts +305 -0
- package/repos/effect/packages/effect/test/Resource.test.ts +59 -0
- package/repos/effect/packages/effect/test/Result.test.ts +517 -0
- package/repos/effect/packages/effect/test/Schedule.test.ts +395 -0
- package/repos/effect/packages/effect/test/Scheduler.test.ts +70 -0
- package/repos/effect/packages/effect/test/Scope.test.ts +19 -0
- package/repos/effect/packages/effect/test/ScopedCache.test.ts +2316 -0
- package/repos/effect/packages/effect/test/ScopedRef.test.ts +80 -0
- package/repos/effect/packages/effect/test/Semaphore.test.ts +469 -0
- package/repos/effect/packages/effect/test/Sink.test.ts +230 -0
- package/repos/effect/packages/effect/test/Stream.test.ts +4712 -0
- package/repos/effect/packages/effect/test/String.test.ts +690 -0
- package/repos/effect/packages/effect/test/Struct.test.ts +216 -0
- package/repos/effect/packages/effect/test/SubscriptionRef.test.ts +90 -0
- package/repos/effect/packages/effect/test/Symbol.test.ts +50 -0
- package/repos/effect/packages/effect/test/SynchronizedRef.test.ts +105 -0
- package/repos/effect/packages/effect/test/TestClock.test.ts +71 -0
- package/repos/effect/packages/effect/test/Tracer.test.ts +410 -0
- package/repos/effect/packages/effect/test/Trie.test.ts +531 -0
- package/repos/effect/packages/effect/test/Tuple.test.ts +127 -0
- package/repos/effect/packages/effect/test/TxChunk.test.ts +342 -0
- package/repos/effect/packages/effect/test/TxDeferred.test.ts +197 -0
- package/repos/effect/packages/effect/test/TxHashMap.test.ts +963 -0
- package/repos/effect/packages/effect/test/TxHashSet.test.ts +442 -0
- package/repos/effect/packages/effect/test/TxPriorityQueue.test.ts +187 -0
- package/repos/effect/packages/effect/test/TxPubSub.test.ts +391 -0
- package/repos/effect/packages/effect/test/TxQueue.test.ts +1260 -0
- package/repos/effect/packages/effect/test/TxReentrantLock.test.ts +413 -0
- package/repos/effect/packages/effect/test/TxSemaphore.test.ts +283 -0
- package/repos/effect/packages/effect/test/TxSubscriptionRef.test.ts +197 -0
- package/repos/effect/packages/effect/test/UndefinedOr.test.ts +65 -0
- package/repos/effect/packages/effect/test/cluster/ClusterWorkflowEngine.test.ts +652 -0
- package/repos/effect/packages/effect/test/cluster/Entity.test.ts +81 -0
- package/repos/effect/packages/effect/test/cluster/K8sHttpClient.test.ts +34 -0
- package/repos/effect/packages/effect/test/cluster/MessageStorage.test.ts +196 -0
- package/repos/effect/packages/effect/test/cluster/Sharding.test.ts +578 -0
- package/repos/effect/packages/effect/test/cluster/TestEntity.ts +132 -0
- package/repos/effect/packages/effect/test/reactivity/AsyncResult.test.ts +41 -0
- package/repos/effect/packages/effect/test/reactivity/Atom.test.ts +2551 -0
- package/repos/effect/packages/effect/test/reactivity/AtomHttpApi.test.ts +86 -0
- package/repos/effect/packages/effect/test/reactivity/AtomRpc.test.ts +70 -0
- package/repos/effect/packages/effect/test/rpc/Rpc.test.ts +73 -0
- package/repos/effect/packages/effect/test/rpc/RpcClient.test.ts +58 -0
- package/repos/effect/packages/effect/test/rpc/RpcSerialization.test.ts +171 -0
- package/repos/effect/packages/effect/test/schema/HMR.test.ts +72 -0
- package/repos/effect/packages/effect/test/schema/Schema.test.ts +9133 -0
- package/repos/effect/packages/effect/test/schema/SchemaAST.test.ts +280 -0
- package/repos/effect/packages/effect/test/schema/SchemaGetter.test.ts +383 -0
- package/repos/effect/packages/effect/test/schema/SchemaIssue.test.ts +9 -0
- package/repos/effect/packages/effect/test/schema/SchemaParser.test.ts +323 -0
- package/repos/effect/packages/effect/test/schema/fixtures/HMR-Class.ts +5 -0
- package/repos/effect/packages/effect/test/schema/fixtures/HMR-sanity-check.ts +3 -0
- package/repos/effect/packages/effect/test/schema/representation/fromASTs.test.ts +820 -0
- package/repos/effect/packages/effect/test/schema/representation/fromJsonSchemaDocument.test.ts +2137 -0
- package/repos/effect/packages/effect/test/schema/representation/toCodeDocument.test.ts +2089 -0
- package/repos/effect/packages/effect/test/schema/representation/toJsonSchemaMultiDocument.test.ts +39 -0
- package/repos/effect/packages/effect/test/schema/representation/toSchema.test.ts +506 -0
- package/repos/effect/packages/effect/test/schema/toArbitrary.test.ts +1693 -0
- package/repos/effect/packages/effect/test/schema/toCodec.test.ts +3149 -0
- package/repos/effect/packages/effect/test/schema/toDifferJsonPatch.test.ts +239 -0
- package/repos/effect/packages/effect/test/schema/toEquivalence.test.ts +519 -0
- package/repos/effect/packages/effect/test/schema/toFormatter.test.ts +565 -0
- package/repos/effect/packages/effect/test/schema/toIso.test.ts +394 -0
- package/repos/effect/packages/effect/test/schema/toJsonSchemaDocument.test.ts +3630 -0
- package/repos/effect/packages/effect/test/schema/toStandardJSONSchemaV1.test.ts +126 -0
- package/repos/effect/packages/effect/test/schema/toStandardSchemaV1.test.ts +495 -0
- package/repos/effect/packages/effect/test/schema/v3-v4.test.ts +250 -0
- package/repos/effect/packages/effect/test/testing/TestSchema.test.ts +78 -0
- package/repos/effect/packages/effect/test/unstable/ai/AiError.test.ts +823 -0
- package/repos/effect/packages/effect/test/unstable/ai/AnthropicStructuredOutput.test.ts +593 -0
- package/repos/effect/packages/effect/test/unstable/ai/Chat.test.ts +147 -0
- package/repos/effect/packages/effect/test/unstable/ai/EmbeddingModel.test.ts +185 -0
- package/repos/effect/packages/effect/test/unstable/ai/LanguageModel.test.ts +1714 -0
- package/repos/effect/packages/effect/test/unstable/ai/LanguageModelTrackerLifecycle.test.ts +413 -0
- package/repos/effect/packages/effect/test/unstable/ai/McpServer.test.ts +82 -0
- package/repos/effect/packages/effect/test/unstable/ai/Model.test.ts +16 -0
- package/repos/effect/packages/effect/test/unstable/ai/OpenAiStructuredOutput.test.ts +723 -0
- package/repos/effect/packages/effect/test/unstable/ai/Prompt.test.ts +346 -0
- package/repos/effect/packages/effect/test/unstable/ai/ResponseIdTracker.test.ts +424 -0
- package/repos/effect/packages/effect/test/unstable/ai/Tool.test.ts +1264 -0
- package/repos/effect/packages/effect/test/unstable/ai/utils.ts +68 -0
- package/repos/effect/packages/effect/test/unstable/cli/Arguments.test.ts +390 -0
- package/repos/effect/packages/effect/test/unstable/cli/Command.test.ts +1801 -0
- package/repos/effect/packages/effect/test/unstable/cli/Errors.test.ts +150 -0
- package/repos/effect/packages/effect/test/unstable/cli/Help.test.ts +572 -0
- package/repos/effect/packages/effect/test/unstable/cli/LogLevel.test.ts +202 -0
- package/repos/effect/packages/effect/test/unstable/cli/Param.test.ts +391 -0
- package/repos/effect/packages/effect/test/unstable/cli/Primitive.test.ts +321 -0
- package/repos/effect/packages/effect/test/unstable/cli/Prompt.test.ts +597 -0
- package/repos/effect/packages/effect/test/unstable/cli/completions/completions.test.ts +656 -0
- package/repos/effect/packages/effect/test/unstable/cli/completions/descriptor.test.ts +245 -0
- package/repos/effect/packages/effect/test/unstable/cli/fixtures/ComprehensiveCli.ts +422 -0
- package/repos/effect/packages/effect/test/unstable/cli/services/MockTerminal.ts +135 -0
- package/repos/effect/packages/effect/test/unstable/cli/services/TestActions.ts +36 -0
- package/repos/effect/packages/effect/test/unstable/encoding/Ndjson.test.ts +18 -0
- package/repos/effect/packages/effect/test/unstable/encoding/Sse.test.ts +62 -0
- package/repos/effect/packages/effect/test/unstable/eventlog/EventJournal.test.ts +25 -0
- package/repos/effect/packages/effect/test/unstable/eventlog/EventLog.test.ts +104 -0
- package/repos/effect/packages/effect/test/unstable/eventlog/EventLogIdentityDerivation.test.ts +85 -0
- package/repos/effect/packages/effect/test/unstable/eventlog/EventLogRemote.test.ts +176 -0
- package/repos/effect/packages/effect/test/unstable/eventlog/EventLogSessionAuth.test.ts +130 -0
- package/repos/effect/packages/effect/test/unstable/eventlog/SqlEventLogServerUnencryptedStorageTest.ts +169 -0
- package/repos/effect/packages/effect/test/unstable/http/Cookies.test.ts +80 -0
- package/repos/effect/packages/effect/test/unstable/http/Headers.test.ts +73 -0
- package/repos/effect/packages/effect/test/unstable/http/HttpClient.test.ts +306 -0
- package/repos/effect/packages/effect/test/unstable/http/HttpClientRequest.test.ts +164 -0
- package/repos/effect/packages/effect/test/unstable/http/HttpEffect.test.ts +254 -0
- package/repos/effect/packages/effect/test/unstable/http/HttpMiddleware.test.ts +57 -0
- package/repos/effect/packages/effect/test/unstable/http/HttpServerError.test.ts +121 -0
- package/repos/effect/packages/effect/test/unstable/http/HttpServerRequest.test.ts +157 -0
- package/repos/effect/packages/effect/test/unstable/http/HttpServerResponse.test.ts +76 -0
- package/repos/effect/packages/effect/test/unstable/http/Multipart.test.ts +69 -0
- package/repos/effect/packages/effect/test/unstable/http/Url.test.ts +98 -0
- package/repos/effect/packages/effect/test/unstable/http/UrlParams.test.ts +30 -0
- package/repos/effect/packages/effect/test/unstable/httpapi/HttpApiBuilder.test.ts +186 -0
- package/repos/effect/packages/effect/test/unstable/httpapi/HttpApiClient.test.ts +446 -0
- package/repos/effect/packages/effect/test/unstable/httpapi/HttpApiEndpoint.test.ts +160 -0
- package/repos/effect/packages/effect/test/unstable/httpapi/HttpApiSchema.test.ts +108 -0
- package/repos/effect/packages/effect/test/unstable/httpapi/HttpApiSecurity.test.ts +41 -0
- package/repos/effect/packages/effect/test/unstable/httpapi/OpenApi.test.ts +39 -0
- package/repos/effect/packages/effect/test/unstable/observability/OtlpConfig.test.ts +151 -0
- package/repos/effect/packages/effect/test/unstable/observability/OtlpExporter.test.ts +108 -0
- package/repos/effect/packages/effect/test/unstable/observability/OtlpMetrics.test.ts +518 -0
- package/repos/effect/packages/effect/test/unstable/observability/OtlpResource.test.ts +84 -0
- package/repos/effect/packages/effect/test/unstable/observability/PrometheusMetrics.test.ts +417 -0
- package/repos/effect/packages/effect/test/unstable/persistence/KeyValueStore.test.ts +164 -0
- package/repos/effect/packages/effect/test/unstable/persistence/KeyValueStoreTest.ts +85 -0
- package/repos/effect/packages/effect/test/unstable/persistence/PersistedCache.test.ts +4 -0
- package/repos/effect/packages/effect/test/unstable/persistence/PersistedCacheTest.ts +111 -0
- package/repos/effect/packages/effect/test/unstable/persistence/PersistedQueue.test.ts +4 -0
- package/repos/effect/packages/effect/test/unstable/persistence/PersistedQueueTest.ts +106 -0
- package/repos/effect/packages/effect/test/unstable/persistence/RateLimiter.test.ts +145 -0
- package/repos/effect/packages/effect/test/unstable/persistence/Redis.test.ts +43 -0
- package/repos/effect/packages/effect/test/unstable/process/ChildProcess.test.ts +352 -0
- package/repos/effect/packages/effect/test/unstable/schema/VariantSchema.test.ts +72 -0
- package/repos/effect/packages/effect/test/unstable/sql/SqlError.test.ts +228 -0
- package/repos/effect/packages/effect/test/unstable/sql/SqlSchema.test.ts +168 -0
- package/repos/effect/packages/effect/test/unstable/workers/WorkerError.test.ts +90 -0
- package/repos/effect/packages/effect/test/unstable/workflow/DurableQueue.test.ts +105 -0
- package/repos/effect/packages/effect/test/unstable/workflow/WorkflowEngine.test.ts +60 -0
- package/repos/effect/packages/effect/test/utils/assert.ts +182 -0
- package/repos/effect/packages/effect/test/utils/chunkCoordination.ts +36 -0
- package/repos/effect/packages/effect/test/utils/counter.ts +54 -0
- package/repos/effect/packages/effect/tsconfig.json +8 -0
- package/repos/effect/packages/effect/typetest/AiError.tst.ts +49 -0
- package/repos/effect/packages/effect/typetest/Array.tst.ts +1289 -0
- package/repos/effect/packages/effect/typetest/Brand.tst.ts +51 -0
- package/repos/effect/packages/effect/typetest/Channel.tst.ts +112 -0
- package/repos/effect/packages/effect/typetest/Config.tst.ts +31 -0
- package/repos/effect/packages/effect/typetest/Data.tst.ts +121 -0
- package/repos/effect/packages/effect/typetest/Effect.tst.ts +976 -0
- package/repos/effect/packages/effect/typetest/Equivalence.tst.ts +19 -0
- package/repos/effect/packages/effect/typetest/Newtype.tst.ts +72 -0
- package/repos/effect/packages/effect/typetest/Optic.tst.ts +130 -0
- package/repos/effect/packages/effect/typetest/Option.tst.ts +72 -0
- package/repos/effect/packages/effect/typetest/Order.tst.ts +19 -0
- package/repos/effect/packages/effect/typetest/Predicate.tst.ts +251 -0
- package/repos/effect/packages/effect/typetest/Result.tst.ts +353 -0
- package/repos/effect/packages/effect/typetest/Schedule.tst.ts +21 -0
- package/repos/effect/packages/effect/typetest/Stream.tst.ts +197 -0
- package/repos/effect/packages/effect/typetest/Struct.tst.ts +422 -0
- package/repos/effect/packages/effect/typetest/Tuple.tst.ts +177 -0
- package/repos/effect/packages/effect/typetest/Types.tst.ts +364 -0
- package/repos/effect/packages/effect/typetest/VariantSchema.tst.ts +76 -0
- package/repos/effect/packages/effect/typetest/schema/Array.tst.ts +46 -0
- package/repos/effect/packages/effect/typetest/schema/Literals.tst.ts +58 -0
- package/repos/effect/packages/effect/typetest/schema/Record.tst.ts +145 -0
- package/repos/effect/packages/effect/typetest/schema/Schema.tst.ts +1854 -0
- package/repos/effect/packages/effect/typetest/schema/Struct.tst.ts +745 -0
- package/repos/effect/packages/effect/typetest/schema/Tuple.tst.ts +199 -0
- package/repos/effect/packages/effect/typetest/schema/Union.tst.ts +198 -0
- package/repos/effect/packages/effect/typetest/schema/api.tst.ts +276 -0
- package/repos/effect/packages/effect/typetest/schema/toArbitrary.tst.ts +65 -0
- package/repos/effect/packages/effect/typetest/schema/toIso.tst.ts +282 -0
- package/repos/effect/packages/effect/typetest/unstable/ai/LanguageModel.tst.ts +191 -0
- package/repos/effect/packages/effect/typetest/unstable/ai/Tool.tst.ts +33 -0
- package/repos/effect/packages/effect/typetest/unstable/cli/Command.tst.ts +124 -0
- package/repos/effect/packages/effect/typetest/unstable/cli/Param.tst.ts +20 -0
- package/repos/effect/packages/effect/typetest/unstable/cli/Prompt.tst.ts +97 -0
- package/repos/effect/packages/effect/typetest/unstable/encoding/Ndjson.tst.ts +24 -0
- package/repos/effect/packages/effect/typetest/unstable/http/HttpClient.tst.ts +143 -0
- package/repos/effect/packages/effect/typetest/unstable/httpapi/HttpApiBuilder.tst.ts +98 -0
- package/repos/effect/packages/effect/typetest/unstable/httpapi/HttpApiClient.tst.ts +677 -0
- package/repos/effect/packages/effect/typetest/unstable/httpapi/HttpApiEndpoint.tst.ts +466 -0
- package/repos/effect/packages/effect/typetest/unstable/httpapi/HttpApiMiddleware.tst.ts +90 -0
- package/repos/effect/packages/effect/typetest/unstable/httpapi/HttpApiSchema.tst.ts +135 -0
- package/repos/effect/packages/effect/typetest/unstable/reactivity/AsyncResult.tst.ts +65 -0
- package/repos/effect/packages/effect/typetest/unstable/reactivity/AtomHttpApi.tst.ts +63 -0
- package/repos/effect/packages/effect/typetest/unstable/rpc/Rpc.tst.ts +74 -0
- package/repos/effect/packages/effect/typetest/unstable/rpc/RpcGroup.tst.ts +61 -0
- package/repos/effect/packages/effect/typetest/unstable/rpc/RpcMiddleware.tst.ts +41 -0
- package/repos/effect/packages/effect/typetest/unstable/rpc/RpcServer.tst.ts +26 -0
- package/repos/effect/packages/effect/typetest/unstable/sql/SqlSchema.tst.ts +75 -0
- package/repos/effect/packages/effect/typetest/unstable/workflow/Workflow.tst.ts +16 -0
- package/repos/effect/packages/effect/vitest.config.ts +11 -0
- package/repos/effect/packages/opentelemetry/CHANGELOG.md +620 -0
- package/repos/effect/packages/opentelemetry/LICENSE +21 -0
- package/repos/effect/packages/opentelemetry/README.md +5 -0
- package/repos/effect/packages/opentelemetry/docgen.json +30 -0
- package/repos/effect/packages/opentelemetry/package.json +126 -0
- package/repos/effect/packages/opentelemetry/src/Logger.ts +193 -0
- package/repos/effect/packages/opentelemetry/src/Metrics.ts +138 -0
- package/repos/effect/packages/opentelemetry/src/NodeSdk.ts +162 -0
- package/repos/effect/packages/opentelemetry/src/Resource.ts +147 -0
- package/repos/effect/packages/opentelemetry/src/Tracer.ts +594 -0
- package/repos/effect/packages/opentelemetry/src/WebSdk.ts +140 -0
- package/repos/effect/packages/opentelemetry/src/index.ts +35 -0
- package/repos/effect/packages/opentelemetry/src/internal/attributes.ts +28 -0
- package/repos/effect/packages/opentelemetry/src/internal/metrics.ts +463 -0
- package/repos/effect/packages/opentelemetry/src/internal/utilities.ts +5 -0
- package/repos/effect/packages/opentelemetry/test/Logger.test.ts +122 -0
- package/repos/effect/packages/opentelemetry/test/Metrics.test.ts +339 -0
- package/repos/effect/packages/opentelemetry/test/Tracer.test.ts +167 -0
- package/repos/effect/packages/opentelemetry/tsconfig.json +8 -0
- package/repos/effect/packages/opentelemetry/vitest.config.ts +6 -0
- package/repos/effect/packages/platform-browser/CHANGELOG.md +637 -0
- package/repos/effect/packages/platform-browser/LICENSE +21 -0
- package/repos/effect/packages/platform-browser/README.md +1 -0
- package/repos/effect/packages/platform-browser/docgen.json +21 -0
- package/repos/effect/packages/platform-browser/package.json +74 -0
- package/repos/effect/packages/platform-browser/src/BrowserCrypto.ts +97 -0
- package/repos/effect/packages/platform-browser/src/BrowserHttpClient.ts +430 -0
- package/repos/effect/packages/platform-browser/src/BrowserKeyValueStore.ts +177 -0
- package/repos/effect/packages/platform-browser/src/BrowserPersistence.ts +334 -0
- package/repos/effect/packages/platform-browser/src/BrowserRuntime.ts +53 -0
- package/repos/effect/packages/platform-browser/src/BrowserSocket.ts +52 -0
- package/repos/effect/packages/platform-browser/src/BrowserStream.ts +56 -0
- package/repos/effect/packages/platform-browser/src/BrowserWorker.ts +98 -0
- package/repos/effect/packages/platform-browser/src/BrowserWorkerRunner.ts +199 -0
- package/repos/effect/packages/platform-browser/src/Clipboard.ts +143 -0
- package/repos/effect/packages/platform-browser/src/Geolocation.ts +233 -0
- package/repos/effect/packages/platform-browser/src/IndexedDb.ts +113 -0
- package/repos/effect/packages/platform-browser/src/IndexedDbDatabase.ts +648 -0
- package/repos/effect/packages/platform-browser/src/IndexedDbQueryBuilder.ts +2032 -0
- package/repos/effect/packages/platform-browser/src/IndexedDbTable.ts +260 -0
- package/repos/effect/packages/platform-browser/src/IndexedDbVersion.ts +138 -0
- package/repos/effect/packages/platform-browser/src/Permissions.ts +146 -0
- package/repos/effect/packages/platform-browser/src/index.ts +90 -0
- package/repos/effect/packages/platform-browser/test/BrowserCrypto.test.ts +74 -0
- package/repos/effect/packages/platform-browser/test/BrowserHttpClient.test.ts +91 -0
- package/repos/effect/packages/platform-browser/test/BrowserKeyValueStore.test.ts +23 -0
- package/repos/effect/packages/platform-browser/test/BrowserPersistence.test.ts +209 -0
- package/repos/effect/packages/platform-browser/test/BrowserPersistencePersistedCache.test.ts +29 -0
- package/repos/effect/packages/platform-browser/test/IndexedDbDatabase.test.ts +253 -0
- package/repos/effect/packages/platform-browser/test/IndexedDbQueryBuilder.test.ts +1459 -0
- package/repos/effect/packages/platform-browser/test/IndexedDbTable.test.ts +101 -0
- package/repos/effect/packages/platform-browser/test/IndexedDbVersion.test.ts +50 -0
- package/repos/effect/packages/platform-browser/test/Permissions.test.ts +12 -0
- package/repos/effect/packages/platform-browser/test/RpcWorker.test.ts +19 -0
- package/repos/effect/packages/platform-browser/test/fixtures/rpc-e2e.ts +141 -0
- package/repos/effect/packages/platform-browser/test/fixtures/rpc-schemas.ts +157 -0
- package/repos/effect/packages/platform-browser/test/fixtures/rpc-worker.ts +12 -0
- package/repos/effect/packages/platform-browser/tsconfig.json +8 -0
- package/repos/effect/packages/platform-browser/vitest.config.ts +17 -0
- package/repos/effect/packages/platform-browser/vitest.setup.ts +5 -0
- package/repos/effect/packages/platform-bun/CHANGELOG.md +691 -0
- package/repos/effect/packages/platform-bun/LICENSE +21 -0
- package/repos/effect/packages/platform-bun/README.md +7 -0
- package/repos/effect/packages/platform-bun/docgen.json +20 -0
- package/repos/effect/packages/platform-bun/package.json +73 -0
- package/repos/effect/packages/platform-bun/src/BunChildProcessSpawner.ts +6 -0
- package/repos/effect/packages/platform-bun/src/BunClusterHttp.ts +174 -0
- package/repos/effect/packages/platform-bun/src/BunClusterSocket.ts +153 -0
- package/repos/effect/packages/platform-bun/src/BunCrypto.ts +24 -0
- package/repos/effect/packages/platform-bun/src/BunFileSystem.ts +20 -0
- package/repos/effect/packages/platform-bun/src/BunHttpClient.ts +9 -0
- package/repos/effect/packages/platform-bun/src/BunHttpPlatform.ts +50 -0
- package/repos/effect/packages/platform-bun/src/BunHttpServer.ts +600 -0
- package/repos/effect/packages/platform-bun/src/BunHttpServerRequest.ts +19 -0
- package/repos/effect/packages/platform-bun/src/BunMultipart.ts +54 -0
- package/repos/effect/packages/platform-bun/src/BunPath.ts +37 -0
- package/repos/effect/packages/platform-bun/src/BunRedis.ts +88 -0
- package/repos/effect/packages/platform-bun/src/BunRuntime.ts +52 -0
- package/repos/effect/packages/platform-bun/src/BunServices.ts +49 -0
- package/repos/effect/packages/platform-bun/src/BunSink.ts +8 -0
- package/repos/effect/packages/platform-bun/src/BunSocket.ts +54 -0
- package/repos/effect/packages/platform-bun/src/BunSocketServer.ts +8 -0
- package/repos/effect/packages/platform-bun/src/BunStdio.ts +22 -0
- package/repos/effect/packages/platform-bun/src/BunStream.ts +68 -0
- package/repos/effect/packages/platform-bun/src/BunTerminal.ts +32 -0
- package/repos/effect/packages/platform-bun/src/BunWorker.ts +92 -0
- package/repos/effect/packages/platform-bun/src/BunWorkerRunner.ts +113 -0
- package/repos/effect/packages/platform-bun/src/index.ts +115 -0
- package/repos/effect/packages/platform-bun/tsconfig.json +12 -0
- package/repos/effect/packages/platform-node/CHANGELOG.md +695 -0
- package/repos/effect/packages/platform-node/LICENSE +21 -0
- package/repos/effect/packages/platform-node/README.md +7 -0
- package/repos/effect/packages/platform-node/docgen.json +24 -0
- package/repos/effect/packages/platform-node/package.json +82 -0
- package/repos/effect/packages/platform-node/src/Mime.ts +25 -0
- package/repos/effect/packages/platform-node/src/NodeChildProcessSpawner.ts +6 -0
- package/repos/effect/packages/platform-node/src/NodeClusterHttp.ts +155 -0
- package/repos/effect/packages/platform-node/src/NodeClusterSocket.ts +176 -0
- package/repos/effect/packages/platform-node/src/NodeCrypto.ts +24 -0
- package/repos/effect/packages/platform-node/src/NodeFileSystem.ts +21 -0
- package/repos/effect/packages/platform-node/src/NodeHttpClient.ts +664 -0
- package/repos/effect/packages/platform-node/src/NodeHttpIncomingMessage.ts +141 -0
- package/repos/effect/packages/platform-node/src/NodeHttpPlatform.ts +70 -0
- package/repos/effect/packages/platform-node/src/NodeHttpServer.ts +646 -0
- package/repos/effect/packages/platform-node/src/NodeHttpServerRequest.ts +33 -0
- package/repos/effect/packages/platform-node/src/NodeMultipart.ts +183 -0
- package/repos/effect/packages/platform-node/src/NodePath.ts +40 -0
- package/repos/effect/packages/platform-node/src/NodeRedis.ts +92 -0
- package/repos/effect/packages/platform-node/src/NodeRuntime.ts +53 -0
- package/repos/effect/packages/platform-node/src/NodeServices.ts +50 -0
- package/repos/effect/packages/platform-node/src/NodeSink.ts +8 -0
- package/repos/effect/packages/platform-node/src/NodeSocket.ts +72 -0
- package/repos/effect/packages/platform-node/src/NodeSocketServer.ts +8 -0
- package/repos/effect/packages/platform-node/src/NodeStdio.ts +22 -0
- package/repos/effect/packages/platform-node/src/NodeStream.ts +8 -0
- package/repos/effect/packages/platform-node/src/NodeTerminal.ts +32 -0
- package/repos/effect/packages/platform-node/src/NodeWorker.ts +121 -0
- package/repos/effect/packages/platform-node/src/NodeWorkerRunner.ts +110 -0
- package/repos/effect/packages/platform-node/src/Undici.ts +29 -0
- package/repos/effect/packages/platform-node/src/index.ts +130 -0
- package/repos/effect/packages/platform-node/test/HttpApi.test.ts +1831 -0
- package/repos/effect/packages/platform-node/test/HttpStaticServer.test.ts +253 -0
- package/repos/effect/packages/platform-node/test/HttpStaticServerConditional.test.ts +296 -0
- package/repos/effect/packages/platform-node/test/NodeCrypto.test.ts +59 -0
- package/repos/effect/packages/platform-node/test/NodeHttpClient.test.ts +157 -0
- package/repos/effect/packages/platform-node/test/NodeHttpPlatform.test.ts +51 -0
- package/repos/effect/packages/platform-node/test/NodeHttpServer.test.ts +598 -0
- package/repos/effect/packages/platform-node/test/NodeRedis.test.ts +31 -0
- package/repos/effect/packages/platform-node/test/NodeSocket.test.ts +153 -0
- package/repos/effect/packages/platform-node/test/OpenApi.test.ts +1573 -0
- package/repos/effect/packages/platform-node/test/RpcServer.test.ts +213 -0
- package/repos/effect/packages/platform-node/test/__snapshots__/HttpApi.test.ts.snap +715 -0
- package/repos/effect/packages/platform-node/test/cluster/MessageStorageTest.ts +196 -0
- package/repos/effect/packages/platform-node/test/cluster/SocketRunner.test.ts +120 -0
- package/repos/effect/packages/platform-node/test/cluster/SqlMessageStorage.test.ts +222 -0
- package/repos/effect/packages/platform-node/test/cluster/SqlRunnerStorage.test.ts +101 -0
- package/repos/effect/packages/platform-node/test/fixtures/http-static-server/conditional.txt +1 -0
- package/repos/effect/packages/platform-node/test/fixtures/http-static-server/custom/home.html +1 -0
- package/repos/effect/packages/platform-node/test/fixtures/http-static-server/file.binx +1 -0
- package/repos/effect/packages/platform-node/test/fixtures/http-static-server/guide/index.html +1 -0
- package/repos/effect/packages/platform-node/test/fixtures/http-static-server/hello.txt +1 -0
- package/repos/effect/packages/platform-node/test/fixtures/http-static-server/index.html +1 -0
- package/repos/effect/packages/platform-node/test/fixtures/http-static-server/range.txt +1 -0
- package/repos/effect/packages/platform-node/test/fixtures/http-static-server-outside.txt +1 -0
- package/repos/effect/packages/platform-node/test/fixtures/mysql2-utils.ts +64 -0
- package/repos/effect/packages/platform-node/test/fixtures/pg-utils.ts +39 -0
- package/repos/effect/packages/platform-node/test/fixtures/rpc-e2e.ts +149 -0
- package/repos/effect/packages/platform-node/test/fixtures/rpc-schemas.ts +175 -0
- package/repos/effect/packages/platform-node/test/fixtures/text.txt +1 -0
- package/repos/effect/packages/platform-node/tsconfig.json +12 -0
- package/repos/effect/packages/platform-node/vitest.config.ts +6 -0
- package/repos/effect/packages/platform-node-shared/CHANGELOG.md +617 -0
- package/repos/effect/packages/platform-node-shared/LICENSE +21 -0
- package/repos/effect/packages/platform-node-shared/README.md +7 -0
- package/repos/effect/packages/platform-node-shared/docgen.json +38 -0
- package/repos/effect/packages/platform-node-shared/package.json +76 -0
- package/repos/effect/packages/platform-node-shared/src/NodeChildProcessSpawner.ts +713 -0
- package/repos/effect/packages/platform-node-shared/src/NodeClusterSocket.ts +70 -0
- package/repos/effect/packages/platform-node-shared/src/NodeCrypto.ts +60 -0
- package/repos/effect/packages/platform-node-shared/src/NodeFileSystem.ts +652 -0
- package/repos/effect/packages/platform-node-shared/src/NodePath.ts +80 -0
- package/repos/effect/packages/platform-node-shared/src/NodeRuntime.ts +59 -0
- package/repos/effect/packages/platform-node-shared/src/NodeSink.ts +116 -0
- package/repos/effect/packages/platform-node-shared/src/NodeSocket.ts +269 -0
- package/repos/effect/packages/platform-node-shared/src/NodeSocketServer.ts +301 -0
- package/repos/effect/packages/platform-node-shared/src/NodeStdio.ts +67 -0
- package/repos/effect/packages/platform-node-shared/src/NodeStream.ts +445 -0
- package/repos/effect/packages/platform-node-shared/src/NodeTerminal.ts +129 -0
- package/repos/effect/packages/platform-node-shared/src/index.ts +65 -0
- package/repos/effect/packages/platform-node-shared/src/internal/utils.ts +51 -0
- package/repos/effect/packages/platform-node-shared/test/NodeChildProcessSpawner.test.ts +1069 -0
- package/repos/effect/packages/platform-node-shared/test/NodeFileSystem.test.ts +214 -0
- package/repos/effect/packages/platform-node-shared/test/NodeSink.test.ts +153 -0
- package/repos/effect/packages/platform-node-shared/test/NodeStream.test.ts +173 -0
- package/repos/effect/packages/platform-node-shared/test/fixtures/bash/no-permissions.sh +3 -0
- package/repos/effect/packages/platform-node-shared/test/fixtures/bash/parent-exits-early.sh +31 -0
- package/repos/effect/packages/platform-node-shared/test/fixtures/bash/spawn-children.sh +32 -0
- package/repos/effect/packages/platform-node-shared/test/fixtures/config/SHOUTING +1 -0
- package/repos/effect/packages/platform-node-shared/test/fixtures/config/integer +1 -0
- package/repos/effect/packages/platform-node-shared/test/fixtures/config/nested/config +1 -0
- package/repos/effect/packages/platform-node-shared/test/fixtures/config/secret +1 -0
- package/repos/effect/packages/platform-node-shared/test/fixtures/helloworld.tar.gz +0 -0
- package/repos/effect/packages/platform-node-shared/test/fixtures/text.txt +1 -0
- package/repos/effect/packages/platform-node-shared/tsconfig.json +11 -0
- package/repos/effect/packages/platform-node-shared/vitest.config.ts +6 -0
- package/repos/effect/packages/sql/clickhouse/CHANGELOG.md +681 -0
- package/repos/effect/packages/sql/clickhouse/LICENSE +21 -0
- package/repos/effect/packages/sql/clickhouse/README.md +7 -0
- package/repos/effect/packages/sql/clickhouse/docgen.json +24 -0
- package/repos/effect/packages/sql/clickhouse/package.json +72 -0
- package/repos/effect/packages/sql/clickhouse/src/ClickhouseClient.ts +546 -0
- package/repos/effect/packages/sql/clickhouse/src/ClickhouseMigrator.ts +51 -0
- package/repos/effect/packages/sql/clickhouse/src/index.ts +15 -0
- package/repos/effect/packages/sql/clickhouse/test/Client.test.ts +6 -0
- package/repos/effect/packages/sql/clickhouse/test/SqlErrorClassification.test.ts +75 -0
- package/repos/effect/packages/sql/clickhouse/tsconfig.json +12 -0
- package/repos/effect/packages/sql/clickhouse/vitest.config.ts +6 -0
- package/repos/effect/packages/sql/d1/CHANGELOG.md +597 -0
- package/repos/effect/packages/sql/d1/LICENSE +21 -0
- package/repos/effect/packages/sql/d1/README.md +7 -0
- package/repos/effect/packages/sql/d1/docgen.json +24 -0
- package/repos/effect/packages/sql/d1/package.json +75 -0
- package/repos/effect/packages/sql/d1/src/D1Client.ts +249 -0
- package/repos/effect/packages/sql/d1/src/index.ts +10 -0
- package/repos/effect/packages/sql/d1/test/Client.test.ts +65 -0
- package/repos/effect/packages/sql/d1/test/Resolver.test.ts +176 -0
- package/repos/effect/packages/sql/d1/test/utils.ts +38 -0
- package/repos/effect/packages/sql/d1/tsconfig.json +8 -0
- package/repos/effect/packages/sql/d1/vitest.config.ts +6 -0
- package/repos/effect/packages/sql/libsql/CHANGELOG.md +601 -0
- package/repos/effect/packages/sql/libsql/LICENSE +21 -0
- package/repos/effect/packages/sql/libsql/README.md +7 -0
- package/repos/effect/packages/sql/libsql/docgen.json +24 -0
- package/repos/effect/packages/sql/libsql/package.json +73 -0
- package/repos/effect/packages/sql/libsql/src/LibsqlClient.ts +381 -0
- package/repos/effect/packages/sql/libsql/src/LibsqlMigrator.ts +46 -0
- package/repos/effect/packages/sql/libsql/src/index.ts +15 -0
- package/repos/effect/packages/sql/libsql/test/Client.test.ts +106 -0
- package/repos/effect/packages/sql/libsql/test/Resolver.test.ts +177 -0
- package/repos/effect/packages/sql/libsql/test/util.ts +54 -0
- package/repos/effect/packages/sql/libsql/tsconfig.json +9 -0
- package/repos/effect/packages/sql/libsql/vitest.config.ts +6 -0
- package/repos/effect/packages/sql/mssql/CHANGELOG.md +601 -0
- package/repos/effect/packages/sql/mssql/LICENSE +21 -0
- package/repos/effect/packages/sql/mssql/README.md +7 -0
- package/repos/effect/packages/sql/mssql/docgen.json +24 -0
- package/repos/effect/packages/sql/mssql/package.json +70 -0
- package/repos/effect/packages/sql/mssql/src/MssqlClient.ts +732 -0
- package/repos/effect/packages/sql/mssql/src/MssqlMigrator.ts +45 -0
- package/repos/effect/packages/sql/mssql/src/Parameter.ts +64 -0
- package/repos/effect/packages/sql/mssql/src/Procedure.ts +213 -0
- package/repos/effect/packages/sql/mssql/src/index.ts +32 -0
- package/repos/effect/packages/sql/mssql/test/Client.test.ts +91 -0
- package/repos/effect/packages/sql/mssql/test/SqlErrorClassification.test.ts +206 -0
- package/repos/effect/packages/sql/mssql/tsconfig.json +8 -0
- package/repos/effect/packages/sql/mssql/vitest.config.ts +6 -0
- package/repos/effect/packages/sql/mysql2/CHANGELOG.md +603 -0
- package/repos/effect/packages/sql/mysql2/LICENSE +21 -0
- package/repos/effect/packages/sql/mysql2/README.md +7 -0
- package/repos/effect/packages/sql/mysql2/docgen.json +24 -0
- package/repos/effect/packages/sql/mysql2/package.json +71 -0
- package/repos/effect/packages/sql/mysql2/src/MysqlClient.ts +517 -0
- package/repos/effect/packages/sql/mysql2/src/MysqlMigrator.ts +102 -0
- package/repos/effect/packages/sql/mysql2/src/index.ts +15 -0
- package/repos/effect/packages/sql/mysql2/test/Client.test.ts +34 -0
- package/repos/effect/packages/sql/mysql2/test/KeyValueStore.test.ts +16 -0
- package/repos/effect/packages/sql/mysql2/test/Model.test.ts +227 -0
- package/repos/effect/packages/sql/mysql2/test/MysqlClient.test.ts +35 -0
- package/repos/effect/packages/sql/mysql2/test/Persistence.test.ts +22 -0
- package/repos/effect/packages/sql/mysql2/test/SqlErrorClassification.test.ts +133 -0
- package/repos/effect/packages/sql/mysql2/test/SqlEventLogServerUnencrypted.test.ts +7 -0
- package/repos/effect/packages/sql/mysql2/test/utils.ts +64 -0
- package/repos/effect/packages/sql/mysql2/tsconfig.json +9 -0
- package/repos/effect/packages/sql/mysql2/vitest.config.ts +6 -0
- package/repos/effect/packages/sql/pg/CHANGELOG.md +3432 -0
- package/repos/effect/packages/sql/pg/LICENSE +21 -0
- package/repos/effect/packages/sql/pg/README.md +7 -0
- package/repos/effect/packages/sql/pg/docgen.json +24 -0
- package/repos/effect/packages/sql/pg/package.json +77 -0
- package/repos/effect/packages/sql/pg/src/PgClient.ts +947 -0
- package/repos/effect/packages/sql/pg/src/PgMigrator.ts +120 -0
- package/repos/effect/packages/sql/pg/src/index.ts +15 -0
- package/repos/effect/packages/sql/pg/test/Client.test.ts +373 -0
- package/repos/effect/packages/sql/pg/test/KeyValueStore.test.ts +16 -0
- package/repos/effect/packages/sql/pg/test/Persistence.test.ts +20 -0
- package/repos/effect/packages/sql/pg/test/SqlErrorClassification.test.ts +81 -0
- package/repos/effect/packages/sql/pg/test/SqlEventLogServerUnencrypted.test.ts +7 -0
- package/repos/effect/packages/sql/pg/test/TransactionAcquire.test.ts +52 -0
- package/repos/effect/packages/sql/pg/test/utils.ts +49 -0
- package/repos/effect/packages/sql/pg/tsconfig.json +9 -0
- package/repos/effect/packages/sql/pg/vitest.config.ts +6 -0
- package/repos/effect/packages/sql/pglite/CHANGELOG.md +198 -0
- package/repos/effect/packages/sql/pglite/LICENSE +21 -0
- package/repos/effect/packages/sql/pglite/README.md +7 -0
- package/repos/effect/packages/sql/pglite/docgen.json +24 -0
- package/repos/effect/packages/sql/pglite/package.json +74 -0
- package/repos/effect/packages/sql/pglite/src/PgliteClient.ts +503 -0
- package/repos/effect/packages/sql/pglite/src/PgliteMigrator.ts +44 -0
- package/repos/effect/packages/sql/pglite/src/index.ts +15 -0
- package/repos/effect/packages/sql/pglite/test/Client.test.ts +149 -0
- package/repos/effect/packages/sql/pglite/test/Migrator.test.ts +45 -0
- package/repos/effect/packages/sql/pglite/test/SqlErrorClassification.test.ts +56 -0
- package/repos/effect/packages/sql/pglite/test/Transaction.test.ts +62 -0
- package/repos/effect/packages/sql/pglite/tsconfig.json +8 -0
- package/repos/effect/packages/sql/pglite/vitest.config.ts +6 -0
- package/repos/effect/packages/sql/sqlite-bun/CHANGELOG.md +601 -0
- package/repos/effect/packages/sql/sqlite-bun/LICENSE +21 -0
- package/repos/effect/packages/sql/sqlite-bun/README.md +7 -0
- package/repos/effect/packages/sql/sqlite-bun/docgen.json +24 -0
- package/repos/effect/packages/sql/sqlite-bun/package.json +69 -0
- package/repos/effect/packages/sql/sqlite-bun/src/SqliteClient.ts +262 -0
- package/repos/effect/packages/sql/sqlite-bun/src/SqliteMigrator.ts +90 -0
- package/repos/effect/packages/sql/sqlite-bun/src/index.ts +15 -0
- package/repos/effect/packages/sql/sqlite-bun/test/Client.test.ts +6 -0
- package/repos/effect/packages/sql/sqlite-bun/tsconfig.json +11 -0
- package/repos/effect/packages/sql/sqlite-bun/vitest.config.ts +6 -0
- package/repos/effect/packages/sql/sqlite-do/CHANGELOG.md +601 -0
- package/repos/effect/packages/sql/sqlite-do/LICENSE +21 -0
- package/repos/effect/packages/sql/sqlite-do/README.md +7 -0
- package/repos/effect/packages/sql/sqlite-do/docgen.json +24 -0
- package/repos/effect/packages/sql/sqlite-do/package.json +68 -0
- package/repos/effect/packages/sql/sqlite-do/src/SqliteClient.ts +249 -0
- package/repos/effect/packages/sql/sqlite-do/src/SqliteMigrator.ts +45 -0
- package/repos/effect/packages/sql/sqlite-do/src/index.ts +15 -0
- package/repos/effect/packages/sql/sqlite-do/test/Client.test.ts +24 -0
- package/repos/effect/packages/sql/sqlite-do/tsconfig.json +8 -0
- package/repos/effect/packages/sql/sqlite-do/vitest.config.ts +6 -0
- package/repos/effect/packages/sql/sqlite-node/CHANGELOG.md +3415 -0
- package/repos/effect/packages/sql/sqlite-node/LICENSE +21 -0
- package/repos/effect/packages/sql/sqlite-node/README.md +7 -0
- package/repos/effect/packages/sql/sqlite-node/docgen.json +24 -0
- package/repos/effect/packages/sql/sqlite-node/package.json +72 -0
- package/repos/effect/packages/sql/sqlite-node/src/SqliteClient.ts +312 -0
- package/repos/effect/packages/sql/sqlite-node/src/SqliteMigrator.ts +90 -0
- package/repos/effect/packages/sql/sqlite-node/src/index.ts +15 -0
- package/repos/effect/packages/sql/sqlite-node/test/Client.test.ts +75 -0
- package/repos/effect/packages/sql/sqlite-node/test/KeyValueStore.test.ts +29 -0
- package/repos/effect/packages/sql/sqlite-node/test/Persistence.test.ts +109 -0
- package/repos/effect/packages/sql/sqlite-node/test/Resolver.test.ts +183 -0
- package/repos/effect/packages/sql/sqlite-node/test/SqlEventJournal.test.ts +84 -0
- package/repos/effect/packages/sql/sqlite-node/test/SqlEventLogServerEncrypted.test.ts +249 -0
- package/repos/effect/packages/sql/sqlite-node/test/SqlEventLogServerUnencrypted.test.ts +110 -0
- package/repos/effect/packages/sql/sqlite-node/test/SqliteMigrator.test.ts +48 -0
- package/repos/effect/packages/sql/sqlite-node/tsconfig.json +8 -0
- package/repos/effect/packages/sql/sqlite-node/vitest.config.ts +6 -0
- package/repos/effect/packages/sql/sqlite-react-native/CHANGELOG.md +601 -0
- package/repos/effect/packages/sql/sqlite-react-native/LICENSE +21 -0
- package/repos/effect/packages/sql/sqlite-react-native/README.md +7 -0
- package/repos/effect/packages/sql/sqlite-react-native/docgen.json +24 -0
- package/repos/effect/packages/sql/sqlite-react-native/package.json +69 -0
- package/repos/effect/packages/sql/sqlite-react-native/src/SqliteClient.ts +354 -0
- package/repos/effect/packages/sql/sqlite-react-native/src/SqliteMigrator.ts +55 -0
- package/repos/effect/packages/sql/sqlite-react-native/src/index.ts +15 -0
- package/repos/effect/packages/sql/sqlite-react-native/test/Client.test.ts +6 -0
- package/repos/effect/packages/sql/sqlite-react-native/tsconfig.json +8 -0
- package/repos/effect/packages/sql/sqlite-react-native/vitest.config.ts +6 -0
- package/repos/effect/packages/sql/sqlite-wasm/CHANGELOG.md +601 -0
- package/repos/effect/packages/sql/sqlite-wasm/LICENSE +21 -0
- package/repos/effect/packages/sql/sqlite-wasm/README.md +7 -0
- package/repos/effect/packages/sql/sqlite-wasm/docgen.json +24 -0
- package/repos/effect/packages/sql/sqlite-wasm/package.json +69 -0
- package/repos/effect/packages/sql/sqlite-wasm/src/OpfsWorker.ts +118 -0
- package/repos/effect/packages/sql/sqlite-wasm/src/SqliteClient.ts +551 -0
- package/repos/effect/packages/sql/sqlite-wasm/src/SqliteMigrator.ts +55 -0
- package/repos/effect/packages/sql/sqlite-wasm/src/index.ts +14 -0
- package/repos/effect/packages/sql/sqlite-wasm/src/internal/opfsWorker.ts +7 -0
- package/repos/effect/packages/sql/sqlite-wasm/src/sqlite-wasm.d.ts +47 -0
- package/repos/effect/packages/sql/sqlite-wasm/test/Client.test.ts +6 -0
- package/repos/effect/packages/sql/sqlite-wasm/tsconfig.json +8 -0
- package/repos/effect/packages/sql/sqlite-wasm/vitest.config.ts +6 -0
- package/repos/effect/packages/tools/ai-codegen/codegen.schema.json +92 -0
- package/repos/effect/packages/tools/ai-codegen/docgen.json +4 -0
- package/repos/effect/packages/tools/ai-codegen/package.json +61 -0
- package/repos/effect/packages/tools/ai-codegen/src/Config.ts +292 -0
- package/repos/effect/packages/tools/ai-codegen/src/Discovery.ts +197 -0
- package/repos/effect/packages/tools/ai-codegen/src/Generator.ts +183 -0
- package/repos/effect/packages/tools/ai-codegen/src/Glob.ts +56 -0
- package/repos/effect/packages/tools/ai-codegen/src/PostProcess.ts +157 -0
- package/repos/effect/packages/tools/ai-codegen/src/SpecFetcher.ts +154 -0
- package/repos/effect/packages/tools/ai-codegen/src/bin.ts +10 -0
- package/repos/effect/packages/tools/ai-codegen/src/main.ts +237 -0
- package/repos/effect/packages/tools/ai-codegen/tsconfig.json +15 -0
- package/repos/effect/packages/tools/ai-docgen/docgen.json +4 -0
- package/repos/effect/packages/tools/ai-docgen/package.json +60 -0
- package/repos/effect/packages/tools/ai-docgen/src/Glob.ts +48 -0
- package/repos/effect/packages/tools/ai-docgen/src/main.ts +186 -0
- package/repos/effect/packages/tools/ai-docgen/tsconfig.json +14 -0
- package/repos/effect/packages/tools/bundle/docgen.json +4 -0
- package/repos/effect/packages/tools/bundle/fixtures/basic.ts +3 -0
- package/repos/effect/packages/tools/bundle/fixtures/batching.ts +25 -0
- package/repos/effect/packages/tools/bundle/fixtures/brand.ts +5 -0
- package/repos/effect/packages/tools/bundle/fixtures/cache.ts +10 -0
- package/repos/effect/packages/tools/bundle/fixtures/config.ts +13 -0
- package/repos/effect/packages/tools/bundle/fixtures/differ.ts +9 -0
- package/repos/effect/packages/tools/bundle/fixtures/http-client.ts +12 -0
- package/repos/effect/packages/tools/bundle/fixtures/logger.ts +5 -0
- package/repos/effect/packages/tools/bundle/fixtures/metric.ts +13 -0
- package/repos/effect/packages/tools/bundle/fixtures/optic.ts +6 -0
- package/repos/effect/packages/tools/bundle/fixtures/pubsub.ts +22 -0
- package/repos/effect/packages/tools/bundle/fixtures/queue.ts +18 -0
- package/repos/effect/packages/tools/bundle/fixtures/schedule.ts +9 -0
- package/repos/effect/packages/tools/bundle/fixtures/schema-fromJsonSchemaDocument.ts +16 -0
- package/repos/effect/packages/tools/bundle/fixtures/schema-representation-roundtrip.ts +16 -0
- package/repos/effect/packages/tools/bundle/fixtures/schema-string-transformation.ts +20 -0
- package/repos/effect/packages/tools/bundle/fixtures/schema-string.ts +8 -0
- package/repos/effect/packages/tools/bundle/fixtures/schema-template-literal.ts +8 -0
- package/repos/effect/packages/tools/bundle/fixtures/schema-toArbitraryLazy.ts +9 -0
- package/repos/effect/packages/tools/bundle/fixtures/schema-toCodeDocument.ts +12 -0
- package/repos/effect/packages/tools/bundle/fixtures/schema-toCodecJson.ts +9 -0
- package/repos/effect/packages/tools/bundle/fixtures/schema-toEquivalence.ts +9 -0
- package/repos/effect/packages/tools/bundle/fixtures/schema-toFormatter.ts +9 -0
- package/repos/effect/packages/tools/bundle/fixtures/schema-toJsonSchemaDocument.ts +9 -0
- package/repos/effect/packages/tools/bundle/fixtures/schema-toRepresentation.ts +9 -0
- package/repos/effect/packages/tools/bundle/fixtures/schema.ts +12 -0
- package/repos/effect/packages/tools/bundle/fixtures/stm.ts +21 -0
- package/repos/effect/packages/tools/bundle/fixtures/stream.ts +7 -0
- package/repos/effect/packages/tools/bundle/package.json +52 -0
- package/repos/effect/packages/tools/bundle/src/Cli.ts +104 -0
- package/repos/effect/packages/tools/bundle/src/Fixtures.ts +51 -0
- package/repos/effect/packages/tools/bundle/src/Plugins.ts +131 -0
- package/repos/effect/packages/tools/bundle/src/Reporter.ts +200 -0
- package/repos/effect/packages/tools/bundle/src/Rollup.ts +179 -0
- package/repos/effect/packages/tools/bundle/src/bin.ts +23 -0
- package/repos/effect/packages/tools/bundle/tsconfig.fixtures.json +13 -0
- package/repos/effect/packages/tools/bundle/tsconfig.json +9 -0
- package/repos/effect/packages/tools/bundle/tsconfig.src.json +13 -0
- package/repos/effect/packages/tools/jsdocs/docgen.json +4 -0
- package/repos/effect/packages/tools/jsdocs/package.json +64 -0
- package/repos/effect/packages/tools/jsdocs/src/Jsdocs.ts +3303 -0
- package/repos/effect/packages/tools/jsdocs/src/bin.ts +23 -0
- package/repos/effect/packages/tools/jsdocs/test/jsdocs.test.ts +979 -0
- package/repos/effect/packages/tools/jsdocs/tsconfig.json +8 -0
- package/repos/effect/packages/tools/jsdocs/vitest.config.ts +6 -0
- package/repos/effect/packages/tools/openapi-generator/CHANGELOG.md +691 -0
- package/repos/effect/packages/tools/openapi-generator/LICENSE +21 -0
- package/repos/effect/packages/tools/openapi-generator/docgen.json +4 -0
- package/repos/effect/packages/tools/openapi-generator/package.json +78 -0
- package/repos/effect/packages/tools/openapi-generator/src/HttpApiTransformer.ts +552 -0
- package/repos/effect/packages/tools/openapi-generator/src/JsonSchemaGenerator.ts +319 -0
- package/repos/effect/packages/tools/openapi-generator/src/OpenApiGenerator.ts +1201 -0
- package/repos/effect/packages/tools/openapi-generator/src/OpenApiPatch.ts +539 -0
- package/repos/effect/packages/tools/openapi-generator/src/OpenApiTransformer.ts +1019 -0
- package/repos/effect/packages/tools/openapi-generator/src/ParsedOperation.ts +277 -0
- package/repos/effect/packages/tools/openapi-generator/src/Utils.ts +111 -0
- package/repos/effect/packages/tools/openapi-generator/src/bin.ts +10 -0
- package/repos/effect/packages/tools/openapi-generator/src/main.ts +116 -0
- package/repos/effect/packages/tools/openapi-generator/test/JsonSchemaGenerator.test.ts +173 -0
- package/repos/effect/packages/tools/openapi-generator/test/OpenApiGenerator.test.ts +2130 -0
- package/repos/effect/packages/tools/openapi-generator/test/OpenApiGeneratorCli.test.ts +147 -0
- package/repos/effect/packages/tools/openapi-generator/test/OpenApiPatch.test.ts +380 -0
- package/repos/effect/packages/tools/openapi-generator/test/Utils.test.ts +33 -0
- package/repos/effect/packages/tools/openapi-generator/test/fixtures/cli-basic-spec.json +35 -0
- package/repos/effect/packages/tools/openapi-generator/test/fixtures/cli-warning-spec.json +57 -0
- package/repos/effect/packages/tools/openapi-generator/test/fixtures/patches/invalid-op.json +7 -0
- package/repos/effect/packages/tools/openapi-generator/test/fixtures/patches/missing-path.json +6 -0
- package/repos/effect/packages/tools/openapi-generator/test/fixtures/patches/missing-value.json +6 -0
- package/repos/effect/packages/tools/openapi-generator/test/fixtures/patches/valid-add.json +8 -0
- package/repos/effect/packages/tools/openapi-generator/test/fixtures/patches/valid-multiple.json +17 -0
- package/repos/effect/packages/tools/openapi-generator/test/fixtures/patches/valid-patch.yaml +6 -0
- package/repos/effect/packages/tools/openapi-generator/test/fixtures/patches/valid-remove.json +6 -0
- package/repos/effect/packages/tools/openapi-generator/test/fixtures/patches/valid-replace.json +7 -0
- package/repos/effect/packages/tools/openapi-generator/tsconfig.json +9 -0
- package/repos/effect/packages/tools/openapi-generator/vitest.config.ts +6 -0
- package/repos/effect/packages/tools/oxc/docgen.json +4 -0
- package/repos/effect/packages/tools/oxc/oxlintrc.json +83 -0
- package/repos/effect/packages/tools/oxc/package.json +72 -0
- package/repos/effect/packages/tools/oxc/src/oxlint/index.ts +18 -0
- package/repos/effect/packages/tools/oxc/src/oxlint/rules/jsdocs.ts +108 -0
- package/repos/effect/packages/tools/oxc/src/oxlint/rules/no-bigint-literals.ts +25 -0
- package/repos/effect/packages/tools/oxc/src/oxlint/rules/no-import-from-barrel-package.ts +144 -0
- package/repos/effect/packages/tools/oxc/src/oxlint/rules/no-js-extension-imports.ts +73 -0
- package/repos/effect/packages/tools/oxc/src/oxlint/rules/no-opaque-instance-fields.ts +92 -0
- package/repos/effect/packages/tools/oxc/test/jsdocs.test.ts +75 -0
- package/repos/effect/packages/tools/oxc/test/no-import-from-barrel-package.test.ts +182 -0
- package/repos/effect/packages/tools/oxc/test/no-js-extension-imports.test.ts +120 -0
- package/repos/effect/packages/tools/oxc/test/no-opaque-instance-fields.test.ts +276 -0
- package/repos/effect/packages/tools/oxc/test/utils.ts +61 -0
- package/repos/effect/packages/tools/oxc/tsconfig.json +8 -0
- package/repos/effect/packages/tools/oxc/vitest.config.ts +6 -0
- package/repos/effect/packages/tools/utils/docgen.json +4 -0
- package/repos/effect/packages/tools/utils/package.json +59 -0
- package/repos/effect/packages/tools/utils/src/Codegen.ts +214 -0
- package/repos/effect/packages/tools/utils/src/Glob.ts +61 -0
- package/repos/effect/packages/tools/utils/src/bin.ts +16 -0
- package/repos/effect/packages/tools/utils/src/commands/codegen.ts +44 -0
- package/repos/effect/packages/tools/utils/tsconfig.json +9 -0
- package/repos/effect/packages/vitest/CHANGELOG.md +601 -0
- package/repos/effect/packages/vitest/LICENSE +21 -0
- package/repos/effect/packages/vitest/README.md +320 -0
- package/repos/effect/packages/vitest/docgen.json +24 -0
- package/repos/effect/packages/vitest/package.json +60 -0
- package/repos/effect/packages/vitest/src/index.ts +259 -0
- package/repos/effect/packages/vitest/src/internal/internal.ts +374 -0
- package/repos/effect/packages/vitest/src/utils.ts +321 -0
- package/repos/effect/packages/vitest/test/index.test.ts +222 -0
- package/repos/effect/packages/vitest/test/isolation.test.ts +105 -0
- package/repos/effect/packages/vitest/test/nested-isolation.test.ts +212 -0
- package/repos/effect/packages/vitest/tsconfig.json +11 -0
- package/repos/effect/packages/vitest/typetest/index.tst.ts +56 -0
- package/repos/effect/packages/vitest/vitest.config.ts +6 -0
- package/repos/effect/patches/@changesets__assemble-release-plan.patch +26 -0
- package/repos/effect/patches/@changesets__get-github-info.patch +44 -0
- package/repos/effect/pnpm-lock.yaml +13483 -0
- package/repos/effect/pnpm-workspace.yaml +10 -0
- package/repos/effect/scripts/bundle-compare.sh +42 -0
- package/repos/effect/scripts/check-cookbook-schedule.ts +390 -0
- package/repos/effect/scripts/circular.mjs +26 -0
- package/repos/effect/scripts/clean.mjs +19 -0
- package/repos/effect/scripts/codemod.mjs +22 -0
- package/repos/effect/scripts/codemods/jsdoc.ts +79 -0
- package/repos/effect/scripts/docs.mjs +64 -0
- package/repos/effect/scripts/package-scalar.mjs +14 -0
- package/repos/effect/scripts/package-swagger.mjs +23 -0
- package/repos/effect/scripts/package.json +22 -0
- package/repos/effect/scripts/tsconfig.json +18 -0
- package/repos/effect/scripts/version.mjs +9 -0
- package/repos/effect/scripts/version.template.txt +2 -0
- package/repos/effect/scripts/worktree-setup.sh +27 -0
- package/repos/effect/stats.txt +30 -0
- package/repos/effect/tsconfig.base.json +46 -0
- package/repos/effect/tsconfig.json +128 -0
- package/repos/effect/tsconfig.packages.json +39 -0
- package/repos/effect/tstyche.json +7 -0
- package/repos/effect/vitest.config.ts +31 -0
- package/repos/effect/vitest.setup.ts +4 -0
- package/repos/effect/vitest.shared.ts +61 -0
- package/repos/effect.subtree.json +16 -0
|
@@ -0,0 +1,4908 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Works with JavaScript arrays, readonly arrays, and non-empty arrays.
|
|
3
|
+
*
|
|
4
|
+
* The helpers cover common collection work such as creating arrays, reading
|
|
5
|
+
* elements, transforming values, sorting, grouping, splitting, combining, and
|
|
6
|
+
* reducing many values to one result. Helpers that change contents return new
|
|
7
|
+
* arrays and preserve non-empty array types when the result is guaranteed to
|
|
8
|
+
* contain values.
|
|
9
|
+
*
|
|
10
|
+
* @since 2.0.0
|
|
11
|
+
*/
|
|
12
|
+
import * as Equal from "./Equal.ts"
|
|
13
|
+
import * as Equivalence from "./Equivalence.ts"
|
|
14
|
+
import type { LazyArg } from "./Function.ts"
|
|
15
|
+
import { dual, identity } from "./Function.ts"
|
|
16
|
+
import type { TypeLambda } from "./HKT.ts"
|
|
17
|
+
import * as internalArray from "./internal/array.ts"
|
|
18
|
+
import * as internalDoNotation from "./internal/doNotation.ts"
|
|
19
|
+
import * as moduleIterable from "./Iterable.ts"
|
|
20
|
+
import * as Option from "./Option.ts"
|
|
21
|
+
import * as Order from "./Order.ts"
|
|
22
|
+
import type * as Predicate from "./Predicate.ts"
|
|
23
|
+
import * as Record from "./Record.ts"
|
|
24
|
+
import * as Reducer from "./Reducer.ts"
|
|
25
|
+
import * as Result from "./Result.ts"
|
|
26
|
+
import * as Tuple from "./Tuple.ts"
|
|
27
|
+
import type { NoInfer, TupleOf } from "./Types.ts"
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Exposes the global array constructor.
|
|
31
|
+
*
|
|
32
|
+
* **When to use**
|
|
33
|
+
*
|
|
34
|
+
* Use to access native JavaScript array constructor methods such as `isArray`
|
|
35
|
+
* or `from` from the Effect module namespace.
|
|
36
|
+
*
|
|
37
|
+
* **Example** (Accessing the Array constructor)
|
|
38
|
+
*
|
|
39
|
+
* ```ts
|
|
40
|
+
* import { Array } from "effect"
|
|
41
|
+
*
|
|
42
|
+
* const arr = new Array.Array(3)
|
|
43
|
+
* console.log(arr) // [undefined, undefined, undefined]
|
|
44
|
+
* ```
|
|
45
|
+
*
|
|
46
|
+
* @category constructors
|
|
47
|
+
* @since 4.0.0
|
|
48
|
+
*/
|
|
49
|
+
export const Array = globalThis.Array
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Type lambda for `ReadonlyArray`, used for higher-kinded type operations.
|
|
53
|
+
*
|
|
54
|
+
* @category type lambdas
|
|
55
|
+
* @since 2.0.0
|
|
56
|
+
*/
|
|
57
|
+
export interface ReadonlyArrayTypeLambda extends TypeLambda {
|
|
58
|
+
readonly type: ReadonlyArray<this["Target"]>
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* A readonly array guaranteed to have at least one element.
|
|
63
|
+
*
|
|
64
|
+
* **When to use**
|
|
65
|
+
*
|
|
66
|
+
* Use when non-emptiness must be tracked at the type level while preventing mutation.
|
|
67
|
+
* Many Array module functions accept or return this type.
|
|
68
|
+
*
|
|
69
|
+
* **Example** (Typing a non-empty array)
|
|
70
|
+
*
|
|
71
|
+
* ```ts
|
|
72
|
+
* import type { Array } from "effect"
|
|
73
|
+
*
|
|
74
|
+
* const nonEmpty: Array.NonEmptyReadonlyArray<number> = [1, 2, 3]
|
|
75
|
+
* const head: number = nonEmpty[0] // guaranteed to exist
|
|
76
|
+
* ```
|
|
77
|
+
*
|
|
78
|
+
* @see {@link NonEmptyArray} — mutable counterpart
|
|
79
|
+
* @see {@link isReadonlyArrayNonEmpty} — narrow a `ReadonlyArray` to this type
|
|
80
|
+
*
|
|
81
|
+
* @category models
|
|
82
|
+
* @since 2.0.0
|
|
83
|
+
*/
|
|
84
|
+
export type NonEmptyReadonlyArray<A> = readonly [A, ...Array<A>]
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* A mutable array guaranteed to have at least one element.
|
|
88
|
+
*
|
|
89
|
+
* **When to use**
|
|
90
|
+
*
|
|
91
|
+
* Use when mutation is acceptable and non-emptiness must be tracked at the type
|
|
92
|
+
* level.
|
|
93
|
+
*
|
|
94
|
+
* **Details**
|
|
95
|
+
*
|
|
96
|
+
* This is the mutable counterpart of {@link NonEmptyReadonlyArray}. Most Array
|
|
97
|
+
* module functions return `NonEmptyArray` when the result is guaranteed
|
|
98
|
+
* non-empty.
|
|
99
|
+
*
|
|
100
|
+
* **Example** (Typing a mutable non-empty array)
|
|
101
|
+
*
|
|
102
|
+
* ```ts
|
|
103
|
+
* import type { Array } from "effect"
|
|
104
|
+
*
|
|
105
|
+
* const nonEmpty: Array.NonEmptyArray<number> = [1, 2, 3]
|
|
106
|
+
* nonEmpty.push(4)
|
|
107
|
+
* ```
|
|
108
|
+
*
|
|
109
|
+
* @see {@link NonEmptyReadonlyArray} — readonly counterpart
|
|
110
|
+
* @see {@link isArrayNonEmpty} — narrow an `Array` to this type
|
|
111
|
+
*
|
|
112
|
+
* @category models
|
|
113
|
+
* @since 2.0.0
|
|
114
|
+
*/
|
|
115
|
+
export type NonEmptyArray<A> = [A, ...Array<A>]
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Creates a `NonEmptyArray` from one or more elements.
|
|
119
|
+
*
|
|
120
|
+
* **When to use**
|
|
121
|
+
*
|
|
122
|
+
* Use when you need to create a typed non-empty array from literal values.
|
|
123
|
+
*
|
|
124
|
+
* **Details**
|
|
125
|
+
*
|
|
126
|
+
* The element type is inferred as the union of all arguments. Because at least
|
|
127
|
+
* one argument is required, this always returns a `NonEmptyArray`.
|
|
128
|
+
*
|
|
129
|
+
* **Example** (Creating an array from values)
|
|
130
|
+
*
|
|
131
|
+
* ```ts
|
|
132
|
+
* import { Array } from "effect"
|
|
133
|
+
*
|
|
134
|
+
* const result = Array.make(1, 2, 3)
|
|
135
|
+
* console.log(result) // [1, 2, 3]
|
|
136
|
+
* ```
|
|
137
|
+
*
|
|
138
|
+
* @see {@link of} — create a single-element array
|
|
139
|
+
* @see {@link fromIterable} — create from any iterable
|
|
140
|
+
*
|
|
141
|
+
* @category constructors
|
|
142
|
+
* @since 2.0.0
|
|
143
|
+
*/
|
|
144
|
+
export const make = <Elements extends NonEmptyArray<unknown>>(
|
|
145
|
+
...elements: Elements
|
|
146
|
+
): NonEmptyArray<Elements[number]> => elements
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Creates a new `Array` of the specified length with all slots uninitialized.
|
|
150
|
+
*
|
|
151
|
+
* **When to use**
|
|
152
|
+
*
|
|
153
|
+
* Use when you need a pre-sized array that will be filled imperatively.
|
|
154
|
+
*
|
|
155
|
+
* **Details**
|
|
156
|
+
*
|
|
157
|
+
* Elements are typed as `A | undefined` because the slots are empty.
|
|
158
|
+
*
|
|
159
|
+
* **Example** (Allocating a fixed-size array)
|
|
160
|
+
*
|
|
161
|
+
* ```ts
|
|
162
|
+
* import { Array } from "effect"
|
|
163
|
+
*
|
|
164
|
+
* const result = Array.allocate<number>(3)
|
|
165
|
+
* console.log(result.length) // 3
|
|
166
|
+
* ```
|
|
167
|
+
*
|
|
168
|
+
* @see {@link makeBy} — create an array by computing each element
|
|
169
|
+
*
|
|
170
|
+
* @category constructors
|
|
171
|
+
* @since 2.0.0
|
|
172
|
+
*/
|
|
173
|
+
export const allocate = <A = never>(n: number): Array<A | undefined> => new Array(n)
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Creates a `NonEmptyArray` of length `n` where element `i` is computed by `f(i)`.
|
|
177
|
+
*
|
|
178
|
+
* **When to use**
|
|
179
|
+
*
|
|
180
|
+
* Use when you need to compute each array element from its index.
|
|
181
|
+
*
|
|
182
|
+
* **Details**
|
|
183
|
+
*
|
|
184
|
+
* `n` is normalized to an integer greater than or equal to 1, so this function
|
|
185
|
+
* always returns at least one element. Supports both data-first and data-last
|
|
186
|
+
* usage.
|
|
187
|
+
*
|
|
188
|
+
* **Example** (Generating values from indices)
|
|
189
|
+
*
|
|
190
|
+
* ```ts
|
|
191
|
+
* import { Array } from "effect"
|
|
192
|
+
*
|
|
193
|
+
* const result = Array.makeBy(5, (n) => n * 2)
|
|
194
|
+
* console.log(result) // [0, 2, 4, 6, 8]
|
|
195
|
+
* ```
|
|
196
|
+
*
|
|
197
|
+
* @see {@link range} — create a range of integers
|
|
198
|
+
* @see {@link replicate} — repeat a single value
|
|
199
|
+
*
|
|
200
|
+
* @category constructors
|
|
201
|
+
* @since 2.0.0
|
|
202
|
+
*/
|
|
203
|
+
export const makeBy: {
|
|
204
|
+
<A>(f: (i: number) => A): (n: number) => NonEmptyArray<A>
|
|
205
|
+
<A>(n: number, f: (i: number) => A): NonEmptyArray<A>
|
|
206
|
+
} = dual(2, <A>(n: number, f: (i: number) => A) => {
|
|
207
|
+
const max = Math.max(1, Math.floor(n))
|
|
208
|
+
const out = new Array(max)
|
|
209
|
+
for (let i = 0; i < max; i++) {
|
|
210
|
+
out[i] = f(i)
|
|
211
|
+
}
|
|
212
|
+
return out as NonEmptyArray<A>
|
|
213
|
+
})
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Creates a `NonEmptyArray` containing a range of integers, inclusive on both
|
|
217
|
+
* ends.
|
|
218
|
+
*
|
|
219
|
+
* **When to use**
|
|
220
|
+
*
|
|
221
|
+
* Use when you need a non-empty sequence of consecutive integers.
|
|
222
|
+
*
|
|
223
|
+
* **Details**
|
|
224
|
+
*
|
|
225
|
+
* If `start > end`, returns `[start]`.
|
|
226
|
+
*
|
|
227
|
+
* **Example** (Creating a range)
|
|
228
|
+
*
|
|
229
|
+
* ```ts
|
|
230
|
+
* import { Array } from "effect"
|
|
231
|
+
*
|
|
232
|
+
* const result = Array.range(1, 3)
|
|
233
|
+
* console.log(result) // [1, 2, 3]
|
|
234
|
+
* ```
|
|
235
|
+
*
|
|
236
|
+
* @see {@link makeBy} — generate values from a function
|
|
237
|
+
*
|
|
238
|
+
* @category constructors
|
|
239
|
+
* @since 2.0.0
|
|
240
|
+
*/
|
|
241
|
+
export const range = (start: number, end: number): NonEmptyArray<number> =>
|
|
242
|
+
start <= end ? makeBy(end - start + 1, (i) => start + i) : [start]
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Creates a `NonEmptyArray` containing a value repeated `n` times.
|
|
246
|
+
*
|
|
247
|
+
* **When to use**
|
|
248
|
+
*
|
|
249
|
+
* Use when you need a non-empty array containing repeated copies of one value.
|
|
250
|
+
*
|
|
251
|
+
* **Details**
|
|
252
|
+
*
|
|
253
|
+
* `n` is normalized to an integer greater than or equal to 1, so this function
|
|
254
|
+
* always returns at least one element. Supports both data-first and data-last
|
|
255
|
+
* usage.
|
|
256
|
+
*
|
|
257
|
+
* **Example** (Repeating a value)
|
|
258
|
+
*
|
|
259
|
+
* ```ts
|
|
260
|
+
* import { Array } from "effect"
|
|
261
|
+
*
|
|
262
|
+
* const result = Array.replicate("a", 3)
|
|
263
|
+
* console.log(result) // ["a", "a", "a"]
|
|
264
|
+
* ```
|
|
265
|
+
*
|
|
266
|
+
* @see {@link makeBy} — vary values based on index
|
|
267
|
+
*
|
|
268
|
+
* @category constructors
|
|
269
|
+
* @since 2.0.0
|
|
270
|
+
*/
|
|
271
|
+
export const replicate: {
|
|
272
|
+
(n: number): <A>(a: A) => NonEmptyArray<A>
|
|
273
|
+
<A>(a: A, n: number): NonEmptyArray<A>
|
|
274
|
+
} = dual(2, <A>(a: A, n: number): NonEmptyArray<A> => makeBy(n, () => a))
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Converts an `Iterable` to an `Array`.
|
|
278
|
+
*
|
|
279
|
+
* **When to use**
|
|
280
|
+
*
|
|
281
|
+
* Use to convert any `Iterable` (Set, Generator, etc.) into an array.
|
|
282
|
+
*
|
|
283
|
+
* **Details**
|
|
284
|
+
*
|
|
285
|
+
* If the input is already an array, this returns it by reference without
|
|
286
|
+
* copying. Otherwise, it creates a new array from the iterable. Use `copy` if
|
|
287
|
+
* you need a fresh array even when the input is already an array.
|
|
288
|
+
*
|
|
289
|
+
* **Example** (Converting a Set to an array)
|
|
290
|
+
*
|
|
291
|
+
* ```ts
|
|
292
|
+
* import { Array } from "effect"
|
|
293
|
+
*
|
|
294
|
+
* const result = Array.fromIterable(new Set([1, 2, 3]))
|
|
295
|
+
* console.log(result) // [1, 2, 3]
|
|
296
|
+
* ```
|
|
297
|
+
*
|
|
298
|
+
* @see {@link ensure} — wrap a single value or return an existing array
|
|
299
|
+
* @see {@link copy} — create a shallow copy of an array
|
|
300
|
+
*
|
|
301
|
+
* @category constructors
|
|
302
|
+
* @since 2.0.0
|
|
303
|
+
*/
|
|
304
|
+
export const fromIterable = <A>(collection: Iterable<A>): Array<A> =>
|
|
305
|
+
Array.isArray(collection) ? collection : Array.from(collection)
|
|
306
|
+
|
|
307
|
+
/**
|
|
308
|
+
* Normalizes a value that is either a single element or an array into an array.
|
|
309
|
+
*
|
|
310
|
+
* **When to use**
|
|
311
|
+
*
|
|
312
|
+
* Use to normalize input that may be a single value or an array into a consistent
|
|
313
|
+
* array.
|
|
314
|
+
*
|
|
315
|
+
* **Details**
|
|
316
|
+
*
|
|
317
|
+
* If the input is already an array, this returns it by reference. If the input
|
|
318
|
+
* is a single value, this wraps it in a one-element array. This is useful for
|
|
319
|
+
* APIs that accept `A | Array<A>`.
|
|
320
|
+
*
|
|
321
|
+
* **Example** (Normalizing input)
|
|
322
|
+
*
|
|
323
|
+
* ```ts
|
|
324
|
+
* import { Array } from "effect"
|
|
325
|
+
*
|
|
326
|
+
* console.log(Array.ensure("a")) // ["a"]
|
|
327
|
+
* console.log(Array.ensure(["a", "b", "c"])) // ["a", "b", "c"]
|
|
328
|
+
* ```
|
|
329
|
+
*
|
|
330
|
+
* @see {@link of} — always wrap in a single-element array
|
|
331
|
+
* @see {@link fromIterable} — convert any iterable
|
|
332
|
+
*
|
|
333
|
+
* @category constructors
|
|
334
|
+
* @since 3.3.0
|
|
335
|
+
*/
|
|
336
|
+
export const ensure = <A>(self: ReadonlyArray<A> | A): Array<A> => Array.isArray(self) ? self : [self as A]
|
|
337
|
+
|
|
338
|
+
/**
|
|
339
|
+
* Converts a record into an array of `[key, value]` tuples.
|
|
340
|
+
*
|
|
341
|
+
* **When to use**
|
|
342
|
+
*
|
|
343
|
+
* Use to convert a record into an array of key-value tuples for iteration or
|
|
344
|
+
* transformation.
|
|
345
|
+
*
|
|
346
|
+
* **Details**
|
|
347
|
+
*
|
|
348
|
+
* Key order follows `Object.entries` semantics. Empty records produce an empty
|
|
349
|
+
* array.
|
|
350
|
+
*
|
|
351
|
+
* **Example** (Converting a record to entries)
|
|
352
|
+
*
|
|
353
|
+
* ```ts
|
|
354
|
+
* import { Array } from "effect"
|
|
355
|
+
*
|
|
356
|
+
* const result = Array.fromRecord({ a: 1, b: 2, c: 3 })
|
|
357
|
+
* console.log(result) // [["a", 1], ["b", 2], ["c", 3]]
|
|
358
|
+
* ```
|
|
359
|
+
*
|
|
360
|
+
* @see {@link Record.toEntries} the equivalent function from the Record module
|
|
361
|
+
* @see {@link Record.fromEntries} to build a record from an array of tuples
|
|
362
|
+
*
|
|
363
|
+
* @category converting
|
|
364
|
+
* @since 2.0.0
|
|
365
|
+
*/
|
|
366
|
+
export const fromRecord: <K extends string, A>(self: Readonly<Record<K, A>>) => Array<[K, A]> = Record.toEntries
|
|
367
|
+
|
|
368
|
+
/**
|
|
369
|
+
* Converts an `Option` to an array: `Some(a)` becomes `[a]`, `None` becomes `[]`.
|
|
370
|
+
*
|
|
371
|
+
* **When to use**
|
|
372
|
+
*
|
|
373
|
+
* Use to convert a single `Option` into an array for downstream array operations.
|
|
374
|
+
*
|
|
375
|
+
* **Example** (Converting an Option to an array)
|
|
376
|
+
*
|
|
377
|
+
* ```ts
|
|
378
|
+
* import { Array, Option } from "effect"
|
|
379
|
+
*
|
|
380
|
+
* console.log(Array.fromOption(Option.some(1))) // [1]
|
|
381
|
+
* console.log(Array.fromOption(Option.none())) // []
|
|
382
|
+
* ```
|
|
383
|
+
*
|
|
384
|
+
* @see {@link getSomes} — extract `Some` values from an array of Options
|
|
385
|
+
*
|
|
386
|
+
* @category converting
|
|
387
|
+
* @since 2.0.0
|
|
388
|
+
*/
|
|
389
|
+
export const fromOption: <A>(self: Option.Option<A>) => Array<A> = Option.toArray
|
|
390
|
+
|
|
391
|
+
/**
|
|
392
|
+
* Pattern-matches on an array, handling empty and non-empty cases separately.
|
|
393
|
+
*
|
|
394
|
+
* **When to use**
|
|
395
|
+
*
|
|
396
|
+
* Use when you need to branch on whether an array is empty.
|
|
397
|
+
*
|
|
398
|
+
* **Details**
|
|
399
|
+
*
|
|
400
|
+
* `onNonEmpty` receives a `NonEmptyReadonlyArray`. Supports both data-first and
|
|
401
|
+
* data-last usage.
|
|
402
|
+
*
|
|
403
|
+
* **Example** (Branching on emptiness)
|
|
404
|
+
*
|
|
405
|
+
* ```ts
|
|
406
|
+
* import { Array } from "effect"
|
|
407
|
+
*
|
|
408
|
+
* const describe = Array.match({
|
|
409
|
+
* onEmpty: () => "empty",
|
|
410
|
+
* onNonEmpty: ([head, ...tail]) => `head: ${head}, tail: ${tail.length}`
|
|
411
|
+
* })
|
|
412
|
+
* console.log(describe([])) // "empty"
|
|
413
|
+
* console.log(describe([1, 2, 3])) // "head: 1, tail: 2"
|
|
414
|
+
* ```
|
|
415
|
+
*
|
|
416
|
+
* @see {@link matchLeft} — destructures into head + tail
|
|
417
|
+
* @see {@link matchRight} — destructures into init + last
|
|
418
|
+
*
|
|
419
|
+
* @category pattern matching
|
|
420
|
+
* @since 2.0.0
|
|
421
|
+
*/
|
|
422
|
+
export const match: {
|
|
423
|
+
<B, A, C = B>(
|
|
424
|
+
options: {
|
|
425
|
+
readonly onEmpty: LazyArg<B>
|
|
426
|
+
readonly onNonEmpty: (self: NonEmptyReadonlyArray<A>) => C
|
|
427
|
+
}
|
|
428
|
+
): (self: ReadonlyArray<A>) => B | C
|
|
429
|
+
<A, B, C = B>(
|
|
430
|
+
self: ReadonlyArray<A>,
|
|
431
|
+
options: {
|
|
432
|
+
readonly onEmpty: LazyArg<B>
|
|
433
|
+
readonly onNonEmpty: (self: NonEmptyReadonlyArray<A>) => C
|
|
434
|
+
}
|
|
435
|
+
): B | C
|
|
436
|
+
} = dual(2, <A, B, C = B>(
|
|
437
|
+
self: ReadonlyArray<A>,
|
|
438
|
+
{ onEmpty, onNonEmpty }: {
|
|
439
|
+
readonly onEmpty: LazyArg<B>
|
|
440
|
+
readonly onNonEmpty: (self: NonEmptyReadonlyArray<A>) => C
|
|
441
|
+
}
|
|
442
|
+
): B | C => isReadonlyArrayNonEmpty(self) ? onNonEmpty(self) : onEmpty())
|
|
443
|
+
|
|
444
|
+
/**
|
|
445
|
+
* Pattern-matches on an array from the left, providing the first element and
|
|
446
|
+
* the remaining elements separately.
|
|
447
|
+
*
|
|
448
|
+
* **When to use**
|
|
449
|
+
*
|
|
450
|
+
* Use when you need to branch on an array and handle the non-empty case as the
|
|
451
|
+
* first element plus the remaining elements.
|
|
452
|
+
*
|
|
453
|
+
* **Details**
|
|
454
|
+
*
|
|
455
|
+
* `onNonEmpty` receives `(head, tail)` where `tail` is the rest of the array.
|
|
456
|
+
*
|
|
457
|
+
* **Example** (Destructuring head and tail)
|
|
458
|
+
*
|
|
459
|
+
* ```ts
|
|
460
|
+
* import { Array } from "effect"
|
|
461
|
+
*
|
|
462
|
+
* const matchLeft = Array.matchLeft({
|
|
463
|
+
* onEmpty: () => "empty",
|
|
464
|
+
* onNonEmpty: (head, tail) => `head: ${head}, tail: ${tail.length}`
|
|
465
|
+
* })
|
|
466
|
+
* console.log(matchLeft([])) // "empty"
|
|
467
|
+
* console.log(matchLeft([1, 2, 3])) // "head: 1, tail: 2"
|
|
468
|
+
* ```
|
|
469
|
+
*
|
|
470
|
+
* @see {@link match} — receives the full non-empty array
|
|
471
|
+
* @see {@link matchRight} — destructures into init + last
|
|
472
|
+
*
|
|
473
|
+
* @category pattern matching
|
|
474
|
+
* @since 2.0.0
|
|
475
|
+
*/
|
|
476
|
+
export const matchLeft: {
|
|
477
|
+
<B, A, C = B>(
|
|
478
|
+
options: {
|
|
479
|
+
readonly onEmpty: LazyArg<B>
|
|
480
|
+
readonly onNonEmpty: (head: A, tail: Array<A>) => C
|
|
481
|
+
}
|
|
482
|
+
): (self: ReadonlyArray<A>) => B | C
|
|
483
|
+
<A, B, C = B>(
|
|
484
|
+
self: ReadonlyArray<A>,
|
|
485
|
+
options: {
|
|
486
|
+
readonly onEmpty: LazyArg<B>
|
|
487
|
+
readonly onNonEmpty: (head: A, tail: Array<A>) => C
|
|
488
|
+
}
|
|
489
|
+
): B | C
|
|
490
|
+
} = dual(2, <A, B, C = B>(
|
|
491
|
+
self: ReadonlyArray<A>,
|
|
492
|
+
{ onEmpty, onNonEmpty }: {
|
|
493
|
+
readonly onEmpty: LazyArg<B>
|
|
494
|
+
readonly onNonEmpty: (head: A, tail: Array<A>) => C
|
|
495
|
+
}
|
|
496
|
+
): B | C => isReadonlyArrayNonEmpty(self) ? onNonEmpty(headNonEmpty(self), tailNonEmpty(self)) : onEmpty())
|
|
497
|
+
|
|
498
|
+
/**
|
|
499
|
+
* Pattern-matches on an array from the right, providing all elements except the
|
|
500
|
+
* last and the last element separately.
|
|
501
|
+
*
|
|
502
|
+
* **When to use**
|
|
503
|
+
*
|
|
504
|
+
* Use when you need to branch on an array and handle the non-empty case as the
|
|
505
|
+
* elements before the last plus the last element.
|
|
506
|
+
*
|
|
507
|
+
* **Details**
|
|
508
|
+
*
|
|
509
|
+
* `onNonEmpty` receives `(init, last)` where `init` is everything but the last element.
|
|
510
|
+
*
|
|
511
|
+
* **Example** (Destructuring init and last)
|
|
512
|
+
*
|
|
513
|
+
* ```ts
|
|
514
|
+
* import { Array } from "effect"
|
|
515
|
+
*
|
|
516
|
+
* const matchRight = Array.matchRight({
|
|
517
|
+
* onEmpty: () => "empty",
|
|
518
|
+
* onNonEmpty: (init, last) => `init: ${init.length}, last: ${last}`
|
|
519
|
+
* })
|
|
520
|
+
* console.log(matchRight([])) // "empty"
|
|
521
|
+
* console.log(matchRight([1, 2, 3])) // "init: 2, last: 3"
|
|
522
|
+
* ```
|
|
523
|
+
*
|
|
524
|
+
* @see {@link match} — receives the full non-empty array
|
|
525
|
+
* @see {@link matchLeft} — destructures into head + tail
|
|
526
|
+
*
|
|
527
|
+
* @category pattern matching
|
|
528
|
+
* @since 2.0.0
|
|
529
|
+
*/
|
|
530
|
+
export const matchRight: {
|
|
531
|
+
<B, A, C = B>(
|
|
532
|
+
options: {
|
|
533
|
+
readonly onEmpty: LazyArg<B>
|
|
534
|
+
readonly onNonEmpty: (init: Array<A>, last: A) => C
|
|
535
|
+
}
|
|
536
|
+
): (self: ReadonlyArray<A>) => B | C
|
|
537
|
+
<A, B, C = B>(
|
|
538
|
+
self: ReadonlyArray<A>,
|
|
539
|
+
options: {
|
|
540
|
+
readonly onEmpty: LazyArg<B>
|
|
541
|
+
readonly onNonEmpty: (init: Array<A>, last: A) => C
|
|
542
|
+
}
|
|
543
|
+
): B | C
|
|
544
|
+
} = dual(2, <A, B, C = B>(
|
|
545
|
+
self: ReadonlyArray<A>,
|
|
546
|
+
{ onEmpty, onNonEmpty }: {
|
|
547
|
+
readonly onEmpty: LazyArg<B>
|
|
548
|
+
readonly onNonEmpty: (init: Array<A>, last: A) => C
|
|
549
|
+
}
|
|
550
|
+
): B | C =>
|
|
551
|
+
isReadonlyArrayNonEmpty(self) ?
|
|
552
|
+
onNonEmpty(initNonEmpty(self), lastNonEmpty(self)) :
|
|
553
|
+
onEmpty())
|
|
554
|
+
|
|
555
|
+
/**
|
|
556
|
+
* Adds a single element to the front of an iterable, returning a `NonEmptyArray`.
|
|
557
|
+
*
|
|
558
|
+
* **When to use**
|
|
559
|
+
*
|
|
560
|
+
* Use when you need to guarantee a non-empty result after adding a required
|
|
561
|
+
* leading value.
|
|
562
|
+
*
|
|
563
|
+
* **Example** (Prepending an element)
|
|
564
|
+
*
|
|
565
|
+
* ```ts
|
|
566
|
+
* import { Array } from "effect"
|
|
567
|
+
*
|
|
568
|
+
* const result = Array.prepend([2, 3, 4], 1)
|
|
569
|
+
* console.log(result) // [1, 2, 3, 4]
|
|
570
|
+
* ```
|
|
571
|
+
*
|
|
572
|
+
* @see {@link append} — add to the end
|
|
573
|
+
* @see {@link prependAll} — prepend multiple elements
|
|
574
|
+
*
|
|
575
|
+
* @category combining
|
|
576
|
+
* @since 2.0.0
|
|
577
|
+
*/
|
|
578
|
+
export const prepend: {
|
|
579
|
+
<B>(head: B): <A>(self: Iterable<A>) => NonEmptyArray<A | B>
|
|
580
|
+
<A, B>(self: Iterable<A>, head: B): NonEmptyArray<A | B>
|
|
581
|
+
} = dual(2, <A, B>(self: Iterable<A>, head: B): NonEmptyArray<A | B> => [head, ...self])
|
|
582
|
+
|
|
583
|
+
/**
|
|
584
|
+
* Prepends all elements from a prefix iterable to the front of an array.
|
|
585
|
+
*
|
|
586
|
+
* **When to use**
|
|
587
|
+
*
|
|
588
|
+
* Use to prepend multiple elements from an iterable to the front of an array.
|
|
589
|
+
*
|
|
590
|
+
* **Details**
|
|
591
|
+
*
|
|
592
|
+
* If either input is non-empty, the result is a `NonEmptyArray`.
|
|
593
|
+
*
|
|
594
|
+
* **Example** (Prepending multiple elements)
|
|
595
|
+
*
|
|
596
|
+
* ```ts
|
|
597
|
+
* import { Array } from "effect"
|
|
598
|
+
*
|
|
599
|
+
* const result = Array.prependAll([2, 3], [0, 1])
|
|
600
|
+
* console.log(result) // [0, 1, 2, 3]
|
|
601
|
+
* ```
|
|
602
|
+
*
|
|
603
|
+
* @see {@link prepend} — add a single element to the front
|
|
604
|
+
* @see {@link appendAll} — add elements to the end
|
|
605
|
+
*
|
|
606
|
+
* @category combining
|
|
607
|
+
* @since 2.0.0
|
|
608
|
+
*/
|
|
609
|
+
export const prependAll: {
|
|
610
|
+
<S extends Iterable<any>, T extends Iterable<any>>(
|
|
611
|
+
that: T
|
|
612
|
+
): (self: S) => ReadonlyArray.OrNonEmpty<S, T, ReadonlyArray.Infer<S> | ReadonlyArray.Infer<T>>
|
|
613
|
+
<A, B>(self: Iterable<A>, that: NonEmptyReadonlyArray<B>): NonEmptyArray<A | B>
|
|
614
|
+
<A, B>(self: NonEmptyReadonlyArray<A>, that: Iterable<B>): NonEmptyArray<A | B>
|
|
615
|
+
<A, B>(self: Iterable<A>, that: Iterable<B>): Array<A | B>
|
|
616
|
+
} = dual(
|
|
617
|
+
2,
|
|
618
|
+
<A>(self: Iterable<A>, that: Iterable<A>): Array<A> => fromIterable(that).concat(fromIterable(self))
|
|
619
|
+
)
|
|
620
|
+
|
|
621
|
+
/**
|
|
622
|
+
* Adds a single element to the end of an iterable, returning a `NonEmptyArray`.
|
|
623
|
+
*
|
|
624
|
+
* **When to use**
|
|
625
|
+
*
|
|
626
|
+
* Use when you need to guarantee a non-empty result after adding a required
|
|
627
|
+
* trailing value.
|
|
628
|
+
*
|
|
629
|
+
* **Example** (Appending an element)
|
|
630
|
+
*
|
|
631
|
+
* ```ts
|
|
632
|
+
* import { Array } from "effect"
|
|
633
|
+
*
|
|
634
|
+
* const result = Array.append([1, 2, 3], 4)
|
|
635
|
+
* console.log(result) // [1, 2, 3, 4]
|
|
636
|
+
* ```
|
|
637
|
+
*
|
|
638
|
+
* @see {@link prepend} — add to the front
|
|
639
|
+
* @see {@link appendAll} — append multiple elements
|
|
640
|
+
*
|
|
641
|
+
* @category combining
|
|
642
|
+
* @since 2.0.0
|
|
643
|
+
*/
|
|
644
|
+
export const append: {
|
|
645
|
+
<B>(last: B): <A>(self: Iterable<A>) => NonEmptyArray<A | B>
|
|
646
|
+
<A, B>(self: Iterable<A>, last: B): NonEmptyArray<A | B>
|
|
647
|
+
} = dual(2, <A, B>(self: Iterable<A>, last: B): Array<A | B> => [...self, last])
|
|
648
|
+
|
|
649
|
+
/**
|
|
650
|
+
* Concatenates two iterables into a single array.
|
|
651
|
+
*
|
|
652
|
+
* **When to use**
|
|
653
|
+
*
|
|
654
|
+
* Use to combine two iterable inputs into a new array with the second input's
|
|
655
|
+
* elements after the first.
|
|
656
|
+
*
|
|
657
|
+
* **Details**
|
|
658
|
+
*
|
|
659
|
+
* If either input is non-empty, the result is a `NonEmptyArray`.
|
|
660
|
+
*
|
|
661
|
+
* **Example** (Concatenating arrays)
|
|
662
|
+
*
|
|
663
|
+
* ```ts
|
|
664
|
+
* import { Array } from "effect"
|
|
665
|
+
*
|
|
666
|
+
* const result = Array.appendAll([1, 2], [3, 4])
|
|
667
|
+
* console.log(result) // [1, 2, 3, 4]
|
|
668
|
+
* ```
|
|
669
|
+
*
|
|
670
|
+
* @see {@link append} — add a single element to the end
|
|
671
|
+
* @see {@link prependAll} — add elements to the front
|
|
672
|
+
*
|
|
673
|
+
* @category combining
|
|
674
|
+
* @since 2.0.0
|
|
675
|
+
*/
|
|
676
|
+
export const appendAll: {
|
|
677
|
+
<S extends Iterable<any>, T extends Iterable<any>>(
|
|
678
|
+
that: T
|
|
679
|
+
): (self: S) => ReadonlyArray.OrNonEmpty<S, T, ReadonlyArray.Infer<S> | ReadonlyArray.Infer<T>>
|
|
680
|
+
<A, B>(self: Iterable<A>, that: NonEmptyReadonlyArray<B>): NonEmptyArray<A | B>
|
|
681
|
+
<A, B>(self: NonEmptyReadonlyArray<A>, that: Iterable<B>): NonEmptyArray<A | B>
|
|
682
|
+
<A, B>(self: Iterable<A>, that: Iterable<B>): Array<A | B>
|
|
683
|
+
} = dual(
|
|
684
|
+
2,
|
|
685
|
+
<A>(self: Iterable<A>, that: Iterable<A>): Array<A> => fromIterable(self).concat(fromIterable(that))
|
|
686
|
+
)
|
|
687
|
+
|
|
688
|
+
/**
|
|
689
|
+
* Folds left-to-right while keeping every intermediate accumulator value.
|
|
690
|
+
*
|
|
691
|
+
* **When to use**
|
|
692
|
+
*
|
|
693
|
+
* Use to compute a running accumulator where each intermediate value is needed.
|
|
694
|
+
*
|
|
695
|
+
* **Details**
|
|
696
|
+
*
|
|
697
|
+
* The output length is `input.length + 1` because it starts with the initial
|
|
698
|
+
* value. The result is always a `NonEmptyArray`. Use `reduce` if you only need
|
|
699
|
+
* the final accumulated value.
|
|
700
|
+
*
|
|
701
|
+
* **Example** (Running totals)
|
|
702
|
+
*
|
|
703
|
+
* ```ts
|
|
704
|
+
* import { Array } from "effect"
|
|
705
|
+
*
|
|
706
|
+
* const result = Array.scan([1, 2, 3, 4], 0, (acc, value) => acc + value)
|
|
707
|
+
* console.log(result) // [0, 1, 3, 6, 10]
|
|
708
|
+
* ```
|
|
709
|
+
*
|
|
710
|
+
* @see {@link scanRight} — right-to-left scan
|
|
711
|
+
* @see {@link reduce} — fold without intermediate values
|
|
712
|
+
*
|
|
713
|
+
* @category folding
|
|
714
|
+
* @since 2.0.0
|
|
715
|
+
*/
|
|
716
|
+
export const scan: {
|
|
717
|
+
<B, A>(b: B, f: (b: B, a: A) => B): (self: Iterable<A>) => NonEmptyArray<B>
|
|
718
|
+
<A, B>(self: Iterable<A>, b: B, f: (b: B, a: A) => B): NonEmptyArray<B>
|
|
719
|
+
} = dual(3, <A, B>(self: Iterable<A>, b: B, f: (b: B, a: A) => B): NonEmptyArray<B> => {
|
|
720
|
+
const out: NonEmptyArray<B> = [b]
|
|
721
|
+
let i = 0
|
|
722
|
+
for (const a of self) {
|
|
723
|
+
out[i + 1] = f(out[i], a)
|
|
724
|
+
i++
|
|
725
|
+
}
|
|
726
|
+
return out
|
|
727
|
+
})
|
|
728
|
+
|
|
729
|
+
/**
|
|
730
|
+
* Folds right-to-left while keeping every intermediate accumulator value.
|
|
731
|
+
*
|
|
732
|
+
* **When to use**
|
|
733
|
+
*
|
|
734
|
+
* Use to compute a running accumulator from right to left where each intermediate
|
|
735
|
+
* value is needed.
|
|
736
|
+
*
|
|
737
|
+
* **Details**
|
|
738
|
+
*
|
|
739
|
+
* The output length is `input.length + 1` because it ends with the initial
|
|
740
|
+
* value. The result is always a `NonEmptyArray`.
|
|
741
|
+
*
|
|
742
|
+
* **Example** (Scanning running totals in reverse)
|
|
743
|
+
*
|
|
744
|
+
* ```ts
|
|
745
|
+
* import { Array } from "effect"
|
|
746
|
+
*
|
|
747
|
+
* const result = Array.scanRight([1, 2, 3, 4], 0, (acc, value) => acc + value)
|
|
748
|
+
* console.log(result) // [10, 9, 7, 4, 0]
|
|
749
|
+
* ```
|
|
750
|
+
*
|
|
751
|
+
* @see {@link scan} — left-to-right scan
|
|
752
|
+
* @see {@link reduceRight} — fold without intermediate values
|
|
753
|
+
*
|
|
754
|
+
* @category folding
|
|
755
|
+
* @since 2.0.0
|
|
756
|
+
*/
|
|
757
|
+
export const scanRight: {
|
|
758
|
+
<B, A>(b: B, f: (b: B, a: A) => B): (self: Iterable<A>) => NonEmptyArray<B>
|
|
759
|
+
<A, B>(self: Iterable<A>, b: B, f: (b: B, a: A) => B): NonEmptyArray<B>
|
|
760
|
+
} = dual(3, <A, B>(self: Iterable<A>, b: B, f: (b: B, a: A) => B): NonEmptyArray<B> => {
|
|
761
|
+
const input = fromIterable(self)
|
|
762
|
+
const out: NonEmptyArray<B> = new Array(input.length + 1) as any
|
|
763
|
+
out[input.length] = b
|
|
764
|
+
for (let i = input.length - 1; i >= 0; i--) {
|
|
765
|
+
out[i] = f(out[i + 1], input[i])
|
|
766
|
+
}
|
|
767
|
+
return out
|
|
768
|
+
})
|
|
769
|
+
|
|
770
|
+
/**
|
|
771
|
+
* Checks whether a value is an `Array`.
|
|
772
|
+
*
|
|
773
|
+
* **When to use**
|
|
774
|
+
*
|
|
775
|
+
* Use to verify a value is a mutable array, narrowing its type to `Array<unknown>`.
|
|
776
|
+
*
|
|
777
|
+
* **Details**
|
|
778
|
+
*
|
|
779
|
+
* Acts as a type guard narrowing the input to `Array<unknown>` and delegates to
|
|
780
|
+
* `globalThis.Array.isArray`.
|
|
781
|
+
*
|
|
782
|
+
* **Example** (Type-guarding an unknown value)
|
|
783
|
+
*
|
|
784
|
+
* ```ts
|
|
785
|
+
* import { Array } from "effect"
|
|
786
|
+
*
|
|
787
|
+
* console.log(Array.isArray(null)) // false
|
|
788
|
+
* console.log(Array.isArray([1, 2, 3])) // true
|
|
789
|
+
* ```
|
|
790
|
+
*
|
|
791
|
+
* @see {@link isArrayEmpty} — check for an empty array
|
|
792
|
+
* @see {@link isArrayNonEmpty} — check for a non-empty array
|
|
793
|
+
*
|
|
794
|
+
* @category guards
|
|
795
|
+
* @since 2.0.0
|
|
796
|
+
*/
|
|
797
|
+
export const isArray: {
|
|
798
|
+
(self: unknown): self is Array<unknown>
|
|
799
|
+
<T>(self: T): self is Extract<T, ReadonlyArray<any>>
|
|
800
|
+
} = Array.isArray
|
|
801
|
+
|
|
802
|
+
/**
|
|
803
|
+
* Checks whether a mutable `Array` is empty, narrowing the type to `[]`.
|
|
804
|
+
*
|
|
805
|
+
* **Example** (Checking for an empty array)
|
|
806
|
+
*
|
|
807
|
+
* ```ts
|
|
808
|
+
* import { Array } from "effect"
|
|
809
|
+
*
|
|
810
|
+
* console.log(Array.isArrayEmpty([])) // true
|
|
811
|
+
* console.log(Array.isArrayEmpty([1, 2, 3])) // false
|
|
812
|
+
* ```
|
|
813
|
+
*
|
|
814
|
+
* @see {@link isReadonlyArrayEmpty} — readonly variant
|
|
815
|
+
* @see {@link isArrayNonEmpty} — opposite check
|
|
816
|
+
*
|
|
817
|
+
* @category guards
|
|
818
|
+
* @since 4.0.0
|
|
819
|
+
*/
|
|
820
|
+
export const isArrayEmpty = <A>(self: Array<A>): self is [] => self.length === 0
|
|
821
|
+
|
|
822
|
+
/**
|
|
823
|
+
* Checks whether a `ReadonlyArray` is empty, narrowing the type to `readonly []`.
|
|
824
|
+
*
|
|
825
|
+
* **Example** (Checking for an empty readonly array)
|
|
826
|
+
*
|
|
827
|
+
* ```ts
|
|
828
|
+
* import { Array } from "effect"
|
|
829
|
+
*
|
|
830
|
+
* console.log(Array.isReadonlyArrayEmpty([])) // true
|
|
831
|
+
* console.log(Array.isReadonlyArrayEmpty([1, 2, 3])) // false
|
|
832
|
+
* ```
|
|
833
|
+
*
|
|
834
|
+
* @see {@link isArrayEmpty} — mutable variant
|
|
835
|
+
* @see {@link isReadonlyArrayNonEmpty} — opposite check
|
|
836
|
+
*
|
|
837
|
+
* @category guards
|
|
838
|
+
* @since 4.0.0
|
|
839
|
+
*/
|
|
840
|
+
export const isReadonlyArrayEmpty: <A>(self: ReadonlyArray<A>) => self is readonly [] = isArrayEmpty as any
|
|
841
|
+
|
|
842
|
+
/**
|
|
843
|
+
* Checks whether a mutable `Array` is non-empty, narrowing the type to
|
|
844
|
+
* `NonEmptyArray`.
|
|
845
|
+
*
|
|
846
|
+
* **When to use**
|
|
847
|
+
*
|
|
848
|
+
* Use when you need the narrowed value to remain a mutable `Array` after proving
|
|
849
|
+
* it has at least one element.
|
|
850
|
+
*
|
|
851
|
+
* **Example** (Checking for a non-empty array)
|
|
852
|
+
*
|
|
853
|
+
* ```ts
|
|
854
|
+
* import { Array } from "effect"
|
|
855
|
+
*
|
|
856
|
+
* console.log(Array.isArrayNonEmpty([])) // false
|
|
857
|
+
* console.log(Array.isArrayNonEmpty([1, 2, 3])) // true
|
|
858
|
+
* ```
|
|
859
|
+
*
|
|
860
|
+
* @see {@link isReadonlyArrayNonEmpty} — readonly variant
|
|
861
|
+
* @see {@link isArrayEmpty} — opposite check
|
|
862
|
+
*
|
|
863
|
+
* @category guards
|
|
864
|
+
* @since 4.0.0
|
|
865
|
+
*/
|
|
866
|
+
export const isArrayNonEmpty: <A>(self: Array<A>) => self is NonEmptyArray<A> = internalArray.isArrayNonEmpty
|
|
867
|
+
|
|
868
|
+
/**
|
|
869
|
+
* Checks whether a `ReadonlyArray` is non-empty, narrowing the type to
|
|
870
|
+
* `NonEmptyReadonlyArray`.
|
|
871
|
+
*
|
|
872
|
+
* **When to use**
|
|
873
|
+
*
|
|
874
|
+
* Use when you need to prove a readonly array has at least one element without
|
|
875
|
+
* requiring mutable array methods afterward.
|
|
876
|
+
*
|
|
877
|
+
* **Example** (Checking for a non-empty readonly array)
|
|
878
|
+
*
|
|
879
|
+
* ```ts
|
|
880
|
+
* import { Array } from "effect"
|
|
881
|
+
*
|
|
882
|
+
* console.log(Array.isReadonlyArrayNonEmpty([])) // false
|
|
883
|
+
* console.log(Array.isReadonlyArrayNonEmpty([1, 2, 3])) // true
|
|
884
|
+
* ```
|
|
885
|
+
*
|
|
886
|
+
* @see {@link isArrayNonEmpty} — mutable variant
|
|
887
|
+
* @see {@link isReadonlyArrayEmpty} — opposite check
|
|
888
|
+
*
|
|
889
|
+
* @category guards
|
|
890
|
+
* @since 4.0.0
|
|
891
|
+
*/
|
|
892
|
+
export const isReadonlyArrayNonEmpty: <A>(self: ReadonlyArray<A>) => self is NonEmptyReadonlyArray<A> =
|
|
893
|
+
internalArray.isArrayNonEmpty
|
|
894
|
+
|
|
895
|
+
/**
|
|
896
|
+
* Returns the number of elements in a `ReadonlyArray`.
|
|
897
|
+
*
|
|
898
|
+
* **When to use**
|
|
899
|
+
*
|
|
900
|
+
* Use when you need length as a composable function rather than a property access.
|
|
901
|
+
*
|
|
902
|
+
* **Example** (Getting the length)
|
|
903
|
+
*
|
|
904
|
+
* ```ts
|
|
905
|
+
* import { Array } from "effect"
|
|
906
|
+
*
|
|
907
|
+
* console.log(Array.length([1, 2, 3])) // 3
|
|
908
|
+
* ```
|
|
909
|
+
*
|
|
910
|
+
* @category getters
|
|
911
|
+
* @since 2.0.0
|
|
912
|
+
*/
|
|
913
|
+
export const length = <A>(self: ReadonlyArray<A>): number => self.length
|
|
914
|
+
|
|
915
|
+
/** @internal */
|
|
916
|
+
export function isOutOfBounds<A>(i: number, as: ReadonlyArray<A>): boolean {
|
|
917
|
+
return i < 0 || i >= as.length
|
|
918
|
+
}
|
|
919
|
+
|
|
920
|
+
const clamp = <A>(i: number, as: ReadonlyArray<A>): number => Math.floor(Math.min(Math.max(0, i), as.length))
|
|
921
|
+
|
|
922
|
+
/**
|
|
923
|
+
* Reads an element at the given index safely, returning `Option.some` or
|
|
924
|
+
* `Option.none` if the index is out of bounds.
|
|
925
|
+
*
|
|
926
|
+
* **When to use**
|
|
927
|
+
*
|
|
928
|
+
* Use when you need to read an array element by index and handle an
|
|
929
|
+
* out-of-bounds index as `Option.none`.
|
|
930
|
+
*
|
|
931
|
+
* **Details**
|
|
932
|
+
*
|
|
933
|
+
* The index is floored to an integer. This never throws.
|
|
934
|
+
*
|
|
935
|
+
* **Example** (Accessing indexes safely)
|
|
936
|
+
*
|
|
937
|
+
* ```ts
|
|
938
|
+
* import { Array } from "effect"
|
|
939
|
+
*
|
|
940
|
+
* console.log(Array.get([1, 2, 3], 1)) // Some(2)
|
|
941
|
+
* console.log(Array.get([1, 2, 3], 10)) // None
|
|
942
|
+
* ```
|
|
943
|
+
*
|
|
944
|
+
* @see {@link getUnsafe} for indexed access that throws when the index is out of bounds
|
|
945
|
+
* @see {@link head} for reading the first element as an `Option`
|
|
946
|
+
* @see {@link last} for reading the last element as an `Option`
|
|
947
|
+
*
|
|
948
|
+
* @category getters
|
|
949
|
+
* @since 2.0.0
|
|
950
|
+
*/
|
|
951
|
+
export const get: {
|
|
952
|
+
(index: number): <A>(self: ReadonlyArray<A>) => Option.Option<A>
|
|
953
|
+
<A>(self: ReadonlyArray<A>, index: number): Option.Option<A>
|
|
954
|
+
} = dual(2, <A>(self: ReadonlyArray<A>, index: number): Option.Option<A> => {
|
|
955
|
+
const i = Math.floor(index)
|
|
956
|
+
return isOutOfBounds(i, self) ? Option.none() : Option.some(self[i])
|
|
957
|
+
})
|
|
958
|
+
|
|
959
|
+
/**
|
|
960
|
+
* Reads an element at the given index, throwing if the index is out of bounds.
|
|
961
|
+
*
|
|
962
|
+
* **When to use**
|
|
963
|
+
*
|
|
964
|
+
* Use to read an array element at a known valid index when out-of-bounds would
|
|
965
|
+
* be a programming error.
|
|
966
|
+
*
|
|
967
|
+
* **Details**
|
|
968
|
+
*
|
|
969
|
+
* Throws an `Error` with the message `"Index out of bounds: <i>"`. Prefer
|
|
970
|
+
* `get` for safe access.
|
|
971
|
+
*
|
|
972
|
+
* **Example** (Accessing indexes unsafely)
|
|
973
|
+
*
|
|
974
|
+
* ```ts
|
|
975
|
+
* import { Array } from "effect"
|
|
976
|
+
*
|
|
977
|
+
* console.log(Array.getUnsafe([1, 2, 3], 1)) // 2
|
|
978
|
+
* // Array.getUnsafe([1, 2, 3], 10) // throws Error
|
|
979
|
+
* ```
|
|
980
|
+
*
|
|
981
|
+
* @see {@link get} — safe version returning `Option`
|
|
982
|
+
*
|
|
983
|
+
* @category unsafe
|
|
984
|
+
* @since 4.0.0
|
|
985
|
+
*/
|
|
986
|
+
export const getUnsafe: {
|
|
987
|
+
(index: number): <A>(self: ReadonlyArray<A>) => A
|
|
988
|
+
<A>(self: ReadonlyArray<A>, index: number): A
|
|
989
|
+
} = dual(2, <A>(self: ReadonlyArray<A>, index: number): A => {
|
|
990
|
+
const i = Math.floor(index)
|
|
991
|
+
if (isOutOfBounds(i, self)) {
|
|
992
|
+
throw new Error(`Index out of bounds: ${i}`)
|
|
993
|
+
}
|
|
994
|
+
return self[i]
|
|
995
|
+
})
|
|
996
|
+
|
|
997
|
+
/**
|
|
998
|
+
* Splits a non-empty array into its first element and the remaining elements.
|
|
999
|
+
*
|
|
1000
|
+
* **When to use**
|
|
1001
|
+
*
|
|
1002
|
+
* Use when you have a `NonEmptyReadonlyArray` and need both its first element
|
|
1003
|
+
* and the remaining elements as separate values.
|
|
1004
|
+
*
|
|
1005
|
+
* **Details**
|
|
1006
|
+
*
|
|
1007
|
+
* Returns a tuple `[head, tail]` and requires a `NonEmptyReadonlyArray`.
|
|
1008
|
+
*
|
|
1009
|
+
* **Example** (Destructuring head and tail)
|
|
1010
|
+
*
|
|
1011
|
+
* ```ts
|
|
1012
|
+
* import { Array } from "effect"
|
|
1013
|
+
*
|
|
1014
|
+
* const result = Array.unprepend([1, 2, 3, 4])
|
|
1015
|
+
* console.log(result) // [1, [2, 3, 4]]
|
|
1016
|
+
* ```
|
|
1017
|
+
*
|
|
1018
|
+
* @see {@link unappend} for splitting a non-empty array into init and last
|
|
1019
|
+
* @see {@link headNonEmpty} for getting only the first element
|
|
1020
|
+
* @see {@link tailNonEmpty} for getting only the elements after the first
|
|
1021
|
+
*
|
|
1022
|
+
* @category splitting
|
|
1023
|
+
* @since 2.0.0
|
|
1024
|
+
*/
|
|
1025
|
+
export const unprepend = <A>(
|
|
1026
|
+
self: NonEmptyReadonlyArray<A>
|
|
1027
|
+
): [firstElement: A, remainingElements: Array<A>] => [headNonEmpty(self), tailNonEmpty(self)]
|
|
1028
|
+
|
|
1029
|
+
/**
|
|
1030
|
+
* Splits a non-empty array into all elements except the last, and the last
|
|
1031
|
+
* element.
|
|
1032
|
+
*
|
|
1033
|
+
* **When to use**
|
|
1034
|
+
*
|
|
1035
|
+
* Use when you need to split a non-empty array into the elements before the
|
|
1036
|
+
* last element and the last element.
|
|
1037
|
+
*
|
|
1038
|
+
* **Details**
|
|
1039
|
+
*
|
|
1040
|
+
* Returns a tuple `[init, last]` and requires a `NonEmptyReadonlyArray`.
|
|
1041
|
+
*
|
|
1042
|
+
* **Example** (Destructuring init and last)
|
|
1043
|
+
*
|
|
1044
|
+
* ```ts
|
|
1045
|
+
* import { Array } from "effect"
|
|
1046
|
+
*
|
|
1047
|
+
* const result = Array.unappend([1, 2, 3, 4])
|
|
1048
|
+
* console.log(result) // [[1, 2, 3], 4]
|
|
1049
|
+
* ```
|
|
1050
|
+
*
|
|
1051
|
+
* @see {@link unprepend} for splitting a non-empty array into head and tail
|
|
1052
|
+
* @see {@link initNonEmpty} for getting only the elements before the last
|
|
1053
|
+
* @see {@link lastNonEmpty} for getting only the last element
|
|
1054
|
+
*
|
|
1055
|
+
* @category splitting
|
|
1056
|
+
* @since 2.0.0
|
|
1057
|
+
*/
|
|
1058
|
+
export const unappend = <A>(
|
|
1059
|
+
self: NonEmptyReadonlyArray<A>
|
|
1060
|
+
): [arrayWithoutLastElement: Array<A>, lastElement: A] => [initNonEmpty(self), lastNonEmpty(self)]
|
|
1061
|
+
|
|
1062
|
+
/**
|
|
1063
|
+
* Returns the first element of an array safely wrapped in `Option.some`, or
|
|
1064
|
+
* `Option.none` if the array is empty.
|
|
1065
|
+
*
|
|
1066
|
+
* **When to use**
|
|
1067
|
+
*
|
|
1068
|
+
* Use to safely get the first element of an array that may be empty.
|
|
1069
|
+
*
|
|
1070
|
+
* **Example** (Getting the first element)
|
|
1071
|
+
*
|
|
1072
|
+
* ```ts
|
|
1073
|
+
* import { Array } from "effect"
|
|
1074
|
+
*
|
|
1075
|
+
* console.log(Array.head([1, 2, 3])) // Some(1)
|
|
1076
|
+
* console.log(Array.head([])) // None
|
|
1077
|
+
* ```
|
|
1078
|
+
*
|
|
1079
|
+
* @see {@link headNonEmpty} — direct access when array is known non-empty
|
|
1080
|
+
* @see {@link last} — get the last element
|
|
1081
|
+
*
|
|
1082
|
+
* @category getters
|
|
1083
|
+
* @since 2.0.0
|
|
1084
|
+
*/
|
|
1085
|
+
export const head: <A>(self: ReadonlyArray<A>) => Option.Option<A> = get(0)
|
|
1086
|
+
|
|
1087
|
+
/**
|
|
1088
|
+
* Returns the first element of a `NonEmptyReadonlyArray` directly (no `Option`
|
|
1089
|
+
* wrapper).
|
|
1090
|
+
*
|
|
1091
|
+
* **When to use**
|
|
1092
|
+
*
|
|
1093
|
+
* Use to get the first element without `Option` wrapping when the array is known
|
|
1094
|
+
* to be non-empty.
|
|
1095
|
+
*
|
|
1096
|
+
* **Example** (Getting the head of a non-empty array)
|
|
1097
|
+
*
|
|
1098
|
+
* ```ts
|
|
1099
|
+
* import { Array } from "effect"
|
|
1100
|
+
*
|
|
1101
|
+
* console.log(Array.headNonEmpty([1, 2, 3, 4])) // 1
|
|
1102
|
+
* ```
|
|
1103
|
+
*
|
|
1104
|
+
* @see {@link head} — safe version for possibly-empty arrays
|
|
1105
|
+
*
|
|
1106
|
+
* @category getters
|
|
1107
|
+
* @since 2.0.0
|
|
1108
|
+
*/
|
|
1109
|
+
export const headNonEmpty: <A>(self: NonEmptyReadonlyArray<A>) => A = getUnsafe(0)
|
|
1110
|
+
|
|
1111
|
+
/**
|
|
1112
|
+
* Returns the last element of an array safely wrapped in `Option.some`, or
|
|
1113
|
+
* `Option.none` if the array is empty.
|
|
1114
|
+
*
|
|
1115
|
+
* **When to use**
|
|
1116
|
+
*
|
|
1117
|
+
* Use to safely get the last element of an array that may be empty.
|
|
1118
|
+
*
|
|
1119
|
+
* **Example** (Getting the last element)
|
|
1120
|
+
*
|
|
1121
|
+
* ```ts
|
|
1122
|
+
* import { Array } from "effect"
|
|
1123
|
+
*
|
|
1124
|
+
* console.log(Array.last([1, 2, 3])) // Some(3)
|
|
1125
|
+
* console.log(Array.last([])) // None
|
|
1126
|
+
* ```
|
|
1127
|
+
*
|
|
1128
|
+
* @see {@link lastNonEmpty} — direct access when array is known non-empty
|
|
1129
|
+
* @see {@link head} — get the first element
|
|
1130
|
+
*
|
|
1131
|
+
* @category getters
|
|
1132
|
+
* @since 2.0.0
|
|
1133
|
+
*/
|
|
1134
|
+
export const last = <A>(self: ReadonlyArray<A>): Option.Option<A> =>
|
|
1135
|
+
isReadonlyArrayNonEmpty(self) ? Option.some(lastNonEmpty(self)) : Option.none()
|
|
1136
|
+
|
|
1137
|
+
/**
|
|
1138
|
+
* Returns the last element of a `NonEmptyReadonlyArray` directly (no `Option`
|
|
1139
|
+
* wrapper).
|
|
1140
|
+
*
|
|
1141
|
+
* **When to use**
|
|
1142
|
+
*
|
|
1143
|
+
* Use to get the last element without `Option` wrapping when the array is known
|
|
1144
|
+
* to be non-empty.
|
|
1145
|
+
*
|
|
1146
|
+
* **Example** (Getting the last of a non-empty array)
|
|
1147
|
+
*
|
|
1148
|
+
* ```ts
|
|
1149
|
+
* import { Array } from "effect"
|
|
1150
|
+
*
|
|
1151
|
+
* console.log(Array.lastNonEmpty([1, 2, 3, 4])) // 4
|
|
1152
|
+
* ```
|
|
1153
|
+
*
|
|
1154
|
+
* @see {@link last} — safe version for possibly-empty arrays
|
|
1155
|
+
*
|
|
1156
|
+
* @category getters
|
|
1157
|
+
* @since 2.0.0
|
|
1158
|
+
*/
|
|
1159
|
+
export const lastNonEmpty = <A>(self: NonEmptyReadonlyArray<A>): A => self[self.length - 1]
|
|
1160
|
+
|
|
1161
|
+
/**
|
|
1162
|
+
* Returns all elements except the first safely, wrapped in an `Option`.
|
|
1163
|
+
*
|
|
1164
|
+
* **When to use**
|
|
1165
|
+
*
|
|
1166
|
+
* Use to safely get all elements after the first when the iterable may be empty.
|
|
1167
|
+
*
|
|
1168
|
+
* **Details**
|
|
1169
|
+
*
|
|
1170
|
+
* Allocates a new array via `slice(1)`. Empty inputs return `Option.none()`.
|
|
1171
|
+
*
|
|
1172
|
+
* **Example** (Getting the tail)
|
|
1173
|
+
*
|
|
1174
|
+
* ```ts
|
|
1175
|
+
* import { Array } from "effect"
|
|
1176
|
+
*
|
|
1177
|
+
* console.log(Array.tail([1, 2, 3, 4])) // Option.some([2, 3, 4])
|
|
1178
|
+
* console.log(Array.tail([])) // Option.none()
|
|
1179
|
+
* ```
|
|
1180
|
+
*
|
|
1181
|
+
* @see {@link tailNonEmpty} — when the array is known non-empty
|
|
1182
|
+
* @see {@link init} — all elements except the last
|
|
1183
|
+
*
|
|
1184
|
+
* @category getters
|
|
1185
|
+
* @since 2.0.0
|
|
1186
|
+
*/
|
|
1187
|
+
export function tail<A>(self: Iterable<A>): Option.Option<Array<A>> {
|
|
1188
|
+
const as = fromIterable(self)
|
|
1189
|
+
return isReadonlyArrayNonEmpty(as) ? Option.some(tailNonEmpty(as)) : Option.none()
|
|
1190
|
+
}
|
|
1191
|
+
|
|
1192
|
+
/**
|
|
1193
|
+
* Returns all elements except the first of a `NonEmptyReadonlyArray`.
|
|
1194
|
+
*
|
|
1195
|
+
* **When to use**
|
|
1196
|
+
*
|
|
1197
|
+
* Use to get all elements after the first when the array is known to be non-empty.
|
|
1198
|
+
*
|
|
1199
|
+
* **Example** (Getting the tail of a non-empty array)
|
|
1200
|
+
*
|
|
1201
|
+
* ```ts
|
|
1202
|
+
* import { Array } from "effect"
|
|
1203
|
+
*
|
|
1204
|
+
* console.log(Array.tailNonEmpty([1, 2, 3, 4])) // [2, 3, 4]
|
|
1205
|
+
* ```
|
|
1206
|
+
*
|
|
1207
|
+
* @see {@link tail} — safe version for possibly-empty arrays
|
|
1208
|
+
* @see {@link initNonEmpty} — all elements except the last
|
|
1209
|
+
*
|
|
1210
|
+
* @category getters
|
|
1211
|
+
* @since 2.0.0
|
|
1212
|
+
*/
|
|
1213
|
+
export const tailNonEmpty = <A>(self: NonEmptyReadonlyArray<A>): Array<A> => self.slice(1)
|
|
1214
|
+
|
|
1215
|
+
/**
|
|
1216
|
+
* Returns all elements except the last safely, wrapped in an `Option`.
|
|
1217
|
+
*
|
|
1218
|
+
* **When to use**
|
|
1219
|
+
*
|
|
1220
|
+
* Use to safely get all elements before the last when the iterable may be empty.
|
|
1221
|
+
*
|
|
1222
|
+
* **Details**
|
|
1223
|
+
*
|
|
1224
|
+
* Allocates a new array via `slice(0, -1)`. Empty inputs return
|
|
1225
|
+
* `Option.none()`.
|
|
1226
|
+
*
|
|
1227
|
+
* **Example** (Getting init)
|
|
1228
|
+
*
|
|
1229
|
+
* ```ts
|
|
1230
|
+
* import { Array } from "effect"
|
|
1231
|
+
*
|
|
1232
|
+
* console.log(Array.init([1, 2, 3, 4])) // Option.some([1, 2, 3])
|
|
1233
|
+
* console.log(Array.init([])) // Option.none()
|
|
1234
|
+
* ```
|
|
1235
|
+
*
|
|
1236
|
+
* @see {@link initNonEmpty} — when the array is known non-empty
|
|
1237
|
+
* @see {@link tail} — all elements except the first
|
|
1238
|
+
*
|
|
1239
|
+
* @category getters
|
|
1240
|
+
* @since 2.0.0
|
|
1241
|
+
*/
|
|
1242
|
+
export function init<A>(self: Iterable<A>): Option.Option<Array<A>> {
|
|
1243
|
+
const as = fromIterable(self)
|
|
1244
|
+
return isReadonlyArrayNonEmpty(as) ? Option.some(initNonEmpty(as)) : Option.none()
|
|
1245
|
+
}
|
|
1246
|
+
|
|
1247
|
+
/**
|
|
1248
|
+
* Returns all elements except the last of a `NonEmptyReadonlyArray`.
|
|
1249
|
+
*
|
|
1250
|
+
* **When to use**
|
|
1251
|
+
*
|
|
1252
|
+
* Use to get all elements before the last when the array is known to be non-empty.
|
|
1253
|
+
*
|
|
1254
|
+
* **Example** (Getting init of a non-empty array)
|
|
1255
|
+
*
|
|
1256
|
+
* ```ts
|
|
1257
|
+
* import { Array } from "effect"
|
|
1258
|
+
*
|
|
1259
|
+
* console.log(Array.initNonEmpty([1, 2, 3, 4])) // [1, 2, 3]
|
|
1260
|
+
* ```
|
|
1261
|
+
*
|
|
1262
|
+
* @see {@link init} — safe version for possibly-empty arrays
|
|
1263
|
+
* @see {@link tailNonEmpty} — all elements except the first
|
|
1264
|
+
*
|
|
1265
|
+
* @category getters
|
|
1266
|
+
* @since 2.0.0
|
|
1267
|
+
*/
|
|
1268
|
+
export const initNonEmpty = <A>(self: NonEmptyReadonlyArray<A>): Array<A> => self.slice(0, -1)
|
|
1269
|
+
|
|
1270
|
+
/**
|
|
1271
|
+
* Keeps the first `n` elements, creating a new array.
|
|
1272
|
+
*
|
|
1273
|
+
* **When to use**
|
|
1274
|
+
*
|
|
1275
|
+
* Use to keep up to the first `n` elements from an iterable as a new array.
|
|
1276
|
+
*
|
|
1277
|
+
* **Details**
|
|
1278
|
+
*
|
|
1279
|
+
* `n` is clamped to `[0, length]`. Returns an empty array when `n <= 0`.
|
|
1280
|
+
*
|
|
1281
|
+
* **Example** (Taking from the start)
|
|
1282
|
+
*
|
|
1283
|
+
* ```ts
|
|
1284
|
+
* import { Array } from "effect"
|
|
1285
|
+
*
|
|
1286
|
+
* console.log(Array.take([1, 2, 3, 4, 5], 3)) // [1, 2, 3]
|
|
1287
|
+
* ```
|
|
1288
|
+
*
|
|
1289
|
+
* @see {@link takeRight} for keeping elements from the end
|
|
1290
|
+
* @see {@link takeWhile} for keeping an initial prefix while a predicate holds
|
|
1291
|
+
* @see {@link drop} for removing elements from the start
|
|
1292
|
+
*
|
|
1293
|
+
* @category getters
|
|
1294
|
+
* @since 2.0.0
|
|
1295
|
+
*/
|
|
1296
|
+
export const take: {
|
|
1297
|
+
(n: number): <A>(self: Iterable<A>) => Array<A>
|
|
1298
|
+
<A>(self: Iterable<A>, n: number): Array<A>
|
|
1299
|
+
} = dual(2, <A>(self: Iterable<A>, n: number): Array<A> => {
|
|
1300
|
+
const input = fromIterable(self)
|
|
1301
|
+
return input.slice(0, clamp(n, input))
|
|
1302
|
+
})
|
|
1303
|
+
|
|
1304
|
+
/**
|
|
1305
|
+
* Keeps the last `n` elements, creating a new array.
|
|
1306
|
+
*
|
|
1307
|
+
* **When to use**
|
|
1308
|
+
*
|
|
1309
|
+
* Use to keep the last `n` elements of an iterable.
|
|
1310
|
+
*
|
|
1311
|
+
* **Details**
|
|
1312
|
+
*
|
|
1313
|
+
* `n` is clamped to `[0, length]`. Returns an empty array when `n <= 0`.
|
|
1314
|
+
*
|
|
1315
|
+
* **Example** (Taking from the end)
|
|
1316
|
+
*
|
|
1317
|
+
* ```ts
|
|
1318
|
+
* import { Array } from "effect"
|
|
1319
|
+
*
|
|
1320
|
+
* console.log(Array.takeRight([1, 2, 3, 4, 5], 3)) // [3, 4, 5]
|
|
1321
|
+
* ```
|
|
1322
|
+
*
|
|
1323
|
+
* @see {@link take} — keep from the start
|
|
1324
|
+
* @see {@link dropRight} — remove from the end
|
|
1325
|
+
*
|
|
1326
|
+
* @category getters
|
|
1327
|
+
* @since 2.0.0
|
|
1328
|
+
*/
|
|
1329
|
+
export const takeRight: {
|
|
1330
|
+
(n: number): <A>(self: Iterable<A>) => Array<A>
|
|
1331
|
+
<A>(self: Iterable<A>, n: number): Array<A>
|
|
1332
|
+
} = dual(2, <A>(self: Iterable<A>, n: number): Array<A> => {
|
|
1333
|
+
const input = fromIterable(self)
|
|
1334
|
+
const i = clamp(n, input)
|
|
1335
|
+
return i === 0 ? [] : input.slice(-i)
|
|
1336
|
+
})
|
|
1337
|
+
|
|
1338
|
+
/**
|
|
1339
|
+
* Takes elements from the start while the predicate holds, stopping at the
|
|
1340
|
+
* first element that fails.
|
|
1341
|
+
*
|
|
1342
|
+
* **When to use**
|
|
1343
|
+
*
|
|
1344
|
+
* Use to keep the leading elements of an iterable while each element satisfies
|
|
1345
|
+
* a predicate, returning the retained prefix as an array.
|
|
1346
|
+
*
|
|
1347
|
+
* **Details**
|
|
1348
|
+
*
|
|
1349
|
+
* Supports refinements for type narrowing. The predicate receives
|
|
1350
|
+
* `(element, index)`.
|
|
1351
|
+
*
|
|
1352
|
+
* **Example** (Taking while condition holds)
|
|
1353
|
+
*
|
|
1354
|
+
* ```ts
|
|
1355
|
+
* import { Array } from "effect"
|
|
1356
|
+
*
|
|
1357
|
+
* console.log(Array.takeWhile([1, 3, 2, 4, 1, 2], (x) => x < 4)) // [1, 3, 2]
|
|
1358
|
+
* ```
|
|
1359
|
+
*
|
|
1360
|
+
* @see {@link take} for keeping a fixed number of leading elements
|
|
1361
|
+
* @see {@link dropWhile} for removing the matching prefix and keeping the rest
|
|
1362
|
+
* @see {@link span} for splitting the matching prefix from the remaining elements
|
|
1363
|
+
*
|
|
1364
|
+
* @category getters
|
|
1365
|
+
* @since 2.0.0
|
|
1366
|
+
*/
|
|
1367
|
+
export const takeWhile: {
|
|
1368
|
+
<A, B extends A>(refinement: (a: NoInfer<A>, i: number) => a is B): (self: Iterable<A>) => Array<B>
|
|
1369
|
+
<A>(predicate: (a: NoInfer<A>, i: number) => boolean): (self: Iterable<A>) => Array<A>
|
|
1370
|
+
<A, B extends A>(self: Iterable<A>, refinement: (a: A, i: number) => a is B): Array<B>
|
|
1371
|
+
<A>(self: Iterable<A>, predicate: (a: A, i: number) => boolean): Array<A>
|
|
1372
|
+
} = dual(2, <A>(self: Iterable<A>, predicate: (a: A, i: number) => boolean): Array<A> => {
|
|
1373
|
+
let i = 0
|
|
1374
|
+
const out: Array<A> = []
|
|
1375
|
+
for (const a of self) {
|
|
1376
|
+
if (!predicate(a, i)) {
|
|
1377
|
+
break
|
|
1378
|
+
}
|
|
1379
|
+
out.push(a)
|
|
1380
|
+
i++
|
|
1381
|
+
}
|
|
1382
|
+
return out
|
|
1383
|
+
})
|
|
1384
|
+
|
|
1385
|
+
/**
|
|
1386
|
+
* Takes elements from the start while a `Filter` succeeds, collecting transformed values.
|
|
1387
|
+
*
|
|
1388
|
+
* **When to use**
|
|
1389
|
+
*
|
|
1390
|
+
* Use when you need to take a prefix from an iterable while a function can
|
|
1391
|
+
* successfully extract or transform elements, stopping at the first element
|
|
1392
|
+
* that produces a failure result.
|
|
1393
|
+
*
|
|
1394
|
+
* **Details**
|
|
1395
|
+
*
|
|
1396
|
+
* The filter receives `(element, index)` and processing stops at the first
|
|
1397
|
+
* filter failure.
|
|
1398
|
+
*
|
|
1399
|
+
* @see {@link takeWhile} for taking a prefix based on a boolean predicate
|
|
1400
|
+
*
|
|
1401
|
+
* @category getters
|
|
1402
|
+
* @since 4.0.0
|
|
1403
|
+
*/
|
|
1404
|
+
export const takeWhileFilter: {
|
|
1405
|
+
<A, B, X>(f: (input: NoInfer<A>, i: number) => Result.Result<B, X>): (self: Iterable<A>) => Array<B>
|
|
1406
|
+
<A, B, X>(self: Iterable<A>, f: (input: NoInfer<A>, i: number) => Result.Result<B, X>): Array<B>
|
|
1407
|
+
} = dual(2, <A, B, X>(self: Iterable<A>, f: (input: NoInfer<A>, i: number) => Result.Result<B, X>): Array<B> => {
|
|
1408
|
+
let i = 0
|
|
1409
|
+
const out: Array<B> = []
|
|
1410
|
+
for (const a of self) {
|
|
1411
|
+
const result = f(a, i)
|
|
1412
|
+
if (Result.isFailure(result)) {
|
|
1413
|
+
break
|
|
1414
|
+
}
|
|
1415
|
+
out.push(result.success)
|
|
1416
|
+
i++
|
|
1417
|
+
}
|
|
1418
|
+
return out
|
|
1419
|
+
})
|
|
1420
|
+
|
|
1421
|
+
const spanIndex = <A>(self: Iterable<A>, predicate: (a: A, i: number) => boolean): number => {
|
|
1422
|
+
let i = 0
|
|
1423
|
+
for (const a of self) {
|
|
1424
|
+
if (!predicate(a, i)) {
|
|
1425
|
+
break
|
|
1426
|
+
}
|
|
1427
|
+
i++
|
|
1428
|
+
}
|
|
1429
|
+
return i
|
|
1430
|
+
}
|
|
1431
|
+
|
|
1432
|
+
/**
|
|
1433
|
+
* Splits an iterable into two arrays: the longest prefix where the predicate
|
|
1434
|
+
* holds, and the remaining elements.
|
|
1435
|
+
*
|
|
1436
|
+
* **When to use**
|
|
1437
|
+
*
|
|
1438
|
+
* Use when you need both the longest predicate-matching prefix and the
|
|
1439
|
+
* remaining elements.
|
|
1440
|
+
*
|
|
1441
|
+
* **Details**
|
|
1442
|
+
*
|
|
1443
|
+
* Equivalent to `[takeWhile(pred), dropWhile(pred)]`, but more efficient
|
|
1444
|
+
* because it runs in a single pass. Supports refinements for type narrowing of
|
|
1445
|
+
* the prefix.
|
|
1446
|
+
*
|
|
1447
|
+
* **Example** (Splitting at predicate boundary)
|
|
1448
|
+
*
|
|
1449
|
+
* ```ts
|
|
1450
|
+
* import { Array } from "effect"
|
|
1451
|
+
*
|
|
1452
|
+
* console.log(Array.span([1, 3, 2, 4, 5], (x) => x % 2 === 1)) // [[1, 3], [2, 4, 5]]
|
|
1453
|
+
* ```
|
|
1454
|
+
*
|
|
1455
|
+
* @see {@link takeWhile} for keeping only the matching prefix
|
|
1456
|
+
* @see {@link dropWhile} for keeping only the elements after the matching prefix
|
|
1457
|
+
* @see {@link splitWhere} for splitting at the first element that satisfies a predicate
|
|
1458
|
+
*
|
|
1459
|
+
* @category splitting
|
|
1460
|
+
* @since 2.0.0
|
|
1461
|
+
*/
|
|
1462
|
+
export const span: {
|
|
1463
|
+
<A, B extends A>(
|
|
1464
|
+
refinement: (a: NoInfer<A>, i: number) => a is B
|
|
1465
|
+
): (self: Iterable<A>) => [init: Array<B>, rest: Array<Exclude<A, B>>]
|
|
1466
|
+
<A>(predicate: (a: NoInfer<A>, i: number) => boolean): (self: Iterable<A>) => [init: Array<A>, rest: Array<A>]
|
|
1467
|
+
<A, B extends A>(
|
|
1468
|
+
self: Iterable<A>,
|
|
1469
|
+
refinement: (a: A, i: number) => a is B
|
|
1470
|
+
): [init: Array<B>, rest: Array<Exclude<A, B>>]
|
|
1471
|
+
<A>(self: Iterable<A>, predicate: (a: A, i: number) => boolean): [init: Array<A>, rest: Array<A>]
|
|
1472
|
+
} = dual(
|
|
1473
|
+
2,
|
|
1474
|
+
<A>(self: Iterable<A>, predicate: (a: A, i: number) => boolean): [init: Array<A>, rest: Array<A>] => {
|
|
1475
|
+
const input = fromIterable(self)
|
|
1476
|
+
return splitAt(input, spanIndex(input, predicate))
|
|
1477
|
+
}
|
|
1478
|
+
)
|
|
1479
|
+
|
|
1480
|
+
/**
|
|
1481
|
+
* Removes the first `n` elements, creating a new array.
|
|
1482
|
+
*
|
|
1483
|
+
* **When to use**
|
|
1484
|
+
*
|
|
1485
|
+
* Use to keep the suffix of an iterable after skipping a fixed number of
|
|
1486
|
+
* leading elements.
|
|
1487
|
+
*
|
|
1488
|
+
* **Details**
|
|
1489
|
+
*
|
|
1490
|
+
* `n` is clamped to `[0, length]`. When `n <= 0`, this returns a copy of the
|
|
1491
|
+
* full array.
|
|
1492
|
+
*
|
|
1493
|
+
* **Example** (Dropping from the start)
|
|
1494
|
+
*
|
|
1495
|
+
* ```ts
|
|
1496
|
+
* import { Array } from "effect"
|
|
1497
|
+
*
|
|
1498
|
+
* console.log(Array.drop([1, 2, 3, 4, 5], 2)) // [3, 4, 5]
|
|
1499
|
+
* ```
|
|
1500
|
+
*
|
|
1501
|
+
* @see {@link dropRight} for removing a fixed number of elements from the end
|
|
1502
|
+
* @see {@link dropWhile} for removing a prefix based on a predicate instead of a fixed count
|
|
1503
|
+
* @see {@link take} for keeping a fixed number of elements from the start
|
|
1504
|
+
*
|
|
1505
|
+
* @category getters
|
|
1506
|
+
* @since 2.0.0
|
|
1507
|
+
*/
|
|
1508
|
+
export const drop: {
|
|
1509
|
+
(n: number): <A>(self: Iterable<A>) => Array<A>
|
|
1510
|
+
<A>(self: Iterable<A>, n: number): Array<A>
|
|
1511
|
+
} = dual(2, <A>(self: Iterable<A>, n: number): Array<A> => {
|
|
1512
|
+
const input = fromIterable(self)
|
|
1513
|
+
return input.slice(clamp(n, input), input.length)
|
|
1514
|
+
})
|
|
1515
|
+
|
|
1516
|
+
/**
|
|
1517
|
+
* Removes the last `n` elements, creating a new array.
|
|
1518
|
+
*
|
|
1519
|
+
* **When to use**
|
|
1520
|
+
*
|
|
1521
|
+
* Use to remove the last `n` elements from an iterable.
|
|
1522
|
+
*
|
|
1523
|
+
* **Details**
|
|
1524
|
+
*
|
|
1525
|
+
* `n` is clamped to `[0, length]`.
|
|
1526
|
+
*
|
|
1527
|
+
* **Example** (Dropping from the end)
|
|
1528
|
+
*
|
|
1529
|
+
* ```ts
|
|
1530
|
+
* import { Array } from "effect"
|
|
1531
|
+
*
|
|
1532
|
+
* console.log(Array.dropRight([1, 2, 3, 4, 5], 2)) // [1, 2, 3]
|
|
1533
|
+
* ```
|
|
1534
|
+
*
|
|
1535
|
+
* @see {@link drop} — remove from the start
|
|
1536
|
+
* @see {@link takeRight} — keep from the end
|
|
1537
|
+
*
|
|
1538
|
+
* @category getters
|
|
1539
|
+
* @since 2.0.0
|
|
1540
|
+
*/
|
|
1541
|
+
export const dropRight: {
|
|
1542
|
+
(n: number): <A>(self: Iterable<A>) => Array<A>
|
|
1543
|
+
<A>(self: Iterable<A>, n: number): Array<A>
|
|
1544
|
+
} = dual(2, <A>(self: Iterable<A>, n: number): Array<A> => {
|
|
1545
|
+
const input = fromIterable(self)
|
|
1546
|
+
return input.slice(0, input.length - clamp(n, input))
|
|
1547
|
+
})
|
|
1548
|
+
|
|
1549
|
+
/**
|
|
1550
|
+
* Drops elements from the start while the predicate holds, returning the rest.
|
|
1551
|
+
*
|
|
1552
|
+
* **When to use**
|
|
1553
|
+
*
|
|
1554
|
+
* Use to remove a leading prefix of elements that satisfy a predicate.
|
|
1555
|
+
*
|
|
1556
|
+
* **Details**
|
|
1557
|
+
*
|
|
1558
|
+
* The predicate receives `(element, index)`.
|
|
1559
|
+
*
|
|
1560
|
+
* **Example** (Dropping while condition holds)
|
|
1561
|
+
*
|
|
1562
|
+
* ```ts
|
|
1563
|
+
* import { Array } from "effect"
|
|
1564
|
+
*
|
|
1565
|
+
* console.log(Array.dropWhile([1, 2, 3, 4, 5], (x) => x < 4)) // [4, 5]
|
|
1566
|
+
* ```
|
|
1567
|
+
*
|
|
1568
|
+
* @see {@link takeWhile} — keep the matching prefix instead
|
|
1569
|
+
* @see {@link drop} — drop a fixed count
|
|
1570
|
+
*
|
|
1571
|
+
* @category getters
|
|
1572
|
+
* @since 2.0.0
|
|
1573
|
+
*/
|
|
1574
|
+
export const dropWhile: {
|
|
1575
|
+
<A>(predicate: (a: NoInfer<A>, i: number) => boolean): (self: Iterable<A>) => Array<A>
|
|
1576
|
+
<A>(self: Iterable<A>, predicate: (a: A, i: number) => boolean): Array<A>
|
|
1577
|
+
} = dual(2, <A>(self: Iterable<A>, predicate: (a: A, i: number) => boolean): Array<A> => {
|
|
1578
|
+
const input = fromIterable(self)
|
|
1579
|
+
let i = 0
|
|
1580
|
+
while (i < input.length) {
|
|
1581
|
+
if (!predicate(input[i], i)) {
|
|
1582
|
+
break
|
|
1583
|
+
}
|
|
1584
|
+
i++
|
|
1585
|
+
}
|
|
1586
|
+
return input.slice(i)
|
|
1587
|
+
})
|
|
1588
|
+
|
|
1589
|
+
/**
|
|
1590
|
+
* Drops elements from the start while a `Filter` succeeds.
|
|
1591
|
+
*
|
|
1592
|
+
* **When to use**
|
|
1593
|
+
*
|
|
1594
|
+
* Use when you need to drop a prefix from an iterable by computing a `Result`
|
|
1595
|
+
* per element instead of using a simple boolean predicate.
|
|
1596
|
+
*
|
|
1597
|
+
* **Details**
|
|
1598
|
+
*
|
|
1599
|
+
* The filter receives `(element, index)`. The result contains the remaining
|
|
1600
|
+
* original elements after the first filter failure.
|
|
1601
|
+
*
|
|
1602
|
+
* @see {@link dropWhile} for dropping a prefix with a simple boolean predicate
|
|
1603
|
+
* @see {@link takeWhileFilter} for keeping only the matching prefix
|
|
1604
|
+
*
|
|
1605
|
+
* @category getters
|
|
1606
|
+
* @since 4.0.0
|
|
1607
|
+
*/
|
|
1608
|
+
export const dropWhileFilter: {
|
|
1609
|
+
<A, B, X>(f: (input: NoInfer<A>, i: number) => Result.Result<B, X>): (self: Iterable<A>) => Array<A>
|
|
1610
|
+
<A, B, X>(self: Iterable<A>, f: (input: A, i: number) => Result.Result<B, X>): Array<A>
|
|
1611
|
+
} = dual(
|
|
1612
|
+
2,
|
|
1613
|
+
<A, B, X>(self: Iterable<A>, f: (input: A, i: number) => Result.Result<B, X>): Array<A> => {
|
|
1614
|
+
const input = fromIterable(self)
|
|
1615
|
+
let i = 0
|
|
1616
|
+
while (i < input.length) {
|
|
1617
|
+
if (Result.isFailure(f(input[i], i))) {
|
|
1618
|
+
break
|
|
1619
|
+
}
|
|
1620
|
+
i++
|
|
1621
|
+
}
|
|
1622
|
+
return input.slice(i)
|
|
1623
|
+
}
|
|
1624
|
+
)
|
|
1625
|
+
|
|
1626
|
+
/**
|
|
1627
|
+
* Returns the index of the first element matching the predicate, wrapped in an
|
|
1628
|
+
* `Option`.
|
|
1629
|
+
*
|
|
1630
|
+
* **When to use**
|
|
1631
|
+
*
|
|
1632
|
+
* Use to find the index of the first matching element from the start of an
|
|
1633
|
+
* iterable.
|
|
1634
|
+
*
|
|
1635
|
+
* **Example** (Finding an index)
|
|
1636
|
+
*
|
|
1637
|
+
* ```ts
|
|
1638
|
+
* import { Array } from "effect"
|
|
1639
|
+
*
|
|
1640
|
+
* console.log(Array.findFirstIndex([5, 3, 8, 9], (x) => x > 5)) // Option.some(2)
|
|
1641
|
+
* ```
|
|
1642
|
+
*
|
|
1643
|
+
* @see {@link findLastIndex} — search from the end
|
|
1644
|
+
* @see {@link findFirst} — get the element itself
|
|
1645
|
+
*
|
|
1646
|
+
* @category elements
|
|
1647
|
+
* @since 2.0.0
|
|
1648
|
+
*/
|
|
1649
|
+
export const findFirstIndex: {
|
|
1650
|
+
<A>(predicate: (a: NoInfer<A>, i: number) => boolean): (self: Iterable<A>) => Option.Option<number>
|
|
1651
|
+
<A>(self: Iterable<A>, predicate: (a: A, i: number) => boolean): Option.Option<number>
|
|
1652
|
+
} = dual(2, <A>(self: Iterable<A>, predicate: (a: A, i: number) => boolean): Option.Option<number> => {
|
|
1653
|
+
let i = 0
|
|
1654
|
+
for (const a of self) {
|
|
1655
|
+
if (predicate(a, i)) {
|
|
1656
|
+
return Option.some(i)
|
|
1657
|
+
}
|
|
1658
|
+
i++
|
|
1659
|
+
}
|
|
1660
|
+
return Option.none()
|
|
1661
|
+
})
|
|
1662
|
+
|
|
1663
|
+
/**
|
|
1664
|
+
* Returns the index of the last element matching the predicate, wrapped in an
|
|
1665
|
+
* `Option`.
|
|
1666
|
+
*
|
|
1667
|
+
* **When to use**
|
|
1668
|
+
*
|
|
1669
|
+
* Use to find the index of the last matching element from the end of an array.
|
|
1670
|
+
*
|
|
1671
|
+
* **Example** (Finding the last matching index)
|
|
1672
|
+
*
|
|
1673
|
+
* ```ts
|
|
1674
|
+
* import { Array } from "effect"
|
|
1675
|
+
*
|
|
1676
|
+
* console.log(Array.findLastIndex([1, 3, 8, 9], (x) => x < 5)) // Option.some(1)
|
|
1677
|
+
* ```
|
|
1678
|
+
*
|
|
1679
|
+
* @see {@link findFirstIndex} — search from the start
|
|
1680
|
+
* @see {@link findLast} — get the element itself
|
|
1681
|
+
*
|
|
1682
|
+
* @category elements
|
|
1683
|
+
* @since 2.0.0
|
|
1684
|
+
*/
|
|
1685
|
+
export const findLastIndex: {
|
|
1686
|
+
<A>(predicate: (a: NoInfer<A>, i: number) => boolean): (self: Iterable<A>) => Option.Option<number>
|
|
1687
|
+
<A>(self: Iterable<A>, predicate: (a: A, i: number) => boolean): Option.Option<number>
|
|
1688
|
+
} = dual(2, <A>(self: Iterable<A>, predicate: (a: A, i: number) => boolean): Option.Option<number> => {
|
|
1689
|
+
const input = fromIterable(self)
|
|
1690
|
+
for (let i = input.length - 1; i >= 0; i--) {
|
|
1691
|
+
if (predicate(input[i], i)) {
|
|
1692
|
+
return Option.some(i)
|
|
1693
|
+
}
|
|
1694
|
+
}
|
|
1695
|
+
return Option.none()
|
|
1696
|
+
})
|
|
1697
|
+
|
|
1698
|
+
/**
|
|
1699
|
+
* Returns the first element matching a predicate, refinement, or mapping
|
|
1700
|
+
* function, wrapped in `Option`.
|
|
1701
|
+
*
|
|
1702
|
+
* **When to use**
|
|
1703
|
+
*
|
|
1704
|
+
* Use to scan an iterable in iteration order and return the first selected
|
|
1705
|
+
* element or mapped value as an `Option`.
|
|
1706
|
+
*
|
|
1707
|
+
* **Details**
|
|
1708
|
+
*
|
|
1709
|
+
* Accepts a predicate `(a, i) => boolean`, a refinement, or a function
|
|
1710
|
+
* `(a, i) => Option<B>` for simultaneous find-and-transform. If no element
|
|
1711
|
+
* matches, this returns `Option.none()`.
|
|
1712
|
+
*
|
|
1713
|
+
* **Example** (Finding the first match)
|
|
1714
|
+
*
|
|
1715
|
+
* ```ts
|
|
1716
|
+
* import { Array } from "effect"
|
|
1717
|
+
*
|
|
1718
|
+
* console.log(Array.findFirst([1, 2, 3, 4, 5], (x) => x > 3)) // Option.some(4)
|
|
1719
|
+
* ```
|
|
1720
|
+
*
|
|
1721
|
+
* @see {@link findLast} — search from the end
|
|
1722
|
+
* @see {@link findFirstIndex} — get the index instead
|
|
1723
|
+
* @see {@link findFirstWithIndex} — get both element and index
|
|
1724
|
+
*
|
|
1725
|
+
* @category elements
|
|
1726
|
+
* @since 2.0.0
|
|
1727
|
+
*/
|
|
1728
|
+
export const findFirst: {
|
|
1729
|
+
<A, B>(f: (a: NoInfer<A>, i: number) => Option.Option<B>): (self: Iterable<A>) => Option.Option<B>
|
|
1730
|
+
<A, B extends A>(refinement: (a: NoInfer<A>, i: number) => a is B): (self: Iterable<A>) => Option.Option<B>
|
|
1731
|
+
<A>(predicate: (a: NoInfer<A>, i: number) => boolean): (self: Iterable<A>) => Option.Option<A>
|
|
1732
|
+
<A, B>(self: Iterable<A>, f: (a: A, i: number) => Option.Option<B>): Option.Option<B>
|
|
1733
|
+
<A, B extends A>(self: Iterable<A>, refinement: (a: A, i: number) => a is B): Option.Option<B>
|
|
1734
|
+
<A>(self: Iterable<A>, predicate: (a: A, i: number) => boolean): Option.Option<A>
|
|
1735
|
+
} = moduleIterable.findFirst
|
|
1736
|
+
|
|
1737
|
+
/**
|
|
1738
|
+
* Returns the first selected value together with its index, wrapped in an
|
|
1739
|
+
* `Option`.
|
|
1740
|
+
*
|
|
1741
|
+
* **When to use**
|
|
1742
|
+
*
|
|
1743
|
+
* Use to find both the first matching element and its index in one pass.
|
|
1744
|
+
*
|
|
1745
|
+
* **Details**
|
|
1746
|
+
*
|
|
1747
|
+
* Accepts a predicate, a refinement, or a function returning `Option`. For an
|
|
1748
|
+
* `Option`-returning function, returns `[mappedValue, index]` for the first
|
|
1749
|
+
* `Some`, or `Option.none()` if no element is selected.
|
|
1750
|
+
*
|
|
1751
|
+
* **Example** (Finding element with its index)
|
|
1752
|
+
*
|
|
1753
|
+
* ```ts
|
|
1754
|
+
* import { Array } from "effect"
|
|
1755
|
+
*
|
|
1756
|
+
* console.log(Array.findFirstWithIndex([1, 2, 3, 4, 5], (x) => x > 3)) // Option.some([4, 3])
|
|
1757
|
+
* ```
|
|
1758
|
+
*
|
|
1759
|
+
* @see {@link findFirst} — get only the element
|
|
1760
|
+
* @see {@link findFirstIndex} — get only the index
|
|
1761
|
+
*
|
|
1762
|
+
* @category elements
|
|
1763
|
+
* @since 3.17.0
|
|
1764
|
+
*/
|
|
1765
|
+
export const findFirstWithIndex: {
|
|
1766
|
+
<A, B>(f: (a: NoInfer<A>, i: number) => Option.Option<B>): (self: Iterable<A>) => Option.Option<[B, number]>
|
|
1767
|
+
<A, B extends A>(refinement: (a: NoInfer<A>, i: number) => a is B): (self: Iterable<A>) => Option.Option<[B, number]>
|
|
1768
|
+
<A>(predicate: (a: NoInfer<A>, i: number) => boolean): (self: Iterable<A>) => Option.Option<[A, number]>
|
|
1769
|
+
<A, B>(self: Iterable<A>, f: (a: A, i: number) => Option.Option<B>): Option.Option<[B, number]>
|
|
1770
|
+
<A, B extends A>(self: Iterable<A>, refinement: (a: A, i: number) => a is B): Option.Option<[B, number]>
|
|
1771
|
+
<A>(self: Iterable<A>, predicate: (a: A, i: number) => boolean): Option.Option<[A, number]>
|
|
1772
|
+
} = dual(
|
|
1773
|
+
2,
|
|
1774
|
+
<A>(
|
|
1775
|
+
self: Iterable<A>,
|
|
1776
|
+
f: ((a: A, i: number) => boolean) | ((a: A, i: number) => Option.Option<A>)
|
|
1777
|
+
): Option.Option<[A, number]> => {
|
|
1778
|
+
let i = 0
|
|
1779
|
+
for (const a of self) {
|
|
1780
|
+
const o = f(a, i)
|
|
1781
|
+
if (typeof o === "boolean") {
|
|
1782
|
+
if (o) {
|
|
1783
|
+
return Option.some([a, i])
|
|
1784
|
+
}
|
|
1785
|
+
} else {
|
|
1786
|
+
if (Option.isSome(o)) {
|
|
1787
|
+
return Option.some([o.value, i])
|
|
1788
|
+
}
|
|
1789
|
+
}
|
|
1790
|
+
i++
|
|
1791
|
+
}
|
|
1792
|
+
return Option.none()
|
|
1793
|
+
}
|
|
1794
|
+
)
|
|
1795
|
+
|
|
1796
|
+
/**
|
|
1797
|
+
* Returns the last element matching a predicate, refinement, or mapping
|
|
1798
|
+
* function, wrapped in `Option`.
|
|
1799
|
+
*
|
|
1800
|
+
* **When to use**
|
|
1801
|
+
*
|
|
1802
|
+
* Use to find the last matching element from the end of an array.
|
|
1803
|
+
*
|
|
1804
|
+
* **Details**
|
|
1805
|
+
*
|
|
1806
|
+
* Searches from the end of the array. If no element matches, this returns
|
|
1807
|
+
* `Option.none()`.
|
|
1808
|
+
*
|
|
1809
|
+
* **Example** (Finding the last match)
|
|
1810
|
+
*
|
|
1811
|
+
* ```ts
|
|
1812
|
+
* import { Array } from "effect"
|
|
1813
|
+
*
|
|
1814
|
+
* console.log(Array.findLast([1, 2, 3, 4, 5], (n) => n % 2 === 0)) // Option.some(4)
|
|
1815
|
+
* ```
|
|
1816
|
+
*
|
|
1817
|
+
* @see {@link findFirst} — search from the start
|
|
1818
|
+
* @see {@link findLastIndex} — get the index instead
|
|
1819
|
+
*
|
|
1820
|
+
* @category elements
|
|
1821
|
+
* @since 2.0.0
|
|
1822
|
+
*/
|
|
1823
|
+
export const findLast: {
|
|
1824
|
+
<A, B>(f: (a: NoInfer<A>, i: number) => Option.Option<B>): (self: Iterable<A>) => Option.Option<B>
|
|
1825
|
+
<A, B extends A>(refinement: (a: NoInfer<A>, i: number) => a is B): (self: Iterable<A>) => Option.Option<B>
|
|
1826
|
+
<A>(predicate: (a: NoInfer<A>, i: number) => boolean): (self: Iterable<A>) => Option.Option<A>
|
|
1827
|
+
<A, B>(self: Iterable<A>, f: (a: A, i: number) => Option.Option<B>): Option.Option<B>
|
|
1828
|
+
<A, B extends A>(self: Iterable<A>, refinement: (a: A, i: number) => a is B): Option.Option<B>
|
|
1829
|
+
<A>(self: Iterable<A>, predicate: (a: A, i: number) => boolean): Option.Option<A>
|
|
1830
|
+
} = dual(
|
|
1831
|
+
2,
|
|
1832
|
+
<A>(
|
|
1833
|
+
self: Iterable<A>,
|
|
1834
|
+
f: ((a: A, i: number) => boolean) | ((a: A, i: number) => Option.Option<A>)
|
|
1835
|
+
): Option.Option<A> => {
|
|
1836
|
+
const input = fromIterable(self)
|
|
1837
|
+
for (let i = input.length - 1; i >= 0; i--) {
|
|
1838
|
+
const a = input[i]
|
|
1839
|
+
const o = f(a, i)
|
|
1840
|
+
if (typeof o === "boolean") {
|
|
1841
|
+
if (o) {
|
|
1842
|
+
return Option.some(a)
|
|
1843
|
+
}
|
|
1844
|
+
} else {
|
|
1845
|
+
if (Option.isSome(o)) {
|
|
1846
|
+
return o
|
|
1847
|
+
}
|
|
1848
|
+
}
|
|
1849
|
+
}
|
|
1850
|
+
return Option.none()
|
|
1851
|
+
}
|
|
1852
|
+
)
|
|
1853
|
+
|
|
1854
|
+
/**
|
|
1855
|
+
* Inserts an element at the specified index safely, returning a new `NonEmptyArray`
|
|
1856
|
+
* wrapped in an `Option`.
|
|
1857
|
+
*
|
|
1858
|
+
* **When to use**
|
|
1859
|
+
*
|
|
1860
|
+
* Use to insert a single element at a specific position in an array.
|
|
1861
|
+
*
|
|
1862
|
+
* **Details**
|
|
1863
|
+
*
|
|
1864
|
+
* Valid indices are `0` to `length`, inclusive. Inserting at `length` appends.
|
|
1865
|
+
*
|
|
1866
|
+
* **Example** (Inserting at an index)
|
|
1867
|
+
*
|
|
1868
|
+
* ```ts
|
|
1869
|
+
* import { Array } from "effect"
|
|
1870
|
+
*
|
|
1871
|
+
* console.log(Array.insertAt(["a", "b", "c", "e"], 3, "d")) // Option.some(["a", "b", "c", "d", "e"])
|
|
1872
|
+
* ```
|
|
1873
|
+
*
|
|
1874
|
+
* @see {@link replace} — replace an existing element
|
|
1875
|
+
* @see {@link modify} — transform an element at an index
|
|
1876
|
+
*
|
|
1877
|
+
* @category elements
|
|
1878
|
+
* @since 2.0.0
|
|
1879
|
+
*/
|
|
1880
|
+
export const insertAt: {
|
|
1881
|
+
<B>(i: number, b: B): <A>(self: Iterable<A>) => Option.Option<NonEmptyArray<A | B>>
|
|
1882
|
+
<A, B>(self: Iterable<A>, i: number, b: B): Option.Option<NonEmptyArray<A | B>>
|
|
1883
|
+
} = dual(3, <A, B>(self: Iterable<A>, i: number, b: B): Option.Option<NonEmptyArray<A | B>> => {
|
|
1884
|
+
const out: Array<A | B> = Array.from(self) // copy because `splice` mutates the array
|
|
1885
|
+
if (i < 0 || i > out.length) {
|
|
1886
|
+
return Option.none()
|
|
1887
|
+
}
|
|
1888
|
+
out.splice(i, 0, b)
|
|
1889
|
+
return Option.some(out as any)
|
|
1890
|
+
})
|
|
1891
|
+
|
|
1892
|
+
/**
|
|
1893
|
+
* Replaces the element at the specified index safely with a new value, returning the
|
|
1894
|
+
* updated array in `Option.some`.
|
|
1895
|
+
*
|
|
1896
|
+
* **When to use**
|
|
1897
|
+
*
|
|
1898
|
+
* Use to set a fixed replacement value at a specific index.
|
|
1899
|
+
*
|
|
1900
|
+
* **Details**
|
|
1901
|
+
*
|
|
1902
|
+
* Returns `Option.none()` when the index is out of bounds.
|
|
1903
|
+
*
|
|
1904
|
+
* **Example** (Replacing an element)
|
|
1905
|
+
*
|
|
1906
|
+
* ```ts
|
|
1907
|
+
* import { Array } from "effect"
|
|
1908
|
+
*
|
|
1909
|
+
* console.log(Array.replace([1, 2, 3], 1, 4)) // Option.some([1, 4, 3])
|
|
1910
|
+
* ```
|
|
1911
|
+
*
|
|
1912
|
+
* @see {@link modify} — transform an element with a function
|
|
1913
|
+
* @see {@link insertAt} — insert without removing
|
|
1914
|
+
*
|
|
1915
|
+
* @category elements
|
|
1916
|
+
* @since 2.0.0
|
|
1917
|
+
*/
|
|
1918
|
+
export const replace: {
|
|
1919
|
+
<B>(i: number, b: B): <A, S extends Iterable<A> = Iterable<A>>(
|
|
1920
|
+
self: S
|
|
1921
|
+
) => Option.Option<ReadonlyArray.With<S, ReadonlyArray.Infer<S> | B>>
|
|
1922
|
+
<A, B, S extends Iterable<A> = Iterable<A>>(
|
|
1923
|
+
self: S,
|
|
1924
|
+
i: number,
|
|
1925
|
+
b: B
|
|
1926
|
+
): Option.Option<ReadonlyArray.With<S, ReadonlyArray.Infer<S> | B>>
|
|
1927
|
+
} = dual(
|
|
1928
|
+
3,
|
|
1929
|
+
<A, B>(self: Iterable<A>, i: number, b: B): Option.Option<Array<A | B>> => modify(self, i, () => b)
|
|
1930
|
+
)
|
|
1931
|
+
|
|
1932
|
+
/**
|
|
1933
|
+
* Applies a function to the element at the specified index safely, returning the
|
|
1934
|
+
* updated array in `Option.some`.
|
|
1935
|
+
*
|
|
1936
|
+
* **When to use**
|
|
1937
|
+
*
|
|
1938
|
+
* Use to derive a replacement value from an array element at a specific index
|
|
1939
|
+
* while leaving the other elements unchanged.
|
|
1940
|
+
*
|
|
1941
|
+
* **Details**
|
|
1942
|
+
*
|
|
1943
|
+
* Returns `Option.none()` when the index is out of bounds.
|
|
1944
|
+
*
|
|
1945
|
+
* **Example** (Modifying an element)
|
|
1946
|
+
*
|
|
1947
|
+
* ```ts
|
|
1948
|
+
* import { Array } from "effect"
|
|
1949
|
+
*
|
|
1950
|
+
* console.log(Array.modify([1, 2, 3, 4], 2, (n) => n * 2)) // Option.some([1, 2, 6, 4])
|
|
1951
|
+
* console.log(Array.modify([1, 2, 3, 4], 5, (n) => n * 2)) // Option.none()
|
|
1952
|
+
* ```
|
|
1953
|
+
*
|
|
1954
|
+
* @see {@link replace} — set a fixed value at an index
|
|
1955
|
+
* @see {@link modifyHeadNonEmpty} — modify the first element
|
|
1956
|
+
* @see {@link modifyLastNonEmpty} — modify the last element
|
|
1957
|
+
*
|
|
1958
|
+
* @category elements
|
|
1959
|
+
* @since 2.0.0
|
|
1960
|
+
*/
|
|
1961
|
+
export const modify: {
|
|
1962
|
+
<A, B, S extends Iterable<A> = Iterable<A>>(
|
|
1963
|
+
i: number,
|
|
1964
|
+
f: (a: ReadonlyArray.Infer<S>) => B
|
|
1965
|
+
): (self: S) => Option.Option<ReadonlyArray.With<S, ReadonlyArray.Infer<S> | B>>
|
|
1966
|
+
<A, B, S extends Iterable<A> = Iterable<A>>(
|
|
1967
|
+
self: S,
|
|
1968
|
+
i: number,
|
|
1969
|
+
f: (a: ReadonlyArray.Infer<S>) => B
|
|
1970
|
+
): Option.Option<ReadonlyArray.With<S, ReadonlyArray.Infer<S> | B>>
|
|
1971
|
+
} = dual(3, <A, B>(self: Iterable<A>, i: number, f: (a: A) => B): Option.Option<Array<A | B>> => {
|
|
1972
|
+
const arr = Array.from(self)
|
|
1973
|
+
if (isOutOfBounds(i, arr)) {
|
|
1974
|
+
return Option.none()
|
|
1975
|
+
}
|
|
1976
|
+
const out: Array<A | B> = arr
|
|
1977
|
+
const b = f(arr[i])
|
|
1978
|
+
out[i] = b
|
|
1979
|
+
return Option.some(out)
|
|
1980
|
+
})
|
|
1981
|
+
|
|
1982
|
+
/**
|
|
1983
|
+
* Removes the element at the specified index, returning a new array. If the
|
|
1984
|
+
* index is out of bounds, returns a copy of the original.
|
|
1985
|
+
*
|
|
1986
|
+
* **When to use**
|
|
1987
|
+
*
|
|
1988
|
+
* Use when you want a missing index to be a no-op and need a fresh array result
|
|
1989
|
+
* instead of an optional failure.
|
|
1990
|
+
*
|
|
1991
|
+
* **Example** (Removing an element)
|
|
1992
|
+
*
|
|
1993
|
+
* ```ts
|
|
1994
|
+
* import { Array } from "effect"
|
|
1995
|
+
*
|
|
1996
|
+
* console.log(Array.remove([1, 2, 3, 4], 2)) // [1, 2, 4]
|
|
1997
|
+
* console.log(Array.remove([1, 2, 3, 4], 5)) // [1, 2, 3, 4]
|
|
1998
|
+
* ```
|
|
1999
|
+
*
|
|
2000
|
+
* @see {@link insertAt} — insert an element
|
|
2001
|
+
* @see {@link filter} — remove elements by predicate
|
|
2002
|
+
*
|
|
2003
|
+
* @category elements
|
|
2004
|
+
* @since 2.0.0
|
|
2005
|
+
*/
|
|
2006
|
+
export const remove: {
|
|
2007
|
+
(i: number): <A>(self: Iterable<A>) => Array<A>
|
|
2008
|
+
<A>(self: Iterable<A>, i: number): Array<A>
|
|
2009
|
+
} = dual(2, <A>(self: Iterable<A>, i: number): Array<A> => {
|
|
2010
|
+
const out = Array.from(self)
|
|
2011
|
+
if (isOutOfBounds(i, out)) {
|
|
2012
|
+
return out
|
|
2013
|
+
}
|
|
2014
|
+
out.splice(i, 1)
|
|
2015
|
+
return out
|
|
2016
|
+
})
|
|
2017
|
+
|
|
2018
|
+
/**
|
|
2019
|
+
* Reverses an iterable into a new array.
|
|
2020
|
+
*
|
|
2021
|
+
* **When to use**
|
|
2022
|
+
*
|
|
2023
|
+
* Use to reverse an iterable into a new array without mutating the original
|
|
2024
|
+
* input.
|
|
2025
|
+
*
|
|
2026
|
+
* **Details**
|
|
2027
|
+
*
|
|
2028
|
+
* Preserves `NonEmptyArray` in the return type.
|
|
2029
|
+
*
|
|
2030
|
+
* **Example** (Reversing an array)
|
|
2031
|
+
*
|
|
2032
|
+
* ```ts
|
|
2033
|
+
* import { Array } from "effect"
|
|
2034
|
+
*
|
|
2035
|
+
* console.log(Array.reverse([1, 2, 3, 4])) // [4, 3, 2, 1]
|
|
2036
|
+
* ```
|
|
2037
|
+
*
|
|
2038
|
+
* @category elements
|
|
2039
|
+
* @since 2.0.0
|
|
2040
|
+
*/
|
|
2041
|
+
export const reverse = <S extends Iterable<any>>(
|
|
2042
|
+
self: S
|
|
2043
|
+
): S extends NonEmptyReadonlyArray<infer A> ? NonEmptyArray<A> : S extends Iterable<infer A> ? Array<A> : never =>
|
|
2044
|
+
Array.from(self).reverse() as any
|
|
2045
|
+
|
|
2046
|
+
/**
|
|
2047
|
+
* Sorts an array by the given `Order`, returning a new array.
|
|
2048
|
+
*
|
|
2049
|
+
* **When to use**
|
|
2050
|
+
*
|
|
2051
|
+
* Use to sort an array using a single `Order` comparator.
|
|
2052
|
+
*
|
|
2053
|
+
* **Details**
|
|
2054
|
+
*
|
|
2055
|
+
* Preserves `NonEmptyArray` in the return type. Use `sortWith` to sort by a
|
|
2056
|
+
* derived key, or `sortBy` for multi-key sorting.
|
|
2057
|
+
*
|
|
2058
|
+
* **Example** (Sorting numbers)
|
|
2059
|
+
*
|
|
2060
|
+
* ```ts
|
|
2061
|
+
* import { Array, Order } from "effect"
|
|
2062
|
+
*
|
|
2063
|
+
* console.log(Array.sort([3, 1, 4, 1, 5], Order.Number)) // [1, 1, 3, 4, 5]
|
|
2064
|
+
* ```
|
|
2065
|
+
*
|
|
2066
|
+
* @see {@link sortWith} — sort by a mapping function
|
|
2067
|
+
* @see {@link sortBy} — sort by multiple orders
|
|
2068
|
+
*
|
|
2069
|
+
* @category sorting
|
|
2070
|
+
* @since 2.0.0
|
|
2071
|
+
*/
|
|
2072
|
+
export const sort: {
|
|
2073
|
+
<B>(
|
|
2074
|
+
O: Order.Order<B>
|
|
2075
|
+
): <A extends B, S extends Iterable<A>>(self: S) => ReadonlyArray.With<S, ReadonlyArray.Infer<S>>
|
|
2076
|
+
<A extends B, B>(self: NonEmptyReadonlyArray<A>, O: Order.Order<B>): NonEmptyArray<A>
|
|
2077
|
+
<A extends B, B>(self: Iterable<A>, O: Order.Order<B>): Array<A>
|
|
2078
|
+
} = dual(2, <A extends B, B>(self: Iterable<A>, O: Order.Order<B>): Array<A> => {
|
|
2079
|
+
const out = Array.from(self)
|
|
2080
|
+
out.sort(O)
|
|
2081
|
+
return out
|
|
2082
|
+
})
|
|
2083
|
+
|
|
2084
|
+
/**
|
|
2085
|
+
* Sorts an array by a derived key using a mapping function and an `Order` for
|
|
2086
|
+
* that key.
|
|
2087
|
+
*
|
|
2088
|
+
* **When to use**
|
|
2089
|
+
*
|
|
2090
|
+
* Use when you need to sort values by a derived key, such as a string length or
|
|
2091
|
+
* object field, while keeping the original values.
|
|
2092
|
+
*
|
|
2093
|
+
* **Details**
|
|
2094
|
+
*
|
|
2095
|
+
* Equivalent to `sort(Order.mapInput(order, f))`, but more convenient.
|
|
2096
|
+
*
|
|
2097
|
+
* **Example** (Sorting strings by length)
|
|
2098
|
+
*
|
|
2099
|
+
* ```ts
|
|
2100
|
+
* import { Array, Order } from "effect"
|
|
2101
|
+
*
|
|
2102
|
+
* console.log(Array.sortWith(["aaa", "b", "cc"], (s) => s.length, Order.Number))
|
|
2103
|
+
* // ["b", "cc", "aaa"]
|
|
2104
|
+
* ```
|
|
2105
|
+
*
|
|
2106
|
+
* @see {@link sort} for sorting with an `Order` that compares the elements directly
|
|
2107
|
+
* @see {@link sortBy} for sorting with multiple `Order`s applied in sequence
|
|
2108
|
+
*
|
|
2109
|
+
* @category elements
|
|
2110
|
+
* @since 2.0.0
|
|
2111
|
+
*/
|
|
2112
|
+
export const sortWith: {
|
|
2113
|
+
<S extends Iterable<any>, B>(
|
|
2114
|
+
f: (a: ReadonlyArray.Infer<S>) => B,
|
|
2115
|
+
order: Order.Order<B>
|
|
2116
|
+
): (self: S) => ReadonlyArray.With<S, ReadonlyArray.Infer<S>>
|
|
2117
|
+
<A, B>(self: NonEmptyReadonlyArray<A>, f: (a: A) => B, O: Order.Order<B>): NonEmptyArray<A>
|
|
2118
|
+
<A, B>(self: Iterable<A>, f: (a: A) => B, order: Order.Order<B>): Array<A>
|
|
2119
|
+
} = dual(
|
|
2120
|
+
3,
|
|
2121
|
+
<A, B>(self: Iterable<A>, f: (a: A) => B, order: Order.Order<B>): Array<A> =>
|
|
2122
|
+
Array.from(self).map((a) => [a, f(a)] as const).sort(([, a], [, b]) => order(a, b)).map(([_]) => _)
|
|
2123
|
+
)
|
|
2124
|
+
|
|
2125
|
+
/**
|
|
2126
|
+
* Sorts an array by multiple `Order`s applied in sequence: the first order is
|
|
2127
|
+
* used first; ties are broken by the second order, and so on.
|
|
2128
|
+
*
|
|
2129
|
+
* **When to use**
|
|
2130
|
+
*
|
|
2131
|
+
* Use to sort by multiple criteria where later orders break ties from earlier
|
|
2132
|
+
* ones.
|
|
2133
|
+
*
|
|
2134
|
+
* **Details**
|
|
2135
|
+
*
|
|
2136
|
+
* This is data-last only and returns a function. The return type preserves
|
|
2137
|
+
* `NonEmptyArray`.
|
|
2138
|
+
*
|
|
2139
|
+
* **Example** (Sorting by multiple keys)
|
|
2140
|
+
*
|
|
2141
|
+
* ```ts
|
|
2142
|
+
* import { Array, Order, pipe } from "effect"
|
|
2143
|
+
*
|
|
2144
|
+
* const users = [
|
|
2145
|
+
* { name: "Alice", age: 30 },
|
|
2146
|
+
* { name: "Bob", age: 25 },
|
|
2147
|
+
* { name: "Charlie", age: 30 }
|
|
2148
|
+
* ]
|
|
2149
|
+
*
|
|
2150
|
+
* const result = pipe(
|
|
2151
|
+
* users,
|
|
2152
|
+
* Array.sortBy(
|
|
2153
|
+
* Order.mapInput(Order.Number, (user: (typeof users)[number]) => user.age),
|
|
2154
|
+
* Order.mapInput(Order.String, (user: (typeof users)[number]) => user.name)
|
|
2155
|
+
* )
|
|
2156
|
+
* )
|
|
2157
|
+
* console.log(result)
|
|
2158
|
+
* // [{ name: "Bob", age: 25 }, { name: "Alice", age: 30 }, { name: "Charlie", age: 30 }]
|
|
2159
|
+
* ```
|
|
2160
|
+
*
|
|
2161
|
+
* @see {@link sort} — sort by a single `Order`
|
|
2162
|
+
* @see {@link sortWith} — sort by a derived key
|
|
2163
|
+
*
|
|
2164
|
+
* @category sorting
|
|
2165
|
+
* @since 2.0.0
|
|
2166
|
+
*/
|
|
2167
|
+
export const sortBy = <S extends Iterable<any>>(
|
|
2168
|
+
...orders: ReadonlyArray<Order.Order<ReadonlyArray.Infer<S>>>
|
|
2169
|
+
) => {
|
|
2170
|
+
const sortByAll = sort(Order.combineAll(orders))
|
|
2171
|
+
return (
|
|
2172
|
+
self: S
|
|
2173
|
+
): S extends NonEmptyReadonlyArray<infer A> ? NonEmptyArray<A> : S extends Iterable<infer A> ? Array<A> : never => {
|
|
2174
|
+
const input = fromIterable(self)
|
|
2175
|
+
if (isReadonlyArrayNonEmpty(input)) {
|
|
2176
|
+
return sortByAll(input) as any
|
|
2177
|
+
}
|
|
2178
|
+
return [] as any
|
|
2179
|
+
}
|
|
2180
|
+
}
|
|
2181
|
+
|
|
2182
|
+
/**
|
|
2183
|
+
* Pairs elements from two iterables by position. If the iterables differ in
|
|
2184
|
+
* length, the extra elements from the longer one are discarded.
|
|
2185
|
+
*
|
|
2186
|
+
* **When to use**
|
|
2187
|
+
*
|
|
2188
|
+
* Use when you need simple pairs of corresponding elements from two iterables.
|
|
2189
|
+
*
|
|
2190
|
+
* **Details**
|
|
2191
|
+
*
|
|
2192
|
+
* Returns `NonEmptyArray` when both inputs are non-empty.
|
|
2193
|
+
*
|
|
2194
|
+
* **Example** (Zipping two arrays)
|
|
2195
|
+
*
|
|
2196
|
+
* ```ts
|
|
2197
|
+
* import { Array } from "effect"
|
|
2198
|
+
*
|
|
2199
|
+
* console.log(Array.zip([1, 2, 3], ["a", "b"])) // [[1, "a"], [2, "b"]]
|
|
2200
|
+
* ```
|
|
2201
|
+
*
|
|
2202
|
+
* @see {@link zipWith} — zip with a combiner function
|
|
2203
|
+
* @see {@link unzip} — inverse operation
|
|
2204
|
+
*
|
|
2205
|
+
* @category zipping
|
|
2206
|
+
* @since 2.0.0
|
|
2207
|
+
*/
|
|
2208
|
+
export const zip: {
|
|
2209
|
+
<B>(that: NonEmptyReadonlyArray<B>): <A>(self: NonEmptyReadonlyArray<A>) => NonEmptyArray<[A, B]>
|
|
2210
|
+
<B>(that: Iterable<B>): <A>(self: Iterable<A>) => Array<[A, B]>
|
|
2211
|
+
<A, B>(self: NonEmptyReadonlyArray<A>, that: NonEmptyReadonlyArray<B>): NonEmptyArray<[A, B]>
|
|
2212
|
+
<A, B>(self: Iterable<A>, that: Iterable<B>): Array<[A, B]>
|
|
2213
|
+
} = dual(
|
|
2214
|
+
2,
|
|
2215
|
+
<A, B>(self: Iterable<A>, that: Iterable<B>): Array<[A, B]> => zipWith(self, that, Tuple.make)
|
|
2216
|
+
)
|
|
2217
|
+
|
|
2218
|
+
/**
|
|
2219
|
+
* Combines elements from two iterables pairwise using a function. If the
|
|
2220
|
+
* iterables differ in length, extra elements are discarded.
|
|
2221
|
+
*
|
|
2222
|
+
* **When to use**
|
|
2223
|
+
*
|
|
2224
|
+
* Use when zipping two iterables in an array pipeline and each pair should
|
|
2225
|
+
* become a computed array element instead of a tuple.
|
|
2226
|
+
*
|
|
2227
|
+
* **Example** (Zipping with addition)
|
|
2228
|
+
*
|
|
2229
|
+
* ```ts
|
|
2230
|
+
* import { Array } from "effect"
|
|
2231
|
+
*
|
|
2232
|
+
* console.log(Array.zipWith([1, 2, 3], [4, 5, 6], (a, b) => a + b)) // [5, 7, 9]
|
|
2233
|
+
* ```
|
|
2234
|
+
*
|
|
2235
|
+
* @see {@link zip} — zip into tuples
|
|
2236
|
+
*
|
|
2237
|
+
* @category zipping
|
|
2238
|
+
* @since 2.0.0
|
|
2239
|
+
*/
|
|
2240
|
+
export const zipWith: {
|
|
2241
|
+
<B, A, C>(that: NonEmptyReadonlyArray<B>, f: (a: A, b: B) => C): (self: NonEmptyReadonlyArray<A>) => NonEmptyArray<C>
|
|
2242
|
+
<B, A, C>(that: Iterable<B>, f: (a: A, b: B) => C): (self: Iterable<A>) => Array<C>
|
|
2243
|
+
<A, B, C>(self: NonEmptyReadonlyArray<A>, that: NonEmptyReadonlyArray<B>, f: (a: A, b: B) => C): NonEmptyArray<C>
|
|
2244
|
+
<B, A, C>(self: Iterable<A>, that: Iterable<B>, f: (a: A, b: B) => C): Array<C>
|
|
2245
|
+
} = dual(3, <B, A, C>(self: Iterable<A>, that: Iterable<B>, f: (a: A, b: B) => C): Array<C> => {
|
|
2246
|
+
const as = fromIterable(self)
|
|
2247
|
+
const bs = fromIterable(that)
|
|
2248
|
+
if (isReadonlyArrayNonEmpty(as) && isReadonlyArrayNonEmpty(bs)) {
|
|
2249
|
+
const out: NonEmptyArray<C> = [f(headNonEmpty(as), headNonEmpty(bs))]
|
|
2250
|
+
const len = Math.min(as.length, bs.length)
|
|
2251
|
+
for (let i = 1; i < len; i++) {
|
|
2252
|
+
out[i] = f(as[i], bs[i])
|
|
2253
|
+
}
|
|
2254
|
+
return out
|
|
2255
|
+
}
|
|
2256
|
+
return []
|
|
2257
|
+
})
|
|
2258
|
+
|
|
2259
|
+
/**
|
|
2260
|
+
* Splits an array of pairs into two arrays. Inverse of {@link zip}.
|
|
2261
|
+
*
|
|
2262
|
+
* **Example** (Unzipping pairs)
|
|
2263
|
+
*
|
|
2264
|
+
* ```ts
|
|
2265
|
+
* import { Array } from "effect"
|
|
2266
|
+
*
|
|
2267
|
+
* console.log(Array.unzip([[1, "a"], [2, "b"], [3, "c"]])) // [[1, 2, 3], ["a", "b", "c"]]
|
|
2268
|
+
* ```
|
|
2269
|
+
*
|
|
2270
|
+
* @see {@link zip} — combine two arrays into pairs
|
|
2271
|
+
*
|
|
2272
|
+
* @category zipping
|
|
2273
|
+
* @since 2.0.0
|
|
2274
|
+
*/
|
|
2275
|
+
export const unzip: <S extends Iterable<readonly [any, any]>>(
|
|
2276
|
+
self: S
|
|
2277
|
+
) => S extends NonEmptyReadonlyArray<readonly [infer A, infer B]> ? [NonEmptyArray<A>, NonEmptyArray<B>]
|
|
2278
|
+
: S extends Iterable<readonly [infer A, infer B]> ? [Array<A>, Array<B>]
|
|
2279
|
+
: never = (<A, B>(self: Iterable<readonly [A, B]>): [Array<A>, Array<B>] => {
|
|
2280
|
+
const input = fromIterable(self)
|
|
2281
|
+
if (isReadonlyArrayNonEmpty(input)) {
|
|
2282
|
+
const fa: NonEmptyArray<A> = [input[0][0]]
|
|
2283
|
+
const fb: NonEmptyArray<B> = [input[0][1]]
|
|
2284
|
+
for (let i = 1; i < input.length; i++) {
|
|
2285
|
+
fa[i] = input[i][0]
|
|
2286
|
+
fb[i] = input[i][1]
|
|
2287
|
+
}
|
|
2288
|
+
return [fa, fb]
|
|
2289
|
+
}
|
|
2290
|
+
return [[], []]
|
|
2291
|
+
}) as any
|
|
2292
|
+
|
|
2293
|
+
/**
|
|
2294
|
+
* Places a separator element between every pair of elements.
|
|
2295
|
+
*
|
|
2296
|
+
* **When to use**
|
|
2297
|
+
*
|
|
2298
|
+
* Use to insert a separator between elements, for example when preparing data for display or concatenation.
|
|
2299
|
+
*
|
|
2300
|
+
* **Details**
|
|
2301
|
+
*
|
|
2302
|
+
* The return type preserves `NonEmptyArray`. Empty inputs produce an empty
|
|
2303
|
+
* result.
|
|
2304
|
+
*
|
|
2305
|
+
* **Example** (Interspersing a separator)
|
|
2306
|
+
*
|
|
2307
|
+
* ```ts
|
|
2308
|
+
* import { Array } from "effect"
|
|
2309
|
+
*
|
|
2310
|
+
* console.log(Array.intersperse([1, 2, 3], 0)) // [1, 0, 2, 0, 3]
|
|
2311
|
+
* ```
|
|
2312
|
+
*
|
|
2313
|
+
* @see {@link join} — intersperse and join into a string
|
|
2314
|
+
*
|
|
2315
|
+
* @category elements
|
|
2316
|
+
* @since 2.0.0
|
|
2317
|
+
*/
|
|
2318
|
+
export const intersperse: {
|
|
2319
|
+
<B>(
|
|
2320
|
+
middle: B
|
|
2321
|
+
): <S extends Iterable<any>>(self: S) => ReadonlyArray.With<S, ReadonlyArray.Infer<S> | B>
|
|
2322
|
+
<A, B>(self: NonEmptyReadonlyArray<A>, middle: B): NonEmptyArray<A | B>
|
|
2323
|
+
<A, B>(self: Iterable<A>, middle: B): Array<A | B>
|
|
2324
|
+
} = dual(2, <A, B>(self: Iterable<A>, middle: B): Array<A | B> => {
|
|
2325
|
+
const input = fromIterable(self)
|
|
2326
|
+
if (isReadonlyArrayNonEmpty(input)) {
|
|
2327
|
+
const out: NonEmptyArray<A | B> = [headNonEmpty(input)]
|
|
2328
|
+
const tail = tailNonEmpty(input)
|
|
2329
|
+
for (let i = 0; i < tail.length; i++) {
|
|
2330
|
+
if (i < tail.length) {
|
|
2331
|
+
out.push(middle)
|
|
2332
|
+
}
|
|
2333
|
+
out.push(tail[i])
|
|
2334
|
+
}
|
|
2335
|
+
return out
|
|
2336
|
+
}
|
|
2337
|
+
return []
|
|
2338
|
+
})
|
|
2339
|
+
|
|
2340
|
+
/**
|
|
2341
|
+
* Applies a function to the first element of a non-empty array, returning a
|
|
2342
|
+
* new array.
|
|
2343
|
+
*
|
|
2344
|
+
* **When to use**
|
|
2345
|
+
*
|
|
2346
|
+
* Use to transform the first element of a non-empty array while preserving the rest.
|
|
2347
|
+
*
|
|
2348
|
+
* **Example** (Modifying the head)
|
|
2349
|
+
*
|
|
2350
|
+
* ```ts
|
|
2351
|
+
* import { Array } from "effect"
|
|
2352
|
+
*
|
|
2353
|
+
* console.log(Array.modifyHeadNonEmpty([1, 2, 3], (n) => n * 10)) // [10, 2, 3]
|
|
2354
|
+
* ```
|
|
2355
|
+
*
|
|
2356
|
+
* @see {@link setHeadNonEmpty} — replace with a fixed value
|
|
2357
|
+
* @see {@link modifyLastNonEmpty} — modify the last element
|
|
2358
|
+
*
|
|
2359
|
+
* @category elements
|
|
2360
|
+
* @since 4.0.0
|
|
2361
|
+
*/
|
|
2362
|
+
export const modifyHeadNonEmpty: {
|
|
2363
|
+
<A, B>(f: (a: A) => B): (self: NonEmptyReadonlyArray<A>) => NonEmptyArray<A | B>
|
|
2364
|
+
<A, B>(self: NonEmptyReadonlyArray<A>, f: (a: A) => B): NonEmptyArray<A | B>
|
|
2365
|
+
} = dual(
|
|
2366
|
+
2,
|
|
2367
|
+
<A, B>(
|
|
2368
|
+
self: NonEmptyReadonlyArray<A>,
|
|
2369
|
+
f: (a: A) => B
|
|
2370
|
+
): NonEmptyArray<A | B> => [f(headNonEmpty(self)), ...tailNonEmpty(self)]
|
|
2371
|
+
)
|
|
2372
|
+
|
|
2373
|
+
/**
|
|
2374
|
+
* Replaces the first element of a non-empty array with a new value.
|
|
2375
|
+
*
|
|
2376
|
+
* **When to use**
|
|
2377
|
+
*
|
|
2378
|
+
* Use when you already know the array is non-empty and the replacement value
|
|
2379
|
+
* does not depend on the current first element.
|
|
2380
|
+
*
|
|
2381
|
+
* **Example** (Setting the head)
|
|
2382
|
+
*
|
|
2383
|
+
* ```ts
|
|
2384
|
+
* import { Array } from "effect"
|
|
2385
|
+
*
|
|
2386
|
+
* console.log(Array.setHeadNonEmpty([1, 2, 3], 10)) // [10, 2, 3]
|
|
2387
|
+
* ```
|
|
2388
|
+
*
|
|
2389
|
+
* @see {@link modifyHeadNonEmpty} — transform the head with a function
|
|
2390
|
+
* @see {@link setLastNonEmpty} — replace the last element
|
|
2391
|
+
*
|
|
2392
|
+
* @category elements
|
|
2393
|
+
* @since 4.0.0
|
|
2394
|
+
*/
|
|
2395
|
+
export const setHeadNonEmpty: {
|
|
2396
|
+
<B>(b: B): <A>(self: NonEmptyReadonlyArray<A>) => NonEmptyArray<A | B>
|
|
2397
|
+
<A, B>(self: NonEmptyReadonlyArray<A>, b: B): NonEmptyArray<A | B>
|
|
2398
|
+
} = dual(
|
|
2399
|
+
2,
|
|
2400
|
+
<A, B>(self: NonEmptyReadonlyArray<A>, b: B): NonEmptyArray<A | B> => modifyHeadNonEmpty(self, () => b)
|
|
2401
|
+
)
|
|
2402
|
+
|
|
2403
|
+
/**
|
|
2404
|
+
* Applies a function to the last element of a non-empty array, returning a
|
|
2405
|
+
* new array.
|
|
2406
|
+
*
|
|
2407
|
+
* **When to use**
|
|
2408
|
+
*
|
|
2409
|
+
* Use when you already know the array is non-empty and the new last element
|
|
2410
|
+
* depends on the current last element.
|
|
2411
|
+
*
|
|
2412
|
+
* **Example** (Modifying the last element)
|
|
2413
|
+
*
|
|
2414
|
+
* ```ts
|
|
2415
|
+
* import { Array } from "effect"
|
|
2416
|
+
*
|
|
2417
|
+
* console.log(Array.modifyLastNonEmpty([1, 2, 3], (n) => n * 2)) // [1, 2, 6]
|
|
2418
|
+
* ```
|
|
2419
|
+
*
|
|
2420
|
+
* @see {@link setLastNonEmpty} — replace with a fixed value
|
|
2421
|
+
* @see {@link modifyHeadNonEmpty} — modify the first element
|
|
2422
|
+
*
|
|
2423
|
+
* @category elements
|
|
2424
|
+
* @since 4.0.0
|
|
2425
|
+
*/
|
|
2426
|
+
export const modifyLastNonEmpty: {
|
|
2427
|
+
<A, B>(f: (a: A) => B): (self: NonEmptyReadonlyArray<A>) => NonEmptyArray<A | B>
|
|
2428
|
+
<A, B>(self: NonEmptyReadonlyArray<A>, f: (a: A) => B): NonEmptyArray<A | B>
|
|
2429
|
+
} = dual(
|
|
2430
|
+
2,
|
|
2431
|
+
<A, B>(self: NonEmptyReadonlyArray<A>, f: (a: A) => B): NonEmptyArray<A | B> =>
|
|
2432
|
+
append(initNonEmpty(self), f(lastNonEmpty(self)))
|
|
2433
|
+
)
|
|
2434
|
+
|
|
2435
|
+
/**
|
|
2436
|
+
* Replaces the last element of a non-empty array with a new value.
|
|
2437
|
+
*
|
|
2438
|
+
* **When to use**
|
|
2439
|
+
*
|
|
2440
|
+
* Use when you already know the array is non-empty and the replacement value
|
|
2441
|
+
* does not depend on the current last element.
|
|
2442
|
+
*
|
|
2443
|
+
* **Example** (Setting the last element)
|
|
2444
|
+
*
|
|
2445
|
+
* ```ts
|
|
2446
|
+
* import { Array } from "effect"
|
|
2447
|
+
*
|
|
2448
|
+
* console.log(Array.setLastNonEmpty([1, 2, 3], 4)) // [1, 2, 4]
|
|
2449
|
+
* ```
|
|
2450
|
+
*
|
|
2451
|
+
* @see {@link modifyLastNonEmpty} — transform the last element with a function
|
|
2452
|
+
* @see {@link setHeadNonEmpty} — replace the first element
|
|
2453
|
+
*
|
|
2454
|
+
* @category elements
|
|
2455
|
+
* @since 4.0.0
|
|
2456
|
+
*/
|
|
2457
|
+
export const setLastNonEmpty: {
|
|
2458
|
+
<B>(b: B): <A>(self: NonEmptyReadonlyArray<A>) => NonEmptyArray<A | B>
|
|
2459
|
+
<A, B>(self: NonEmptyReadonlyArray<A>, b: B): NonEmptyArray<A | B>
|
|
2460
|
+
} = dual(
|
|
2461
|
+
2,
|
|
2462
|
+
<A, B>(self: NonEmptyReadonlyArray<A>, b: B): NonEmptyArray<A | B> => modifyLastNonEmpty(self, () => b)
|
|
2463
|
+
)
|
|
2464
|
+
|
|
2465
|
+
/**
|
|
2466
|
+
* Transforms an array by rotating it `n` steps. Positive `n` rotates right; negative `n`
|
|
2467
|
+
* rotates left.
|
|
2468
|
+
*
|
|
2469
|
+
* **When to use**
|
|
2470
|
+
*
|
|
2471
|
+
* Use when elements should wrap around the end of the array rather than being
|
|
2472
|
+
* dropped.
|
|
2473
|
+
*
|
|
2474
|
+
* **Details**
|
|
2475
|
+
*
|
|
2476
|
+
* `n` is rounded to the nearest integer before rotating. The return type
|
|
2477
|
+
* preserves `NonEmptyArray`. Empty arrays, or rotations normalized to `0`,
|
|
2478
|
+
* return a copy.
|
|
2479
|
+
*
|
|
2480
|
+
* **Example** (Rotating elements)
|
|
2481
|
+
*
|
|
2482
|
+
* ```ts
|
|
2483
|
+
* import { Array } from "effect"
|
|
2484
|
+
*
|
|
2485
|
+
* console.log(Array.rotate(["a", "b", "c", "d"], 2)) // ["c", "d", "a", "b"]
|
|
2486
|
+
* ```
|
|
2487
|
+
*
|
|
2488
|
+
* @see {@link take} for taking a fixed number of elements from the start
|
|
2489
|
+
* @see {@link drop} for dropping a fixed number of elements from the start
|
|
2490
|
+
*
|
|
2491
|
+
* @category elements
|
|
2492
|
+
* @since 2.0.0
|
|
2493
|
+
*/
|
|
2494
|
+
export const rotate: {
|
|
2495
|
+
(n: number): <S extends Iterable<any>>(self: S) => ReadonlyArray.With<S, ReadonlyArray.Infer<S>>
|
|
2496
|
+
<A>(self: NonEmptyReadonlyArray<A>, n: number): NonEmptyArray<A>
|
|
2497
|
+
<A>(self: Iterable<A>, n: number): Array<A>
|
|
2498
|
+
} = dual(2, <A>(self: Iterable<A>, n: number): Array<A> => {
|
|
2499
|
+
const input = fromIterable(self)
|
|
2500
|
+
if (isReadonlyArrayNonEmpty(input)) {
|
|
2501
|
+
const len = input.length
|
|
2502
|
+
const m = Math.round(n) % len
|
|
2503
|
+
if (isOutOfBounds(Math.abs(m), input) || m === 0) {
|
|
2504
|
+
return copy(input)
|
|
2505
|
+
}
|
|
2506
|
+
if (m < 0) {
|
|
2507
|
+
const [f, s] = splitAtNonEmpty(input, -m)
|
|
2508
|
+
return appendAll(s, f)
|
|
2509
|
+
} else {
|
|
2510
|
+
return rotate(self, m - len)
|
|
2511
|
+
}
|
|
2512
|
+
}
|
|
2513
|
+
return []
|
|
2514
|
+
})
|
|
2515
|
+
|
|
2516
|
+
/**
|
|
2517
|
+
* Returns a membership-test function using a custom equivalence.
|
|
2518
|
+
*
|
|
2519
|
+
* **When to use**
|
|
2520
|
+
*
|
|
2521
|
+
* Use when checking membership with caller-provided equality instead of
|
|
2522
|
+
* `Equal.equivalence()`.
|
|
2523
|
+
*
|
|
2524
|
+
* **Example** (Checking with custom equality)
|
|
2525
|
+
*
|
|
2526
|
+
* ```ts
|
|
2527
|
+
* import { Array, pipe } from "effect"
|
|
2528
|
+
*
|
|
2529
|
+
* const containsNumber = Array.containsWith((a: number, b: number) => a === b)
|
|
2530
|
+
* console.log(pipe([1, 2, 3, 4], containsNumber(3))) // true
|
|
2531
|
+
* ```
|
|
2532
|
+
*
|
|
2533
|
+
* @see {@link contains} for the `Equal.equivalence()` variant
|
|
2534
|
+
*
|
|
2535
|
+
* @category elements
|
|
2536
|
+
* @since 2.0.0
|
|
2537
|
+
*/
|
|
2538
|
+
export const containsWith = <A>(isEquivalent: (self: A, that: A) => boolean): {
|
|
2539
|
+
(a: A): (self: Iterable<A>) => boolean
|
|
2540
|
+
(self: Iterable<A>, a: A): boolean
|
|
2541
|
+
} =>
|
|
2542
|
+
dual(2, (self: Iterable<A>, a: A): boolean => {
|
|
2543
|
+
for (const i of self) {
|
|
2544
|
+
if (isEquivalent(a, i)) {
|
|
2545
|
+
return true
|
|
2546
|
+
}
|
|
2547
|
+
}
|
|
2548
|
+
return false
|
|
2549
|
+
})
|
|
2550
|
+
|
|
2551
|
+
/**
|
|
2552
|
+
* Checks whether an array contains a value, using `Equal.equivalence()` for
|
|
2553
|
+
* comparison.
|
|
2554
|
+
*
|
|
2555
|
+
* **When to use**
|
|
2556
|
+
*
|
|
2557
|
+
* Use to check whether an iterable contains a value using Effect's default
|
|
2558
|
+
* equality instead of providing a comparison function.
|
|
2559
|
+
*
|
|
2560
|
+
* **Example** (Checking membership)
|
|
2561
|
+
*
|
|
2562
|
+
* ```ts
|
|
2563
|
+
* import { Array, pipe } from "effect"
|
|
2564
|
+
*
|
|
2565
|
+
* console.log(pipe(["a", "b", "c", "d"], Array.contains("c"))) // true
|
|
2566
|
+
* ```
|
|
2567
|
+
*
|
|
2568
|
+
* @see {@link containsWith} — use custom equality
|
|
2569
|
+
*
|
|
2570
|
+
* @category elements
|
|
2571
|
+
* @since 2.0.0
|
|
2572
|
+
*/
|
|
2573
|
+
export const contains: {
|
|
2574
|
+
<A>(a: A): (self: Iterable<A>) => boolean
|
|
2575
|
+
<A>(self: Iterable<A>, a: A): boolean
|
|
2576
|
+
} = containsWith(Equal.asEquivalence())
|
|
2577
|
+
|
|
2578
|
+
/**
|
|
2579
|
+
* Applies a function repeatedly to consume prefixes of the array and collect
|
|
2580
|
+
* the values it produces.
|
|
2581
|
+
*
|
|
2582
|
+
* **When to use**
|
|
2583
|
+
*
|
|
2584
|
+
* Use when you need custom grouping logic where each step returns both a value
|
|
2585
|
+
* and the remaining input.
|
|
2586
|
+
*
|
|
2587
|
+
* **Details**
|
|
2588
|
+
*
|
|
2589
|
+
* The function receives a `NonEmptyReadonlyArray` and returns `[value, rest]`.
|
|
2590
|
+
* Processing continues until the remaining array is empty.
|
|
2591
|
+
*
|
|
2592
|
+
* **Example** (Chopping an array)
|
|
2593
|
+
*
|
|
2594
|
+
* ```ts
|
|
2595
|
+
* import { Array } from "effect"
|
|
2596
|
+
*
|
|
2597
|
+
* const result = Array.chop(
|
|
2598
|
+
* [1, 2, 3, 4, 5],
|
|
2599
|
+
* (as): [number, Array<number>] => [as[0] * 2, as.slice(1)]
|
|
2600
|
+
* )
|
|
2601
|
+
* console.log(result) // [2, 4, 6, 8, 10]
|
|
2602
|
+
* ```
|
|
2603
|
+
*
|
|
2604
|
+
* @see {@link chunksOf} — split into fixed-size chunks
|
|
2605
|
+
* @see {@link splitAt} — split at an index
|
|
2606
|
+
*
|
|
2607
|
+
* @category elements
|
|
2608
|
+
* @since 2.0.0
|
|
2609
|
+
*/
|
|
2610
|
+
export const chop: {
|
|
2611
|
+
<S extends Iterable<any>, B>(
|
|
2612
|
+
f: (as: NonEmptyReadonlyArray<ReadonlyArray.Infer<S>>) => readonly [B, ReadonlyArray<ReadonlyArray.Infer<S>>]
|
|
2613
|
+
): (self: S) => ReadonlyArray.With<S, ReadonlyArray.Infer<S>>
|
|
2614
|
+
<A, B>(
|
|
2615
|
+
self: NonEmptyReadonlyArray<A>,
|
|
2616
|
+
f: (as: NonEmptyReadonlyArray<A>) => readonly [B, ReadonlyArray<A>]
|
|
2617
|
+
): NonEmptyArray<B>
|
|
2618
|
+
<A, B>(
|
|
2619
|
+
self: Iterable<A>,
|
|
2620
|
+
f: (as: NonEmptyReadonlyArray<A>) => readonly [B, ReadonlyArray<A>]
|
|
2621
|
+
): Array<B>
|
|
2622
|
+
} = dual(2, <A, B>(
|
|
2623
|
+
self: Iterable<A>,
|
|
2624
|
+
f: (as: NonEmptyReadonlyArray<A>) => readonly [B, ReadonlyArray<A>]
|
|
2625
|
+
): Array<B> => {
|
|
2626
|
+
const input = fromIterable(self)
|
|
2627
|
+
if (isReadonlyArrayNonEmpty(input)) {
|
|
2628
|
+
const [b, rest] = f(input)
|
|
2629
|
+
const out: NonEmptyArray<B> = [b]
|
|
2630
|
+
let next: ReadonlyArray<A> = rest
|
|
2631
|
+
while (internalArray.isArrayNonEmpty(next)) {
|
|
2632
|
+
const [b, rest] = f(next)
|
|
2633
|
+
out.push(b)
|
|
2634
|
+
next = rest
|
|
2635
|
+
}
|
|
2636
|
+
return out
|
|
2637
|
+
}
|
|
2638
|
+
return []
|
|
2639
|
+
})
|
|
2640
|
+
|
|
2641
|
+
/**
|
|
2642
|
+
* Splits an iterable into two arrays at the given index.
|
|
2643
|
+
*
|
|
2644
|
+
* **When to use**
|
|
2645
|
+
*
|
|
2646
|
+
* Use to divide an array into a prefix and suffix at a specific position.
|
|
2647
|
+
*
|
|
2648
|
+
* **Details**
|
|
2649
|
+
*
|
|
2650
|
+
* `n` can be `0`, in which case all elements are placed in the second array.
|
|
2651
|
+
* The index is floored to an integer.
|
|
2652
|
+
*
|
|
2653
|
+
* **Example** (Splitting at an index)
|
|
2654
|
+
*
|
|
2655
|
+
* ```ts
|
|
2656
|
+
* import { Array } from "effect"
|
|
2657
|
+
*
|
|
2658
|
+
* console.log(Array.splitAt([1, 2, 3, 4, 5], 3)) // [[1, 2, 3], [4, 5]]
|
|
2659
|
+
* ```
|
|
2660
|
+
*
|
|
2661
|
+
* @see {@link splitAtNonEmpty} — for non-empty arrays
|
|
2662
|
+
* @see {@link splitWhere} — split at a predicate boundary
|
|
2663
|
+
*
|
|
2664
|
+
* @category splitting
|
|
2665
|
+
* @since 2.0.0
|
|
2666
|
+
*/
|
|
2667
|
+
export const splitAt: {
|
|
2668
|
+
(n: number): <A>(self: Iterable<A>) => [beforeIndex: Array<A>, fromIndex: Array<A>]
|
|
2669
|
+
<A>(self: Iterable<A>, n: number): [beforeIndex: Array<A>, fromIndex: Array<A>]
|
|
2670
|
+
} = dual(2, <A>(self: Iterable<A>, n: number): [Array<A>, Array<A>] => {
|
|
2671
|
+
const input = Array.from(self)
|
|
2672
|
+
const _n = Math.floor(n)
|
|
2673
|
+
if (isReadonlyArrayNonEmpty(input)) {
|
|
2674
|
+
if (_n >= 1) {
|
|
2675
|
+
return splitAtNonEmpty(input, _n)
|
|
2676
|
+
}
|
|
2677
|
+
return [[], input]
|
|
2678
|
+
}
|
|
2679
|
+
return [input, []]
|
|
2680
|
+
})
|
|
2681
|
+
|
|
2682
|
+
/**
|
|
2683
|
+
* Splits a non-empty array into two parts at the given index. The first part
|
|
2684
|
+
* is guaranteed to be non-empty (`n` is clamped to >= 1).
|
|
2685
|
+
*
|
|
2686
|
+
* **When to use**
|
|
2687
|
+
*
|
|
2688
|
+
* Use when downstream code requires the left side of the split to contain at
|
|
2689
|
+
* least one element.
|
|
2690
|
+
*
|
|
2691
|
+
* **Example** (Splitting a non-empty array)
|
|
2692
|
+
*
|
|
2693
|
+
* ```ts
|
|
2694
|
+
* import { Array } from "effect"
|
|
2695
|
+
*
|
|
2696
|
+
* console.log(Array.splitAtNonEmpty(["a", "b", "c", "d", "e"], 3))
|
|
2697
|
+
* // [["a", "b", "c"], ["d", "e"]]
|
|
2698
|
+
* ```
|
|
2699
|
+
*
|
|
2700
|
+
* @see {@link splitAt} — for possibly-empty arrays
|
|
2701
|
+
*
|
|
2702
|
+
* @category splitting
|
|
2703
|
+
* @since 4.0.0
|
|
2704
|
+
*/
|
|
2705
|
+
export const splitAtNonEmpty: {
|
|
2706
|
+
(n: number): <A>(self: NonEmptyReadonlyArray<A>) => [beforeIndex: NonEmptyArray<A>, fromIndex: Array<A>]
|
|
2707
|
+
<A>(self: NonEmptyReadonlyArray<A>, n: number): [beforeIndex: NonEmptyArray<A>, fromIndex: Array<A>]
|
|
2708
|
+
} = dual(2, <A>(self: NonEmptyReadonlyArray<A>, n: number): [NonEmptyArray<A>, Array<A>] => {
|
|
2709
|
+
const _n = Math.max(1, Math.floor(n))
|
|
2710
|
+
return _n >= self.length ?
|
|
2711
|
+
[copy(self), []] :
|
|
2712
|
+
[prepend(self.slice(1, _n), headNonEmpty(self)), self.slice(_n)]
|
|
2713
|
+
})
|
|
2714
|
+
|
|
2715
|
+
/**
|
|
2716
|
+
* Splits an iterable into `n` roughly equal-sized chunks.
|
|
2717
|
+
*
|
|
2718
|
+
* **When to use**
|
|
2719
|
+
*
|
|
2720
|
+
* Use to distribute elements across a fixed number of groups, such as when splitting work across threads.
|
|
2721
|
+
*
|
|
2722
|
+
* **Details**
|
|
2723
|
+
*
|
|
2724
|
+
* Uses `chunksOf(ceil(length / n))` internally. The last chunk may be shorter.
|
|
2725
|
+
*
|
|
2726
|
+
* **Example** (Splitting into groups)
|
|
2727
|
+
*
|
|
2728
|
+
* ```ts
|
|
2729
|
+
* import { Array } from "effect"
|
|
2730
|
+
*
|
|
2731
|
+
* console.log(Array.split([1, 2, 3, 4, 5, 6, 7, 8], 3)) // [[1, 2, 3], [4, 5, 6], [7, 8]]
|
|
2732
|
+
* ```
|
|
2733
|
+
*
|
|
2734
|
+
* @see {@link chunksOf} — split into fixed-size chunks
|
|
2735
|
+
*
|
|
2736
|
+
* @category splitting
|
|
2737
|
+
* @since 2.0.0
|
|
2738
|
+
*/
|
|
2739
|
+
export const split: {
|
|
2740
|
+
(n: number): <A>(self: Iterable<A>) => Array<Array<A>>
|
|
2741
|
+
<A>(self: Iterable<A>, n: number): Array<Array<A>>
|
|
2742
|
+
} = dual(2, <A>(self: Iterable<A>, n: number) => {
|
|
2743
|
+
const input = fromIterable(self)
|
|
2744
|
+
return chunksOf(input, Math.ceil(input.length / Math.floor(n)))
|
|
2745
|
+
})
|
|
2746
|
+
|
|
2747
|
+
/**
|
|
2748
|
+
* Splits an iterable at the first element matching the predicate. The matching
|
|
2749
|
+
* element is included in the second array.
|
|
2750
|
+
*
|
|
2751
|
+
* **When to use**
|
|
2752
|
+
*
|
|
2753
|
+
* Use when you need to split an array at the first element that marks a
|
|
2754
|
+
* condition boundary.
|
|
2755
|
+
*
|
|
2756
|
+
* **Example** (Splitting at a condition)
|
|
2757
|
+
*
|
|
2758
|
+
* ```ts
|
|
2759
|
+
* import { Array } from "effect"
|
|
2760
|
+
*
|
|
2761
|
+
* console.log(Array.splitWhere([1, 2, 3, 4, 5], (n) => n > 3)) // [[1, 2, 3], [4, 5]]
|
|
2762
|
+
* ```
|
|
2763
|
+
*
|
|
2764
|
+
* @see {@link span} — splits at the first element that fails the predicate
|
|
2765
|
+
* @see {@link splitAt} — split at a fixed index
|
|
2766
|
+
*
|
|
2767
|
+
* @category splitting
|
|
2768
|
+
* @since 2.0.0
|
|
2769
|
+
*/
|
|
2770
|
+
export const splitWhere: {
|
|
2771
|
+
<A>(
|
|
2772
|
+
predicate: (a: NoInfer<A>, i: number) => boolean
|
|
2773
|
+
): (self: Iterable<A>) => [beforeMatch: Array<A>, fromMatch: Array<A>]
|
|
2774
|
+
<A>(self: Iterable<A>, predicate: (a: A, i: number) => boolean): [beforeMatch: Array<A>, fromMatch: Array<A>]
|
|
2775
|
+
} = dual(
|
|
2776
|
+
2,
|
|
2777
|
+
<A>(self: Iterable<A>, predicate: (a: A, i: number) => boolean): [beforeMatch: Array<A>, fromMatch: Array<A>] =>
|
|
2778
|
+
span(self, (a: A, i: number) => !predicate(a, i))
|
|
2779
|
+
)
|
|
2780
|
+
|
|
2781
|
+
/**
|
|
2782
|
+
* Creates a shallow copy of an array.
|
|
2783
|
+
*
|
|
2784
|
+
* **When to use**
|
|
2785
|
+
*
|
|
2786
|
+
* Use to create a distinct array reference for an existing array, for example
|
|
2787
|
+
* before mutating the returned array.
|
|
2788
|
+
*
|
|
2789
|
+
* **Details**
|
|
2790
|
+
*
|
|
2791
|
+
* The return type preserves `NonEmptyArray`. Use this when you need a distinct
|
|
2792
|
+
* reference, for example before mutating the returned array.
|
|
2793
|
+
*
|
|
2794
|
+
* **Example** (Copying an array)
|
|
2795
|
+
*
|
|
2796
|
+
* ```ts
|
|
2797
|
+
* import { Array } from "effect"
|
|
2798
|
+
*
|
|
2799
|
+
* const original = [1, 2, 3]
|
|
2800
|
+
* const copied = Array.copy(original)
|
|
2801
|
+
* console.log(copied) // [1, 2, 3]
|
|
2802
|
+
* console.log(original === copied) // false
|
|
2803
|
+
* ```
|
|
2804
|
+
*
|
|
2805
|
+
* @see {@link fromIterable} — returns the same reference for arrays
|
|
2806
|
+
*
|
|
2807
|
+
* @category elements
|
|
2808
|
+
* @since 2.0.0
|
|
2809
|
+
*/
|
|
2810
|
+
export const copy: {
|
|
2811
|
+
<A>(self: NonEmptyReadonlyArray<A>): NonEmptyArray<A>
|
|
2812
|
+
<A>(self: ReadonlyArray<A>): Array<A>
|
|
2813
|
+
} = (<A>(self: ReadonlyArray<A>): Array<A> => self.slice()) as any
|
|
2814
|
+
|
|
2815
|
+
/**
|
|
2816
|
+
* Pads or truncates an array to exactly `n` elements, filling with `fill`
|
|
2817
|
+
* if the array is shorter, or slicing if longer.
|
|
2818
|
+
*
|
|
2819
|
+
* **When to use**
|
|
2820
|
+
*
|
|
2821
|
+
* Use to ensure an array has a specific length, padding with a fill value or truncating as needed.
|
|
2822
|
+
*
|
|
2823
|
+
* **Details**
|
|
2824
|
+
*
|
|
2825
|
+
* Returns an empty array when `n <= 0`.
|
|
2826
|
+
*
|
|
2827
|
+
* **Example** (Padding an array)
|
|
2828
|
+
*
|
|
2829
|
+
* ```ts
|
|
2830
|
+
* import { Array } from "effect"
|
|
2831
|
+
*
|
|
2832
|
+
* console.log(Array.pad([1, 2, 3], 6, 0)) // [1, 2, 3, 0, 0, 0]
|
|
2833
|
+
* ```
|
|
2834
|
+
*
|
|
2835
|
+
* @see {@link take} — truncate without padding
|
|
2836
|
+
* @see {@link replicate} — create an array of a single repeated value
|
|
2837
|
+
*
|
|
2838
|
+
* @category elements
|
|
2839
|
+
* @since 3.8.4
|
|
2840
|
+
*/
|
|
2841
|
+
export const pad: {
|
|
2842
|
+
<A, T>(
|
|
2843
|
+
n: number,
|
|
2844
|
+
fill: T
|
|
2845
|
+
): (
|
|
2846
|
+
self: Array<A>
|
|
2847
|
+
) => Array<A | T>
|
|
2848
|
+
<A, T>(self: Array<A>, n: number, fill: T): Array<A | T>
|
|
2849
|
+
} = dual(3, <A, T>(self: Array<A>, n: number, fill: T): Array<A | T> => {
|
|
2850
|
+
if (self.length >= n) {
|
|
2851
|
+
return take(self, n)
|
|
2852
|
+
}
|
|
2853
|
+
return appendAll(
|
|
2854
|
+
self,
|
|
2855
|
+
makeBy(n - self.length, () => fill)
|
|
2856
|
+
)
|
|
2857
|
+
})
|
|
2858
|
+
|
|
2859
|
+
/**
|
|
2860
|
+
* Splits an iterable into chunks of length `n`. The last chunk may be shorter
|
|
2861
|
+
* if `n` does not evenly divide the length.
|
|
2862
|
+
*
|
|
2863
|
+
* **When to use**
|
|
2864
|
+
*
|
|
2865
|
+
* Use to divide an iterable into a new array of non-overlapping chunks with a
|
|
2866
|
+
* maximum chunk size.
|
|
2867
|
+
*
|
|
2868
|
+
* **Details**
|
|
2869
|
+
*
|
|
2870
|
+
* `chunksOf(n)([])` is `[]`, not `[[]]`. Each chunk is a `NonEmptyArray`, and
|
|
2871
|
+
* the outer return type preserves `NonEmptyArray`.
|
|
2872
|
+
*
|
|
2873
|
+
* **Example** (Chunking an array)
|
|
2874
|
+
*
|
|
2875
|
+
* ```ts
|
|
2876
|
+
* import { Array } from "effect"
|
|
2877
|
+
*
|
|
2878
|
+
* console.log(Array.chunksOf([1, 2, 3, 4, 5], 2)) // [[1, 2], [3, 4], [5]]
|
|
2879
|
+
* ```
|
|
2880
|
+
*
|
|
2881
|
+
* @see {@link split} — split into a given number of groups
|
|
2882
|
+
* @see {@link window} — sliding windows
|
|
2883
|
+
*
|
|
2884
|
+
* @category splitting
|
|
2885
|
+
* @since 2.0.0
|
|
2886
|
+
*/
|
|
2887
|
+
export const chunksOf: {
|
|
2888
|
+
(
|
|
2889
|
+
n: number
|
|
2890
|
+
): <S extends Iterable<any>>(
|
|
2891
|
+
self: S
|
|
2892
|
+
) => ReadonlyArray.With<S, NonEmptyArray<ReadonlyArray.Infer<S>>>
|
|
2893
|
+
<A>(self: NonEmptyReadonlyArray<A>, n: number): NonEmptyArray<NonEmptyArray<A>>
|
|
2894
|
+
<A>(self: Iterable<A>, n: number): Array<NonEmptyArray<A>>
|
|
2895
|
+
} = dual(2, <A>(self: Iterable<A>, n: number): Array<NonEmptyArray<A>> => {
|
|
2896
|
+
const input = fromIterable(self)
|
|
2897
|
+
if (isReadonlyArrayNonEmpty(input)) {
|
|
2898
|
+
return chop(input, splitAtNonEmpty(n))
|
|
2899
|
+
}
|
|
2900
|
+
return []
|
|
2901
|
+
})
|
|
2902
|
+
|
|
2903
|
+
/**
|
|
2904
|
+
* Creates overlapping sliding windows of size `n`.
|
|
2905
|
+
*
|
|
2906
|
+
* **When to use**
|
|
2907
|
+
*
|
|
2908
|
+
* Use to process sequences with a moving window, such as for computing running averages or detecting patterns.
|
|
2909
|
+
*
|
|
2910
|
+
* **Details**
|
|
2911
|
+
*
|
|
2912
|
+
* Returns an empty array if `n <= 0` or the array has fewer than `n` elements.
|
|
2913
|
+
* Each window is a tuple of exactly `n` elements.
|
|
2914
|
+
*
|
|
2915
|
+
* **Example** (Creating sliding windows)
|
|
2916
|
+
*
|
|
2917
|
+
* ```ts
|
|
2918
|
+
* import { Array } from "effect"
|
|
2919
|
+
*
|
|
2920
|
+
* console.log(Array.window([1, 2, 3, 4, 5], 3)) // [[1, 2, 3], [2, 3, 4], [3, 4, 5]]
|
|
2921
|
+
* console.log(Array.window([1, 2, 3, 4, 5], 6)) // []
|
|
2922
|
+
* ```
|
|
2923
|
+
*
|
|
2924
|
+
* @see {@link chunksOf} — non-overlapping chunks
|
|
2925
|
+
*
|
|
2926
|
+
* @category splitting
|
|
2927
|
+
* @since 3.13.2
|
|
2928
|
+
*/
|
|
2929
|
+
export const window: {
|
|
2930
|
+
<N extends number>(n: N): <A>(self: Iterable<A>) => Array<TupleOf<N, A>>
|
|
2931
|
+
<A, N extends number>(self: Iterable<A>, n: N): Array<TupleOf<N, A>>
|
|
2932
|
+
} = dual(2, <A>(self: Iterable<A>, n: number): Array<Array<A>> => {
|
|
2933
|
+
const input = fromIterable(self)
|
|
2934
|
+
if (n > 0 && isReadonlyArrayNonEmpty(input)) {
|
|
2935
|
+
return Array.from(
|
|
2936
|
+
{ length: input.length - (n - 1) },
|
|
2937
|
+
(_, index) => input.slice(index, index + n)
|
|
2938
|
+
)
|
|
2939
|
+
}
|
|
2940
|
+
return []
|
|
2941
|
+
})
|
|
2942
|
+
|
|
2943
|
+
/**
|
|
2944
|
+
* Groups consecutive equal elements using a custom equivalence function.
|
|
2945
|
+
*
|
|
2946
|
+
* **When to use**
|
|
2947
|
+
*
|
|
2948
|
+
* Use when you already have a non-empty array arranged so matching elements are
|
|
2949
|
+
* adjacent and need a custom equivalence function.
|
|
2950
|
+
*
|
|
2951
|
+
* **Details**
|
|
2952
|
+
*
|
|
2953
|
+
* Only adjacent elements are grouped. Non-adjacent duplicates stay separate.
|
|
2954
|
+
* Requires a `NonEmptyReadonlyArray`.
|
|
2955
|
+
*
|
|
2956
|
+
* **Example** (Grouping consecutive equal elements)
|
|
2957
|
+
*
|
|
2958
|
+
* ```ts
|
|
2959
|
+
* import { Array } from "effect"
|
|
2960
|
+
*
|
|
2961
|
+
* console.log(Array.groupWith(["a", "a", "b", "b", "b", "c", "a"], (x, y) => x === y))
|
|
2962
|
+
* // [["a", "a"], ["b", "b", "b"], ["c"], ["a"]]
|
|
2963
|
+
* ```
|
|
2964
|
+
*
|
|
2965
|
+
* @see {@link group} for grouping adjacent elements with `Equal.equivalence()`
|
|
2966
|
+
* @see {@link groupBy} for grouping all elements into a record by key, regardless of adjacency
|
|
2967
|
+
*
|
|
2968
|
+
* @category grouping
|
|
2969
|
+
* @since 2.0.0
|
|
2970
|
+
*/
|
|
2971
|
+
export const groupWith: {
|
|
2972
|
+
<A>(isEquivalent: (self: A, that: A) => boolean): (self: NonEmptyReadonlyArray<A>) => NonEmptyArray<NonEmptyArray<A>>
|
|
2973
|
+
<A>(self: NonEmptyReadonlyArray<A>, isEquivalent: (self: A, that: A) => boolean): NonEmptyArray<NonEmptyArray<A>>
|
|
2974
|
+
} = dual(
|
|
2975
|
+
2,
|
|
2976
|
+
<A>(self: NonEmptyReadonlyArray<A>, isEquivalent: (self: A, that: A) => boolean): NonEmptyArray<NonEmptyArray<A>> =>
|
|
2977
|
+
chop(self, (as) => {
|
|
2978
|
+
const h = headNonEmpty(as)
|
|
2979
|
+
const out: NonEmptyArray<A> = [h]
|
|
2980
|
+
let i = 1
|
|
2981
|
+
for (; i < as.length; i++) {
|
|
2982
|
+
const a = as[i]
|
|
2983
|
+
if (isEquivalent(a, h)) {
|
|
2984
|
+
out.push(a)
|
|
2985
|
+
} else {
|
|
2986
|
+
break
|
|
2987
|
+
}
|
|
2988
|
+
}
|
|
2989
|
+
return [out, as.slice(i)]
|
|
2990
|
+
})
|
|
2991
|
+
)
|
|
2992
|
+
|
|
2993
|
+
/**
|
|
2994
|
+
* Groups consecutive equal elements using `Equal.equivalence()`.
|
|
2995
|
+
*
|
|
2996
|
+
* **When to use**
|
|
2997
|
+
*
|
|
2998
|
+
* Use when you already have adjacent equal values and Effect's default equality
|
|
2999
|
+
* is the right comparison.
|
|
3000
|
+
*
|
|
3001
|
+
* **Details**
|
|
3002
|
+
*
|
|
3003
|
+
* Only adjacent elements are grouped.
|
|
3004
|
+
*
|
|
3005
|
+
* **Example** (Grouping adjacent equal elements)
|
|
3006
|
+
*
|
|
3007
|
+
* ```ts
|
|
3008
|
+
* import { Array } from "effect"
|
|
3009
|
+
*
|
|
3010
|
+
* console.log(Array.group([1, 1, 2, 2, 2, 3, 1])) // [[1, 1], [2, 2, 2], [3], [1]]
|
|
3011
|
+
* ```
|
|
3012
|
+
*
|
|
3013
|
+
* @see {@link groupWith} — use custom equality
|
|
3014
|
+
* @see {@link groupBy} — group by a key function into a record
|
|
3015
|
+
*
|
|
3016
|
+
* @category grouping
|
|
3017
|
+
* @since 2.0.0
|
|
3018
|
+
*/
|
|
3019
|
+
export const group: <A>(self: NonEmptyReadonlyArray<A>) => NonEmptyArray<NonEmptyArray<A>> = groupWith(
|
|
3020
|
+
Equal.asEquivalence()
|
|
3021
|
+
)
|
|
3022
|
+
|
|
3023
|
+
/**
|
|
3024
|
+
* Groups elements into a record by a key-returning function. Each key maps
|
|
3025
|
+
* to a `NonEmptyArray` of elements that produced that key.
|
|
3026
|
+
*
|
|
3027
|
+
* **When to use**
|
|
3028
|
+
*
|
|
3029
|
+
* Use to build buckets of elements indexed by a computed string or symbol key.
|
|
3030
|
+
*
|
|
3031
|
+
* **Details**
|
|
3032
|
+
*
|
|
3033
|
+
* Unlike `group` and `groupWith`, elements do not need to be adjacent to be
|
|
3034
|
+
* grouped together. The key function must return a `string` or `symbol`.
|
|
3035
|
+
*
|
|
3036
|
+
* **Example** (Grouping by a property)
|
|
3037
|
+
*
|
|
3038
|
+
* ```ts
|
|
3039
|
+
* import { Array } from "effect"
|
|
3040
|
+
*
|
|
3041
|
+
* const people = [
|
|
3042
|
+
* { name: "Alice", group: "A" },
|
|
3043
|
+
* { name: "Bob", group: "B" },
|
|
3044
|
+
* { name: "Charlie", group: "A" }
|
|
3045
|
+
* ]
|
|
3046
|
+
*
|
|
3047
|
+
* const result = Array.groupBy(people, (person) => person.group)
|
|
3048
|
+
* console.log(result)
|
|
3049
|
+
* // { A: [{ name: "Alice", group: "A" }, { name: "Charlie", group: "A" }], B: [{ name: "Bob", group: "B" }] }
|
|
3050
|
+
* ```
|
|
3051
|
+
*
|
|
3052
|
+
* @see {@link group} — group adjacent equal elements
|
|
3053
|
+
* @see {@link groupWith} — group adjacent elements by custom equality
|
|
3054
|
+
*
|
|
3055
|
+
* @category grouping
|
|
3056
|
+
* @since 2.0.0
|
|
3057
|
+
*/
|
|
3058
|
+
export const groupBy: {
|
|
3059
|
+
<A, K extends string | symbol>(
|
|
3060
|
+
f: (a: A) => K
|
|
3061
|
+
): (self: Iterable<A>) => Record<Record.ReadonlyRecord.NonLiteralKey<K>, NonEmptyArray<A>>
|
|
3062
|
+
<A, K extends string | symbol>(
|
|
3063
|
+
self: Iterable<A>,
|
|
3064
|
+
f: (a: A) => K
|
|
3065
|
+
): Record<Record.ReadonlyRecord.NonLiteralKey<K>, NonEmptyArray<A>>
|
|
3066
|
+
} = dual(2, <A, K extends string | symbol>(
|
|
3067
|
+
self: Iterable<A>,
|
|
3068
|
+
f: (a: A) => K
|
|
3069
|
+
): Record<Record.ReadonlyRecord.NonLiteralKey<K>, NonEmptyArray<A>> => {
|
|
3070
|
+
const out: Record<string | symbol, NonEmptyArray<A>> = {}
|
|
3071
|
+
for (const a of self) {
|
|
3072
|
+
const k = f(a)
|
|
3073
|
+
if (Object.hasOwn(out, k)) {
|
|
3074
|
+
out[k].push(a)
|
|
3075
|
+
} else {
|
|
3076
|
+
out[k] = [a]
|
|
3077
|
+
}
|
|
3078
|
+
}
|
|
3079
|
+
return out
|
|
3080
|
+
})
|
|
3081
|
+
|
|
3082
|
+
/**
|
|
3083
|
+
* Computes the union of two arrays using a custom equivalence, removing
|
|
3084
|
+
* duplicates.
|
|
3085
|
+
*
|
|
3086
|
+
* **When to use**
|
|
3087
|
+
*
|
|
3088
|
+
* Use when you need the union of two arrays but duplicate detection must use a
|
|
3089
|
+
* custom equivalence instead of the default `Equal.equivalence()`.
|
|
3090
|
+
*
|
|
3091
|
+
* **Example** (Computing unions with custom equality)
|
|
3092
|
+
*
|
|
3093
|
+
* ```ts
|
|
3094
|
+
* import { Array } from "effect"
|
|
3095
|
+
*
|
|
3096
|
+
* console.log(Array.unionWith([1, 2], [2, 3], (a, b) => a === b)) // [1, 2, 3]
|
|
3097
|
+
* ```
|
|
3098
|
+
*
|
|
3099
|
+
* @see {@link union} for the `Equal.equivalence()` variant
|
|
3100
|
+
* @see {@link intersectionWith} for keeping elements present in both arrays
|
|
3101
|
+
* @see {@link differenceWith} for keeping elements present only in the first array
|
|
3102
|
+
*
|
|
3103
|
+
* @category elements
|
|
3104
|
+
* @since 2.0.0
|
|
3105
|
+
*/
|
|
3106
|
+
export const unionWith: {
|
|
3107
|
+
<S extends Iterable<any>, T extends Iterable<any>>(
|
|
3108
|
+
that: T,
|
|
3109
|
+
isEquivalent: (self: ReadonlyArray.Infer<S>, that: ReadonlyArray.Infer<T>) => boolean
|
|
3110
|
+
): (self: S) => ReadonlyArray.OrNonEmpty<S, T, ReadonlyArray.Infer<S> | ReadonlyArray.Infer<T>>
|
|
3111
|
+
<A, B>(
|
|
3112
|
+
self: NonEmptyReadonlyArray<A>,
|
|
3113
|
+
that: Iterable<B>,
|
|
3114
|
+
isEquivalent: (self: A, that: B) => boolean
|
|
3115
|
+
): NonEmptyArray<A | B>
|
|
3116
|
+
<A, B>(
|
|
3117
|
+
self: Iterable<A>,
|
|
3118
|
+
that: NonEmptyReadonlyArray<B>,
|
|
3119
|
+
isEquivalent: (self: A, that: B) => boolean
|
|
3120
|
+
): NonEmptyArray<A | B>
|
|
3121
|
+
<A, B>(self: Iterable<A>, that: Iterable<B>, isEquivalent: (self: A, that: B) => boolean): Array<A | B>
|
|
3122
|
+
} = dual(3, <A>(self: Iterable<A>, that: Iterable<A>, isEquivalent: (self: A, that: A) => boolean): Array<A> => {
|
|
3123
|
+
const a = fromIterable(self)
|
|
3124
|
+
const b = fromIterable(that)
|
|
3125
|
+
if (isReadonlyArrayNonEmpty(a)) {
|
|
3126
|
+
if (isReadonlyArrayNonEmpty(b)) {
|
|
3127
|
+
const dedupe = dedupeWith(isEquivalent)
|
|
3128
|
+
return dedupe(appendAll(a, b))
|
|
3129
|
+
}
|
|
3130
|
+
return a
|
|
3131
|
+
}
|
|
3132
|
+
return b
|
|
3133
|
+
})
|
|
3134
|
+
|
|
3135
|
+
/**
|
|
3136
|
+
* Computes the union of two arrays, removing duplicates using
|
|
3137
|
+
* `Equal.equivalence()`.
|
|
3138
|
+
*
|
|
3139
|
+
* **Example** (Computing array unions)
|
|
3140
|
+
*
|
|
3141
|
+
* ```ts
|
|
3142
|
+
* import { Array } from "effect"
|
|
3143
|
+
*
|
|
3144
|
+
* console.log(Array.union([1, 2], [2, 3])) // [1, 2, 3]
|
|
3145
|
+
* ```
|
|
3146
|
+
*
|
|
3147
|
+
* @see {@link unionWith} — use custom equality
|
|
3148
|
+
* @see {@link intersection} — elements in both arrays
|
|
3149
|
+
* @see {@link difference} — elements only in the first array
|
|
3150
|
+
*
|
|
3151
|
+
* @category elements
|
|
3152
|
+
* @since 2.0.0
|
|
3153
|
+
*/
|
|
3154
|
+
export const union: {
|
|
3155
|
+
<T extends Iterable<any>>(
|
|
3156
|
+
that: T
|
|
3157
|
+
): <S extends Iterable<any>>(
|
|
3158
|
+
self: S
|
|
3159
|
+
) => ReadonlyArray.OrNonEmpty<S, T, ReadonlyArray.Infer<S> | ReadonlyArray.Infer<T>>
|
|
3160
|
+
<A, B>(self: NonEmptyReadonlyArray<A>, that: ReadonlyArray<B>): NonEmptyArray<A | B>
|
|
3161
|
+
<A, B>(self: ReadonlyArray<A>, that: NonEmptyReadonlyArray<B>): NonEmptyArray<A | B>
|
|
3162
|
+
<A, B>(self: Iterable<A>, that: Iterable<B>): Array<A | B>
|
|
3163
|
+
} = dual(
|
|
3164
|
+
2,
|
|
3165
|
+
<A, B>(self: Iterable<A>, that: Iterable<B>): Array<A | B> => unionWith(self, that, Equal.asEquivalence<A | B>())
|
|
3166
|
+
)
|
|
3167
|
+
|
|
3168
|
+
/**
|
|
3169
|
+
* Computes the intersection of two arrays using a custom equivalence. Order is
|
|
3170
|
+
* determined by the first array.
|
|
3171
|
+
*
|
|
3172
|
+
* **When to use**
|
|
3173
|
+
*
|
|
3174
|
+
* Use when you need to keep only values present in both arrays and equality
|
|
3175
|
+
* must be defined by a custom comparator, such as matching objects by id.
|
|
3176
|
+
*
|
|
3177
|
+
* **Example** (Computing intersections with custom equality)
|
|
3178
|
+
*
|
|
3179
|
+
* ```ts
|
|
3180
|
+
* import { Array } from "effect"
|
|
3181
|
+
*
|
|
3182
|
+
* const array1 = [{ id: 1 }, { id: 2 }, { id: 3 }]
|
|
3183
|
+
* const array2 = [{ id: 3 }, { id: 4 }, { id: 1 }]
|
|
3184
|
+
* const isEquivalent = (a: { id: number }, b: { id: number }) => a.id === b.id
|
|
3185
|
+
* console.log(Array.intersectionWith(isEquivalent)(array2)(array1)) // [{ id: 1 }, { id: 3 }]
|
|
3186
|
+
* ```
|
|
3187
|
+
*
|
|
3188
|
+
* @see {@link intersection} for the `Equal.equivalence()` variant
|
|
3189
|
+
* @see {@link unionWith} for keeping values from either array with custom equality
|
|
3190
|
+
* @see {@link differenceWith} for keeping values only from the first array with custom equality
|
|
3191
|
+
*
|
|
3192
|
+
* @category elements
|
|
3193
|
+
* @since 2.0.0
|
|
3194
|
+
*/
|
|
3195
|
+
export const intersectionWith = <A>(isEquivalent: (self: A, that: A) => boolean): {
|
|
3196
|
+
(that: Iterable<A>): (self: Iterable<A>) => Array<A>
|
|
3197
|
+
(self: Iterable<A>, that: Iterable<A>): Array<A>
|
|
3198
|
+
} => {
|
|
3199
|
+
const has = containsWith(isEquivalent)
|
|
3200
|
+
return dual(
|
|
3201
|
+
2,
|
|
3202
|
+
(self: Iterable<A>, that: Iterable<A>): Array<A> => {
|
|
3203
|
+
const thatArray = fromIterable(that)
|
|
3204
|
+
return fromIterable(self).filter((a) => has(thatArray, a))
|
|
3205
|
+
}
|
|
3206
|
+
)
|
|
3207
|
+
}
|
|
3208
|
+
|
|
3209
|
+
/**
|
|
3210
|
+
* Computes the intersection of two arrays using `Equal.equivalence()`. Order is
|
|
3211
|
+
* determined by the first array.
|
|
3212
|
+
*
|
|
3213
|
+
* **When to use**
|
|
3214
|
+
*
|
|
3215
|
+
* Use when Effect equality is the right membership test and you want to keep
|
|
3216
|
+
* values present in both inputs while preserving the first input's order.
|
|
3217
|
+
*
|
|
3218
|
+
* **Example** (Computing array intersections)
|
|
3219
|
+
*
|
|
3220
|
+
* ```ts
|
|
3221
|
+
* import { Array } from "effect"
|
|
3222
|
+
*
|
|
3223
|
+
* console.log(Array.intersection([1, 2, 3], [3, 4, 1])) // [1, 3]
|
|
3224
|
+
* ```
|
|
3225
|
+
*
|
|
3226
|
+
* @see {@link intersectionWith} — use custom equality
|
|
3227
|
+
* @see {@link union} — elements in either array
|
|
3228
|
+
* @see {@link difference} — elements only in the first array
|
|
3229
|
+
*
|
|
3230
|
+
* @category elements
|
|
3231
|
+
* @since 2.0.0
|
|
3232
|
+
*/
|
|
3233
|
+
export const intersection: {
|
|
3234
|
+
<B>(that: Iterable<B>): <A>(self: Iterable<A>) => Array<A & B>
|
|
3235
|
+
<A, B>(self: Iterable<A>, that: Iterable<B>): Array<A & B>
|
|
3236
|
+
} = intersectionWith(Equal.asEquivalence())
|
|
3237
|
+
|
|
3238
|
+
/**
|
|
3239
|
+
* Computes elements in the first array that are not in the second, using a
|
|
3240
|
+
* custom equivalence.
|
|
3241
|
+
*
|
|
3242
|
+
* **When to use**
|
|
3243
|
+
*
|
|
3244
|
+
* Use when you need to keep only values from the first array and equality must
|
|
3245
|
+
* be defined by a custom comparator, such as matching objects by id.
|
|
3246
|
+
*
|
|
3247
|
+
* **Example** (Computing differences with custom equality)
|
|
3248
|
+
*
|
|
3249
|
+
* ```ts
|
|
3250
|
+
* import { Array } from "effect"
|
|
3251
|
+
*
|
|
3252
|
+
* const diff = Array.differenceWith<number>((a, b) => a === b)([1, 2, 3], [2, 3, 4])
|
|
3253
|
+
* console.log(diff) // [1]
|
|
3254
|
+
* ```
|
|
3255
|
+
*
|
|
3256
|
+
* @see {@link difference} for the `Equal.equivalence()` variant
|
|
3257
|
+
* @see {@link unionWith} for keeping values from either array with custom equality
|
|
3258
|
+
* @see {@link intersectionWith} for keeping values present in both arrays with custom equality
|
|
3259
|
+
*
|
|
3260
|
+
* @category elements
|
|
3261
|
+
* @since 2.0.0
|
|
3262
|
+
*/
|
|
3263
|
+
export const differenceWith = <A>(isEquivalent: (self: A, that: A) => boolean): {
|
|
3264
|
+
(that: Iterable<A>): (self: Iterable<A>) => Array<A>
|
|
3265
|
+
(self: Iterable<A>, that: Iterable<A>): Array<A>
|
|
3266
|
+
} => {
|
|
3267
|
+
const has = containsWith(isEquivalent)
|
|
3268
|
+
return dual(
|
|
3269
|
+
2,
|
|
3270
|
+
(self: Iterable<A>, that: Iterable<A>): Array<A> => {
|
|
3271
|
+
const thatArray = fromIterable(that)
|
|
3272
|
+
return fromIterable(self).filter((a) => !has(thatArray, a))
|
|
3273
|
+
}
|
|
3274
|
+
)
|
|
3275
|
+
}
|
|
3276
|
+
|
|
3277
|
+
/**
|
|
3278
|
+
* Computes elements in the first array that are not in the second, using
|
|
3279
|
+
* `Equal.equivalence()`.
|
|
3280
|
+
*
|
|
3281
|
+
* **When to use**
|
|
3282
|
+
*
|
|
3283
|
+
* Use when you need to keep values from the first array that are absent from
|
|
3284
|
+
* the second and the default `Equal.equivalence()` comparison is appropriate.
|
|
3285
|
+
*
|
|
3286
|
+
* **Example** (Computing array differences)
|
|
3287
|
+
*
|
|
3288
|
+
* ```ts
|
|
3289
|
+
* import { Array } from "effect"
|
|
3290
|
+
*
|
|
3291
|
+
* console.log(Array.difference([1, 2, 3], [2, 3, 4])) // [1]
|
|
3292
|
+
* ```
|
|
3293
|
+
*
|
|
3294
|
+
* @see {@link differenceWith} — use custom equality
|
|
3295
|
+
* @see {@link union} — elements in either array
|
|
3296
|
+
* @see {@link intersection} — elements in both arrays
|
|
3297
|
+
*
|
|
3298
|
+
* @category elements
|
|
3299
|
+
* @since 2.0.0
|
|
3300
|
+
*/
|
|
3301
|
+
export const difference: {
|
|
3302
|
+
<A>(that: Iterable<A>): (self: Iterable<A>) => Array<A>
|
|
3303
|
+
<A>(self: Iterable<A>, that: Iterable<A>): Array<A>
|
|
3304
|
+
} = differenceWith(Equal.asEquivalence())
|
|
3305
|
+
|
|
3306
|
+
/**
|
|
3307
|
+
* Creates an empty array.
|
|
3308
|
+
*
|
|
3309
|
+
* **When to use**
|
|
3310
|
+
*
|
|
3311
|
+
* Use to create a typed empty array without allocating placeholder elements.
|
|
3312
|
+
*
|
|
3313
|
+
* **Example** (Creating an empty array)
|
|
3314
|
+
*
|
|
3315
|
+
* ```ts
|
|
3316
|
+
* import { Array } from "effect"
|
|
3317
|
+
*
|
|
3318
|
+
* const result = Array.empty<number>()
|
|
3319
|
+
* console.log(result) // []
|
|
3320
|
+
* ```
|
|
3321
|
+
*
|
|
3322
|
+
* @see {@link of} — create a single-element array
|
|
3323
|
+
* @see {@link make} — create from multiple values
|
|
3324
|
+
*
|
|
3325
|
+
* @category constructors
|
|
3326
|
+
* @since 2.0.0
|
|
3327
|
+
*/
|
|
3328
|
+
export const empty: <A = never>() => Array<A> = () => []
|
|
3329
|
+
|
|
3330
|
+
/**
|
|
3331
|
+
* Wraps a single value in a `NonEmptyArray`.
|
|
3332
|
+
*
|
|
3333
|
+
* **Example** (Creating a single-element array)
|
|
3334
|
+
*
|
|
3335
|
+
* ```ts
|
|
3336
|
+
* import { Array } from "effect"
|
|
3337
|
+
*
|
|
3338
|
+
* console.log(Array.of(1)) // [1]
|
|
3339
|
+
* ```
|
|
3340
|
+
*
|
|
3341
|
+
* @see {@link make} — create from multiple values
|
|
3342
|
+
* @see {@link empty} — create an empty array
|
|
3343
|
+
*
|
|
3344
|
+
* @category constructors
|
|
3345
|
+
* @since 2.0.0
|
|
3346
|
+
*/
|
|
3347
|
+
export const of = <A>(a: A): NonEmptyArray<A> => [a]
|
|
3348
|
+
|
|
3349
|
+
/**
|
|
3350
|
+
* Utility types for working with `ReadonlyArray` at the type level. Use these
|
|
3351
|
+
* to infer element types, preserve non-emptiness, and flatten nested arrays.
|
|
3352
|
+
*
|
|
3353
|
+
* @since 2.0.0
|
|
3354
|
+
*/
|
|
3355
|
+
export declare namespace ReadonlyArray {
|
|
3356
|
+
/**
|
|
3357
|
+
* Infers the element type of an iterable.
|
|
3358
|
+
*
|
|
3359
|
+
* **Example** (Inferring an element type)
|
|
3360
|
+
*
|
|
3361
|
+
* ```ts
|
|
3362
|
+
* import type { Array } from "effect"
|
|
3363
|
+
*
|
|
3364
|
+
* type StringArrayType = Array.ReadonlyArray.Infer<ReadonlyArray<string>>
|
|
3365
|
+
* // StringArrayType is string
|
|
3366
|
+
* ```
|
|
3367
|
+
*
|
|
3368
|
+
* @category types
|
|
3369
|
+
* @since 2.0.0
|
|
3370
|
+
*/
|
|
3371
|
+
export type Infer<S extends Iterable<any>> = S extends ReadonlyArray<infer A> ? A
|
|
3372
|
+
: S extends Iterable<infer A> ? A
|
|
3373
|
+
: never
|
|
3374
|
+
|
|
3375
|
+
/**
|
|
3376
|
+
* Constructs an array type preserving non-emptiness.
|
|
3377
|
+
*
|
|
3378
|
+
* **Example** (Preserving non-emptiness)
|
|
3379
|
+
*
|
|
3380
|
+
* ```ts
|
|
3381
|
+
* import type { Array } from "effect"
|
|
3382
|
+
*
|
|
3383
|
+
* type Result = Array.ReadonlyArray.With<readonly [number], string>
|
|
3384
|
+
* // Result is NonEmptyArray<string>
|
|
3385
|
+
* ```
|
|
3386
|
+
*
|
|
3387
|
+
* @category types
|
|
3388
|
+
* @since 2.0.0
|
|
3389
|
+
*/
|
|
3390
|
+
export type With<S extends Iterable<any>, A> = S extends NonEmptyReadonlyArray<any> ? NonEmptyArray<A>
|
|
3391
|
+
: Array<A>
|
|
3392
|
+
|
|
3393
|
+
/**
|
|
3394
|
+
* Creates a non-empty array if either input is non-empty.
|
|
3395
|
+
*
|
|
3396
|
+
* **Example** (Preserving non-emptiness from either input)
|
|
3397
|
+
*
|
|
3398
|
+
* ```ts
|
|
3399
|
+
* import type { Array } from "effect"
|
|
3400
|
+
*
|
|
3401
|
+
* type Result = Array.ReadonlyArray.OrNonEmpty<
|
|
3402
|
+
* readonly [number],
|
|
3403
|
+
* ReadonlyArray<string>,
|
|
3404
|
+
* number
|
|
3405
|
+
* >
|
|
3406
|
+
* // Result is NonEmptyArray<number>
|
|
3407
|
+
* ```
|
|
3408
|
+
*
|
|
3409
|
+
* @category types
|
|
3410
|
+
* @since 2.0.0
|
|
3411
|
+
*/
|
|
3412
|
+
export type OrNonEmpty<
|
|
3413
|
+
S extends Iterable<any>,
|
|
3414
|
+
T extends Iterable<any>,
|
|
3415
|
+
A
|
|
3416
|
+
> = S extends NonEmptyReadonlyArray<any> ? NonEmptyArray<A>
|
|
3417
|
+
: T extends NonEmptyReadonlyArray<any> ? NonEmptyArray<A>
|
|
3418
|
+
: Array<A>
|
|
3419
|
+
|
|
3420
|
+
/**
|
|
3421
|
+
* Creates a non-empty array only if both inputs are non-empty.
|
|
3422
|
+
*
|
|
3423
|
+
* **Example** (Preserving non-emptiness from both inputs)
|
|
3424
|
+
*
|
|
3425
|
+
* ```ts
|
|
3426
|
+
* import type { Array } from "effect"
|
|
3427
|
+
*
|
|
3428
|
+
* type Result = Array.ReadonlyArray.AndNonEmpty<
|
|
3429
|
+
* readonly [number],
|
|
3430
|
+
* readonly [string],
|
|
3431
|
+
* boolean
|
|
3432
|
+
* >
|
|
3433
|
+
* // Result is NonEmptyArray<boolean>
|
|
3434
|
+
* ```
|
|
3435
|
+
*
|
|
3436
|
+
* @category types
|
|
3437
|
+
* @since 2.0.0
|
|
3438
|
+
*/
|
|
3439
|
+
export type AndNonEmpty<
|
|
3440
|
+
S extends Iterable<any>,
|
|
3441
|
+
T extends Iterable<any>,
|
|
3442
|
+
A
|
|
3443
|
+
> = S extends NonEmptyReadonlyArray<any> ? T extends NonEmptyReadonlyArray<any> ? NonEmptyArray<A>
|
|
3444
|
+
: Array<A>
|
|
3445
|
+
: Array<A>
|
|
3446
|
+
|
|
3447
|
+
/**
|
|
3448
|
+
* Flattens a nested array type.
|
|
3449
|
+
*
|
|
3450
|
+
* **Example** (Flattening nested array types)
|
|
3451
|
+
*
|
|
3452
|
+
* ```ts
|
|
3453
|
+
* import type { Array } from "effect"
|
|
3454
|
+
*
|
|
3455
|
+
* type Nested = ReadonlyArray<ReadonlyArray<number>>
|
|
3456
|
+
* type Flattened = Array.ReadonlyArray.Flatten<Nested>
|
|
3457
|
+
* // Flattened is Array<number>
|
|
3458
|
+
* ```
|
|
3459
|
+
*
|
|
3460
|
+
* @category types
|
|
3461
|
+
* @since 2.0.0
|
|
3462
|
+
*/
|
|
3463
|
+
export type Flatten<T extends ReadonlyArray<ReadonlyArray<any>>> = T extends
|
|
3464
|
+
NonEmptyReadonlyArray<NonEmptyReadonlyArray<any>> ? NonEmptyArray<T[number][number]>
|
|
3465
|
+
: Array<T[number][number]>
|
|
3466
|
+
}
|
|
3467
|
+
|
|
3468
|
+
/**
|
|
3469
|
+
* Transforms each element using a function, returning a new array.
|
|
3470
|
+
*
|
|
3471
|
+
* **When to use**
|
|
3472
|
+
*
|
|
3473
|
+
* Use to transform each element independently while preserving the array shape.
|
|
3474
|
+
*
|
|
3475
|
+
* **Details**
|
|
3476
|
+
*
|
|
3477
|
+
* The function receives `(element, index)`. The return type preserves
|
|
3478
|
+
* `NonEmptyArray`.
|
|
3479
|
+
*
|
|
3480
|
+
* **Example** (Doubling values)
|
|
3481
|
+
*
|
|
3482
|
+
* ```ts
|
|
3483
|
+
* import { Array } from "effect"
|
|
3484
|
+
*
|
|
3485
|
+
* console.log(Array.map([1, 2, 3], (x) => x * 2)) // [2, 4, 6]
|
|
3486
|
+
* ```
|
|
3487
|
+
*
|
|
3488
|
+
* @see {@link flatMap} — map and flatten
|
|
3489
|
+
*
|
|
3490
|
+
* @category mapping
|
|
3491
|
+
* @since 2.0.0
|
|
3492
|
+
*/
|
|
3493
|
+
export const map: {
|
|
3494
|
+
<S extends ReadonlyArray<any>, B>(
|
|
3495
|
+
f: (a: ReadonlyArray.Infer<S>, i: number) => B
|
|
3496
|
+
): (self: S) => ReadonlyArray.With<S, B>
|
|
3497
|
+
<S extends ReadonlyArray<any>, B>(self: S, f: (a: ReadonlyArray.Infer<S>, i: number) => B): ReadonlyArray.With<S, B>
|
|
3498
|
+
} = dual(2, <A, B>(self: ReadonlyArray<A>, f: (a: A, i: number) => B): Array<B> => self.map(f))
|
|
3499
|
+
|
|
3500
|
+
/**
|
|
3501
|
+
* Maps each element to an array and flattens the results into a single array.
|
|
3502
|
+
*
|
|
3503
|
+
* **When to use**
|
|
3504
|
+
*
|
|
3505
|
+
* Use to map each array element to zero or more values and concatenate the
|
|
3506
|
+
* results in one pass.
|
|
3507
|
+
*
|
|
3508
|
+
* **Details**
|
|
3509
|
+
*
|
|
3510
|
+
* The function receives `(element, index)`. This returns `NonEmptyArray` when
|
|
3511
|
+
* both the input and mapped arrays are non-empty.
|
|
3512
|
+
*
|
|
3513
|
+
* **Example** (Flat mapping an array)
|
|
3514
|
+
*
|
|
3515
|
+
* ```ts
|
|
3516
|
+
* import { Array } from "effect"
|
|
3517
|
+
*
|
|
3518
|
+
* console.log(Array.flatMap([1, 2, 3], (x) => [x, x * 2])) // [1, 2, 2, 4, 3, 6]
|
|
3519
|
+
* ```
|
|
3520
|
+
*
|
|
3521
|
+
* @see {@link map} — transform without flattening
|
|
3522
|
+
* @see {@link flatten} — flatten without mapping
|
|
3523
|
+
*
|
|
3524
|
+
* @category sequencing
|
|
3525
|
+
* @since 2.0.0
|
|
3526
|
+
*/
|
|
3527
|
+
export const flatMap: {
|
|
3528
|
+
<S extends ReadonlyArray<any>, T extends ReadonlyArray<any>>(
|
|
3529
|
+
f: (a: ReadonlyArray.Infer<S>, i: number) => T
|
|
3530
|
+
): (self: S) => ReadonlyArray.AndNonEmpty<S, T, ReadonlyArray.Infer<T>>
|
|
3531
|
+
<A, B>(self: NonEmptyReadonlyArray<A>, f: (a: A, i: number) => NonEmptyReadonlyArray<B>): NonEmptyArray<B>
|
|
3532
|
+
<A, B>(self: ReadonlyArray<A>, f: (a: A, i: number) => ReadonlyArray<B>): Array<B>
|
|
3533
|
+
} = dual(
|
|
3534
|
+
2,
|
|
3535
|
+
<A, B>(self: ReadonlyArray<A>, f: (a: A, i: number) => ReadonlyArray<B>): Array<B> => {
|
|
3536
|
+
if (isReadonlyArrayEmpty(self)) {
|
|
3537
|
+
return []
|
|
3538
|
+
}
|
|
3539
|
+
const out: Array<B> = []
|
|
3540
|
+
for (let i = 0; i < self.length; i++) {
|
|
3541
|
+
const inner = f(self[i], i)
|
|
3542
|
+
for (let j = 0; j < inner.length; j++) {
|
|
3543
|
+
out.push(inner[j])
|
|
3544
|
+
}
|
|
3545
|
+
}
|
|
3546
|
+
return out
|
|
3547
|
+
}
|
|
3548
|
+
)
|
|
3549
|
+
|
|
3550
|
+
/**
|
|
3551
|
+
* Flattens a nested array of arrays into a single array.
|
|
3552
|
+
*
|
|
3553
|
+
* **When to use**
|
|
3554
|
+
*
|
|
3555
|
+
* Use to collapse one level of nested arrays when no per-element mapping is
|
|
3556
|
+
* needed.
|
|
3557
|
+
*
|
|
3558
|
+
* **Example** (Flattening nested arrays)
|
|
3559
|
+
*
|
|
3560
|
+
* ```ts
|
|
3561
|
+
* import { Array } from "effect"
|
|
3562
|
+
*
|
|
3563
|
+
* console.log(Array.flatten([[1, 2], [], [3, 4], [], [5, 6]])) // [1, 2, 3, 4, 5, 6]
|
|
3564
|
+
* ```
|
|
3565
|
+
*
|
|
3566
|
+
* @see {@link flatMap} — map then flatten in one step
|
|
3567
|
+
*
|
|
3568
|
+
* @category sequencing
|
|
3569
|
+
* @since 2.0.0
|
|
3570
|
+
*/
|
|
3571
|
+
export const flatten: <const S extends ReadonlyArray<ReadonlyArray<any>>>(self: S) => ReadonlyArray.Flatten<S> =
|
|
3572
|
+
flatMap(identity) as any
|
|
3573
|
+
|
|
3574
|
+
/**
|
|
3575
|
+
* Extracts all `Some` values from an iterable of `Option`s, discarding `None`s.
|
|
3576
|
+
*
|
|
3577
|
+
* **When to use**
|
|
3578
|
+
*
|
|
3579
|
+
* Use to collect only present values from an iterable of `Option` values while
|
|
3580
|
+
* discarding `None` values.
|
|
3581
|
+
*
|
|
3582
|
+
* **Example** (Extracting Some values)
|
|
3583
|
+
*
|
|
3584
|
+
* ```ts
|
|
3585
|
+
* import { Array, Option } from "effect"
|
|
3586
|
+
*
|
|
3587
|
+
* console.log(Array.getSomes([Option.some(1), Option.none(), Option.some(2)])) // [1, 2]
|
|
3588
|
+
* ```
|
|
3589
|
+
*
|
|
3590
|
+
* @see {@link fromOption} — convert a single Option
|
|
3591
|
+
* @see {@link getSuccesses} — extract successes from Results
|
|
3592
|
+
*
|
|
3593
|
+
* @category filtering
|
|
3594
|
+
* @since 2.0.0
|
|
3595
|
+
*/
|
|
3596
|
+
|
|
3597
|
+
export const getSomes: <T extends Iterable<Option.Option<X>>, X = any>(
|
|
3598
|
+
self: T
|
|
3599
|
+
) => Array<Option.Option.Value<ReadonlyArray.Infer<T>>> = (self: any) => {
|
|
3600
|
+
const out: Array<any> = []
|
|
3601
|
+
for (const a of self) {
|
|
3602
|
+
if (Option.isSome(a)) {
|
|
3603
|
+
out.push(a.value)
|
|
3604
|
+
}
|
|
3605
|
+
}
|
|
3606
|
+
return out
|
|
3607
|
+
}
|
|
3608
|
+
|
|
3609
|
+
/**
|
|
3610
|
+
* Extracts all failure values from an iterable of `Result`s, discarding
|
|
3611
|
+
* successes.
|
|
3612
|
+
*
|
|
3613
|
+
* **When to use**
|
|
3614
|
+
*
|
|
3615
|
+
* Use when you can drop the success channel and only need the failure
|
|
3616
|
+
* payloads, not the original result wrappers.
|
|
3617
|
+
*
|
|
3618
|
+
* **Example** (Extracting failures)
|
|
3619
|
+
*
|
|
3620
|
+
* ```ts
|
|
3621
|
+
* import { Array, Result } from "effect"
|
|
3622
|
+
*
|
|
3623
|
+
* console.log(Array.getFailures([Result.succeed(1), Result.fail("err"), Result.succeed(2)]))
|
|
3624
|
+
* // ["err"]
|
|
3625
|
+
* ```
|
|
3626
|
+
*
|
|
3627
|
+
* @see {@link getSuccesses} — extract success values
|
|
3628
|
+
* @see {@link separate} — split into failures and successes
|
|
3629
|
+
*
|
|
3630
|
+
* @category filtering
|
|
3631
|
+
* @since 4.0.0
|
|
3632
|
+
*/
|
|
3633
|
+
export const getFailures = <T extends Iterable<Result.Result<any, any>>>(
|
|
3634
|
+
self: T
|
|
3635
|
+
): Array<Result.Result.Failure<ReadonlyArray.Infer<T>>> => {
|
|
3636
|
+
const out: Array<any> = []
|
|
3637
|
+
for (const a of self) {
|
|
3638
|
+
if (Result.isFailure(a)) {
|
|
3639
|
+
out.push(a.failure)
|
|
3640
|
+
}
|
|
3641
|
+
}
|
|
3642
|
+
|
|
3643
|
+
return out
|
|
3644
|
+
}
|
|
3645
|
+
|
|
3646
|
+
/**
|
|
3647
|
+
* Extracts all success values from an iterable of `Result`s, discarding
|
|
3648
|
+
* failures.
|
|
3649
|
+
*
|
|
3650
|
+
* **When to use**
|
|
3651
|
+
*
|
|
3652
|
+
* Use when you can drop the failure channel and only need the success
|
|
3653
|
+
* payloads, not the original result wrappers.
|
|
3654
|
+
*
|
|
3655
|
+
* **Example** (Extracting successes)
|
|
3656
|
+
*
|
|
3657
|
+
* ```ts
|
|
3658
|
+
* import { Array, Result } from "effect"
|
|
3659
|
+
*
|
|
3660
|
+
* console.log(Array.getSuccesses([Result.succeed(1), Result.fail("err"), Result.succeed(2)]))
|
|
3661
|
+
* // [1, 2]
|
|
3662
|
+
* ```
|
|
3663
|
+
*
|
|
3664
|
+
* @see {@link getFailures} — extract failure values
|
|
3665
|
+
* @see {@link separate} — split into failures and successes
|
|
3666
|
+
*
|
|
3667
|
+
* @category filtering
|
|
3668
|
+
* @since 4.0.0
|
|
3669
|
+
*/
|
|
3670
|
+
export const getSuccesses = <T extends Iterable<Result.Result<any, any>>>(
|
|
3671
|
+
self: T
|
|
3672
|
+
): Array<Result.Result.Success<ReadonlyArray.Infer<T>>> => {
|
|
3673
|
+
const out: Array<any> = []
|
|
3674
|
+
for (const a of self) {
|
|
3675
|
+
if (Result.isSuccess(a)) {
|
|
3676
|
+
out.push(a.success)
|
|
3677
|
+
}
|
|
3678
|
+
}
|
|
3679
|
+
|
|
3680
|
+
return out
|
|
3681
|
+
}
|
|
3682
|
+
|
|
3683
|
+
/**
|
|
3684
|
+
* Keeps transformed values for elements where a `Filter` succeeds.
|
|
3685
|
+
*
|
|
3686
|
+
* **When to use**
|
|
3687
|
+
*
|
|
3688
|
+
* Use to filter an iterable with a `Result`-returning transformation while
|
|
3689
|
+
* discarding failures.
|
|
3690
|
+
*
|
|
3691
|
+
* **Details**
|
|
3692
|
+
*
|
|
3693
|
+
* The filter receives `(element, index)`. Failures are discarded.
|
|
3694
|
+
*
|
|
3695
|
+
* **Example** (Filtering and transforming)
|
|
3696
|
+
*
|
|
3697
|
+
* ```ts
|
|
3698
|
+
* import { Array, Result } from "effect"
|
|
3699
|
+
*
|
|
3700
|
+
* console.log(Array.filterMap([1, 2, 3, 4], (n) => n % 2 === 0 ? Result.succeed(n * 10) : Result.failVoid))
|
|
3701
|
+
* // [20, 40]
|
|
3702
|
+
* ```
|
|
3703
|
+
*
|
|
3704
|
+
* @see {@link filter} — keep original elements matching a predicate
|
|
3705
|
+
* @see {@link partition} for keeping both failures and successes
|
|
3706
|
+
*
|
|
3707
|
+
* @category filtering
|
|
3708
|
+
* @since 2.0.0
|
|
3709
|
+
*/
|
|
3710
|
+
export const filterMap: {
|
|
3711
|
+
<A, B, X>(f: (input: NoInfer<A>, i: number) => Result.Result<B, X>): (self: Iterable<A>) => Array<B>
|
|
3712
|
+
<A, B, X>(self: Iterable<A>, f: (input: A, i: number) => Result.Result<B, X>): Array<B>
|
|
3713
|
+
} = dual(2, <A, B, X>(self: Iterable<A>, f: (input: A, i: number) => Result.Result<B, X>): Array<B> => {
|
|
3714
|
+
const as = fromIterable(self)
|
|
3715
|
+
const out: Array<B> = []
|
|
3716
|
+
for (let i = 0; i < as.length; i++) {
|
|
3717
|
+
const result = f(as[i], i)
|
|
3718
|
+
if (Result.isSuccess(result)) {
|
|
3719
|
+
out.push(result.success)
|
|
3720
|
+
}
|
|
3721
|
+
}
|
|
3722
|
+
return out
|
|
3723
|
+
})
|
|
3724
|
+
|
|
3725
|
+
/**
|
|
3726
|
+
* Keeps only elements satisfying a predicate (or refinement).
|
|
3727
|
+
*
|
|
3728
|
+
* **When to use**
|
|
3729
|
+
*
|
|
3730
|
+
* Use to filter an iterable into a new array of original elements that satisfy
|
|
3731
|
+
* a boolean predicate or refinement.
|
|
3732
|
+
*
|
|
3733
|
+
* **Details**
|
|
3734
|
+
*
|
|
3735
|
+
* The predicate receives `(element, index)`. Refinements are supported for type
|
|
3736
|
+
* narrowing.
|
|
3737
|
+
*
|
|
3738
|
+
* **Example** (Filtering even numbers)
|
|
3739
|
+
*
|
|
3740
|
+
* ```ts
|
|
3741
|
+
* import { Array } from "effect"
|
|
3742
|
+
*
|
|
3743
|
+
* console.log(Array.filter([1, 2, 3, 4], (x) => x % 2 === 0)) // [2, 4]
|
|
3744
|
+
* ```
|
|
3745
|
+
*
|
|
3746
|
+
* @see {@link partition} — split into matching and non-matching
|
|
3747
|
+
* @see {@link filterMap} for transforming while filtering
|
|
3748
|
+
*
|
|
3749
|
+
* @category filtering
|
|
3750
|
+
* @since 2.0.0
|
|
3751
|
+
*/
|
|
3752
|
+
export const filter: {
|
|
3753
|
+
<A, B extends A>(refinement: (a: NoInfer<A>, i: number) => a is B): (self: Iterable<A>) => Array<B>
|
|
3754
|
+
<A>(predicate: (a: NoInfer<A>, i: number) => boolean): (self: Iterable<A>) => Array<A>
|
|
3755
|
+
<A, B extends A>(self: Iterable<A>, refinement: (a: A, i: number) => a is B): Array<B>
|
|
3756
|
+
<A>(self: Iterable<A>, predicate: (a: A, i: number) => boolean): Array<A>
|
|
3757
|
+
} = dual(
|
|
3758
|
+
2,
|
|
3759
|
+
<A>(self: Iterable<A>, predicate: (a: A, i: number) => boolean): Array<A> => {
|
|
3760
|
+
const as = fromIterable(self)
|
|
3761
|
+
const out: Array<A> = []
|
|
3762
|
+
for (let i = 0; i < as.length; i++) {
|
|
3763
|
+
if (predicate(as[i], i)) {
|
|
3764
|
+
out.push(as[i])
|
|
3765
|
+
}
|
|
3766
|
+
}
|
|
3767
|
+
return out
|
|
3768
|
+
}
|
|
3769
|
+
)
|
|
3770
|
+
|
|
3771
|
+
/**
|
|
3772
|
+
* Splits an iterable using a `Filter` into failures and successes.
|
|
3773
|
+
*
|
|
3774
|
+
* **When to use**
|
|
3775
|
+
*
|
|
3776
|
+
* Use to partition an iterable by evaluating each element with a
|
|
3777
|
+
* `Result`-returning filter and keeping both failure and success values.
|
|
3778
|
+
*
|
|
3779
|
+
* **Details**
|
|
3780
|
+
*
|
|
3781
|
+
* Returns `[excluded, satisfying]`. The filter receives `(element, index)`.
|
|
3782
|
+
*
|
|
3783
|
+
* **Example** (Partitioning with a filter)
|
|
3784
|
+
*
|
|
3785
|
+
* ```ts
|
|
3786
|
+
* import { Array, Result } from "effect"
|
|
3787
|
+
*
|
|
3788
|
+
* console.log(Array.partition([1, -2, 3], (n, i) =>
|
|
3789
|
+
* n > 0 ? Result.succeed(n + i) : Result.fail(`negative:${n}`)
|
|
3790
|
+
* ))
|
|
3791
|
+
* // [["negative:-2"], [1, 5]]
|
|
3792
|
+
* ```
|
|
3793
|
+
*
|
|
3794
|
+
* @see {@link filter} — keep only matching elements
|
|
3795
|
+
* @see {@link filterMap} for discarding failures
|
|
3796
|
+
* @see {@link separate} — split an iterable of `Result` values
|
|
3797
|
+
*
|
|
3798
|
+
* @category filtering
|
|
3799
|
+
* @since 2.0.0
|
|
3800
|
+
*/
|
|
3801
|
+
export const partition: {
|
|
3802
|
+
<A, Pass, Fail>(
|
|
3803
|
+
f: (input: NoInfer<A>, i: number) => Result.Result<Pass, Fail>
|
|
3804
|
+
): (self: Iterable<A>) => [excluded: Array<Fail>, satisfying: Array<Pass>]
|
|
3805
|
+
<A, Pass, Fail>(
|
|
3806
|
+
self: Iterable<A>,
|
|
3807
|
+
f: (input: A, i: number) => Result.Result<Pass, Fail>
|
|
3808
|
+
): [excluded: Array<Fail>, satisfying: Array<Pass>]
|
|
3809
|
+
} = dual(
|
|
3810
|
+
2,
|
|
3811
|
+
<A, Pass, Fail>(
|
|
3812
|
+
self: Iterable<A>,
|
|
3813
|
+
f: (input: A, i: number) => Result.Result<Pass, Fail>
|
|
3814
|
+
): [excluded: Array<Fail>, satisfying: Array<Pass>] => {
|
|
3815
|
+
const excluded: Array<Fail> = []
|
|
3816
|
+
const satisfying: Array<Pass> = []
|
|
3817
|
+
let i = 0
|
|
3818
|
+
for (const a of self) {
|
|
3819
|
+
const result = f(a, i++)
|
|
3820
|
+
if (Result.isSuccess(result)) {
|
|
3821
|
+
satisfying.push(result.success)
|
|
3822
|
+
} else {
|
|
3823
|
+
excluded.push(result.failure)
|
|
3824
|
+
}
|
|
3825
|
+
}
|
|
3826
|
+
return [excluded, satisfying]
|
|
3827
|
+
}
|
|
3828
|
+
)
|
|
3829
|
+
|
|
3830
|
+
/**
|
|
3831
|
+
* Separates an iterable of `Result`s into failure values and success values.
|
|
3832
|
+
*
|
|
3833
|
+
* **When to use**
|
|
3834
|
+
*
|
|
3835
|
+
* Use to split an iterable of `Result` values into failure and success arrays.
|
|
3836
|
+
*
|
|
3837
|
+
* **Details**
|
|
3838
|
+
*
|
|
3839
|
+
* Returns `[failures, successes]`. This is equivalent to
|
|
3840
|
+
* `partition(identity)`.
|
|
3841
|
+
*
|
|
3842
|
+
* **Example** (Separating Results)
|
|
3843
|
+
*
|
|
3844
|
+
* ```ts
|
|
3845
|
+
* import { Array, Result } from "effect"
|
|
3846
|
+
*
|
|
3847
|
+
* const [failures, successes] = Array.separate([
|
|
3848
|
+
* Result.succeed(1), Result.fail("error"), Result.succeed(2)
|
|
3849
|
+
* ])
|
|
3850
|
+
* console.log(failures) // ["error"]
|
|
3851
|
+
* console.log(successes) // [1, 2]
|
|
3852
|
+
* ```
|
|
3853
|
+
*
|
|
3854
|
+
* @see {@link getFailures} — extract only failures
|
|
3855
|
+
* @see {@link getSuccesses} — extract only successes
|
|
3856
|
+
* @see {@link partition} for computing `Result` values while splitting
|
|
3857
|
+
*
|
|
3858
|
+
* @category filtering
|
|
3859
|
+
* @since 2.0.0
|
|
3860
|
+
*/
|
|
3861
|
+
export const separate: <T extends Iterable<Result.Result<any, any>>>(
|
|
3862
|
+
self: T
|
|
3863
|
+
) => [
|
|
3864
|
+
failures: Array<Result.Result.Failure<ReadonlyArray.Infer<T>>>,
|
|
3865
|
+
successes: Array<Result.Result.Success<ReadonlyArray.Infer<T>>>
|
|
3866
|
+
] = partition(identity)
|
|
3867
|
+
|
|
3868
|
+
/**
|
|
3869
|
+
* Folds an iterable from left to right into a single value.
|
|
3870
|
+
*
|
|
3871
|
+
* **When to use**
|
|
3872
|
+
*
|
|
3873
|
+
* Use to combine all elements into one accumulated value from left to right.
|
|
3874
|
+
*
|
|
3875
|
+
* **Details**
|
|
3876
|
+
*
|
|
3877
|
+
* The function receives `(accumulator, element, index)`.
|
|
3878
|
+
*
|
|
3879
|
+
* **Example** (Summing an array)
|
|
3880
|
+
*
|
|
3881
|
+
* ```ts
|
|
3882
|
+
* import { Array } from "effect"
|
|
3883
|
+
*
|
|
3884
|
+
* console.log(Array.reduce([1, 2, 3], 0, (acc, n) => acc + n)) // 6
|
|
3885
|
+
* ```
|
|
3886
|
+
*
|
|
3887
|
+
* @see {@link reduceRight} — fold from right to left
|
|
3888
|
+
* @see {@link scan} — fold keeping intermediate values
|
|
3889
|
+
*
|
|
3890
|
+
* @category folding
|
|
3891
|
+
* @since 2.0.0
|
|
3892
|
+
*/
|
|
3893
|
+
export const reduce: {
|
|
3894
|
+
<B, A>(b: B, f: (b: B, a: A, i: number) => B): (self: Iterable<A>) => B
|
|
3895
|
+
<A, B>(self: Iterable<A>, b: B, f: (b: B, a: A, i: number) => B): B
|
|
3896
|
+
} = dual(
|
|
3897
|
+
3,
|
|
3898
|
+
<B, A>(self: Iterable<A>, b: B, f: (b: B, a: A, i: number) => B): B =>
|
|
3899
|
+
fromIterable(self).reduce((b, a, i) => f(b, a, i), b)
|
|
3900
|
+
)
|
|
3901
|
+
|
|
3902
|
+
/**
|
|
3903
|
+
* Folds an iterable from right to left into a single value.
|
|
3904
|
+
*
|
|
3905
|
+
* **When to use**
|
|
3906
|
+
*
|
|
3907
|
+
* Use when you need to fold values from right to left.
|
|
3908
|
+
*
|
|
3909
|
+
* **Details**
|
|
3910
|
+
*
|
|
3911
|
+
* The function receives `(accumulator, element, index)`.
|
|
3912
|
+
*
|
|
3913
|
+
* **Example** (Folding from right to left)
|
|
3914
|
+
*
|
|
3915
|
+
* ```ts
|
|
3916
|
+
* import { Array } from "effect"
|
|
3917
|
+
*
|
|
3918
|
+
* console.log(Array.reduceRight([1, 2, 3], 0, (acc, n) => acc + n)) // 6
|
|
3919
|
+
* ```
|
|
3920
|
+
*
|
|
3921
|
+
* @see {@link reduce} — fold from left to right
|
|
3922
|
+
* @see {@link scanRight} — fold keeping intermediate values
|
|
3923
|
+
*
|
|
3924
|
+
* @category folding
|
|
3925
|
+
* @since 2.0.0
|
|
3926
|
+
*/
|
|
3927
|
+
export const reduceRight: {
|
|
3928
|
+
<B, A>(b: B, f: (b: B, a: A, i: number) => B): (self: Iterable<A>) => B
|
|
3929
|
+
<A, B>(self: Iterable<A>, b: B, f: (b: B, a: A, i: number) => B): B
|
|
3930
|
+
} = dual(
|
|
3931
|
+
3,
|
|
3932
|
+
<A, B>(self: Iterable<A>, b: B, f: (b: B, a: A, i: number) => B): B =>
|
|
3933
|
+
fromIterable(self).reduceRight((b, a, i) => f(b, a, i), b)
|
|
3934
|
+
)
|
|
3935
|
+
|
|
3936
|
+
/**
|
|
3937
|
+
* Lifts a predicate into an array: returns `[value]` if the predicate holds,
|
|
3938
|
+
* `[]` otherwise.
|
|
3939
|
+
*
|
|
3940
|
+
* **Example** (Wrapping values conditionally)
|
|
3941
|
+
*
|
|
3942
|
+
* ```ts
|
|
3943
|
+
* import { Array } from "effect"
|
|
3944
|
+
*
|
|
3945
|
+
* const isEven = (n: number) => n % 2 === 0
|
|
3946
|
+
* const to = Array.liftPredicate(isEven)
|
|
3947
|
+
* console.log(to(1)) // []
|
|
3948
|
+
* console.log(to(2)) // [2]
|
|
3949
|
+
* ```
|
|
3950
|
+
*
|
|
3951
|
+
* @see {@link liftOption} — lift an Option-returning function
|
|
3952
|
+
*
|
|
3953
|
+
* @category lifting
|
|
3954
|
+
* @since 2.0.0
|
|
3955
|
+
*/
|
|
3956
|
+
export const liftPredicate: { // Note: I intentionally avoid using the NoInfer pattern here.
|
|
3957
|
+
<A, B extends A>(refinement: Predicate.Refinement<A, B>): (a: A) => Array<B>
|
|
3958
|
+
<A>(predicate: Predicate.Predicate<A>): <B extends A>(b: B) => Array<B>
|
|
3959
|
+
} = <A>(predicate: Predicate.Predicate<A>) => <B extends A>(b: B): Array<B> => predicate(b) ? [b] : []
|
|
3960
|
+
|
|
3961
|
+
/**
|
|
3962
|
+
* Lifts an `Option`-returning function into one that returns an array:
|
|
3963
|
+
* `Some(a)` becomes `[a]`, `None` becomes `[]`.
|
|
3964
|
+
*
|
|
3965
|
+
* **When to use**
|
|
3966
|
+
*
|
|
3967
|
+
* Use when an optional parser or lookup should participate in array pipelines
|
|
3968
|
+
* as zero-or-one results.
|
|
3969
|
+
*
|
|
3970
|
+
* **Example** (Lifting an Option function)
|
|
3971
|
+
*
|
|
3972
|
+
* ```ts
|
|
3973
|
+
* import { Array, Option } from "effect"
|
|
3974
|
+
*
|
|
3975
|
+
* const parseNumber = Array.liftOption((s: string) => {
|
|
3976
|
+
* const n = Number(s)
|
|
3977
|
+
* return isNaN(n) ? Option.none() : Option.some(n)
|
|
3978
|
+
* })
|
|
3979
|
+
* console.log(parseNumber("123")) // [123]
|
|
3980
|
+
* console.log(parseNumber("abc")) // []
|
|
3981
|
+
* ```
|
|
3982
|
+
*
|
|
3983
|
+
* @see {@link liftPredicate} — lift a boolean predicate
|
|
3984
|
+
* @see {@link liftResult} — lift a Result-returning function
|
|
3985
|
+
*
|
|
3986
|
+
* @category lifting
|
|
3987
|
+
* @since 2.0.0
|
|
3988
|
+
*/
|
|
3989
|
+
export const liftOption = <A extends Array<unknown>, B>(
|
|
3990
|
+
f: (...a: A) => Option.Option<B>
|
|
3991
|
+
) =>
|
|
3992
|
+
(...a: A): Array<B> => fromOption(f(...a))
|
|
3993
|
+
|
|
3994
|
+
/**
|
|
3995
|
+
* Converts a nullable value to an array: `null`/`undefined` becomes `[]`,
|
|
3996
|
+
* anything else becomes `[value]`.
|
|
3997
|
+
*
|
|
3998
|
+
* **When to use**
|
|
3999
|
+
*
|
|
4000
|
+
* Use to treat a nullable single value as zero or one array element.
|
|
4001
|
+
*
|
|
4002
|
+
* **Example** (Converting nullable values to an array)
|
|
4003
|
+
*
|
|
4004
|
+
* ```ts
|
|
4005
|
+
* import { Array } from "effect"
|
|
4006
|
+
*
|
|
4007
|
+
* console.log(Array.fromNullishOr(1)) // [1]
|
|
4008
|
+
* console.log(Array.fromNullishOr(null)) // []
|
|
4009
|
+
* console.log(Array.fromNullishOr(undefined)) // []
|
|
4010
|
+
* ```
|
|
4011
|
+
*
|
|
4012
|
+
* @see {@link liftNullishOr} — lift a nullable-returning function
|
|
4013
|
+
* @see {@link fromOption} — convert from Option
|
|
4014
|
+
*
|
|
4015
|
+
* @category converting
|
|
4016
|
+
* @since 4.0.0
|
|
4017
|
+
*/
|
|
4018
|
+
export const fromNullishOr = <A>(a: A): Array<NonNullable<A>> => a == null ? empty() : [a as NonNullable<A>]
|
|
4019
|
+
|
|
4020
|
+
/**
|
|
4021
|
+
* Lifts a nullable-returning function into one that returns an array:
|
|
4022
|
+
* `null`/`undefined` becomes `[]`, anything else becomes `[value]`.
|
|
4023
|
+
*
|
|
4024
|
+
* **Example** (Lifting a nullable function)
|
|
4025
|
+
*
|
|
4026
|
+
* ```ts
|
|
4027
|
+
* import { Array } from "effect"
|
|
4028
|
+
*
|
|
4029
|
+
* const parseNumber = Array.liftNullishOr((s: string) => {
|
|
4030
|
+
* const n = Number(s)
|
|
4031
|
+
* return isNaN(n) ? null : n
|
|
4032
|
+
* })
|
|
4033
|
+
* console.log(parseNumber("123")) // [123]
|
|
4034
|
+
* console.log(parseNumber("abc")) // []
|
|
4035
|
+
* ```
|
|
4036
|
+
*
|
|
4037
|
+
* @see {@link fromNullishOr} — convert a single nullable value
|
|
4038
|
+
* @see {@link liftOption} — lift an Option-returning function
|
|
4039
|
+
*
|
|
4040
|
+
* @category lifting
|
|
4041
|
+
* @since 4.0.0
|
|
4042
|
+
*/
|
|
4043
|
+
export const liftNullishOr = <A extends Array<unknown>, B>(
|
|
4044
|
+
f: (...a: A) => B
|
|
4045
|
+
): (...a: A) => Array<NonNullable<B>> =>
|
|
4046
|
+
(...a) => fromNullishOr(f(...a))
|
|
4047
|
+
|
|
4048
|
+
/**
|
|
4049
|
+
* Maps each element with a nullable-returning function, keeping only non-null /
|
|
4050
|
+
* non-undefined results.
|
|
4051
|
+
*
|
|
4052
|
+
* **When to use**
|
|
4053
|
+
*
|
|
4054
|
+
* Use when you need to map and filter in one step, where the mapper can return
|
|
4055
|
+
* `null` or `undefined` to skip elements.
|
|
4056
|
+
*
|
|
4057
|
+
* **Example** (Flat mapping with nullable values)
|
|
4058
|
+
*
|
|
4059
|
+
* ```ts
|
|
4060
|
+
* import { Array } from "effect"
|
|
4061
|
+
*
|
|
4062
|
+
* console.log(Array.flatMapNullishOr([1, 2, 3], (n) => (n % 2 === 0 ? null : n)))
|
|
4063
|
+
* // [1, 3]
|
|
4064
|
+
* ```
|
|
4065
|
+
*
|
|
4066
|
+
* @see {@link flatMap} for mapping each element to an array and flattening
|
|
4067
|
+
* @see {@link fromNullishOr} for converting a single nullable value to an array
|
|
4068
|
+
*
|
|
4069
|
+
* @category sequencing
|
|
4070
|
+
* @since 4.0.0
|
|
4071
|
+
*/
|
|
4072
|
+
export const flatMapNullishOr: {
|
|
4073
|
+
<A, B>(f: (a: A) => B): (self: ReadonlyArray<A>) => Array<NonNullable<B>>
|
|
4074
|
+
<A, B>(self: ReadonlyArray<A>, f: (a: A) => B): Array<NonNullable<B>>
|
|
4075
|
+
} = dual(
|
|
4076
|
+
2,
|
|
4077
|
+
<A, B>(self: ReadonlyArray<A>, f: (a: A) => B): Array<NonNullable<B>> => flatMap(self, (a) => fromNullishOr(f(a)))
|
|
4078
|
+
)
|
|
4079
|
+
|
|
4080
|
+
/**
|
|
4081
|
+
* Lifts a `Result`-returning function into one that returns an array: failures
|
|
4082
|
+
* produce `[]`, successes produce `[value]`.
|
|
4083
|
+
*
|
|
4084
|
+
* **When to use**
|
|
4085
|
+
*
|
|
4086
|
+
* Use when a fallible parser or lookup should participate in array pipelines as
|
|
4087
|
+
* zero-or-one results and the failure value should be discarded.
|
|
4088
|
+
*
|
|
4089
|
+
* **Example** (Lifting a Result function)
|
|
4090
|
+
*
|
|
4091
|
+
* ```ts
|
|
4092
|
+
* import { Array, Result } from "effect"
|
|
4093
|
+
*
|
|
4094
|
+
* const parseNumber = (s: string): Result.Result<number, Error> =>
|
|
4095
|
+
* isNaN(Number(s))
|
|
4096
|
+
* ? Result.fail(new Error("Not a number"))
|
|
4097
|
+
* : Result.succeed(Number(s))
|
|
4098
|
+
*
|
|
4099
|
+
* const liftedParseNumber = Array.liftResult(parseNumber)
|
|
4100
|
+
* console.log(liftedParseNumber("42")) // [42]
|
|
4101
|
+
* console.log(liftedParseNumber("not a number")) // []
|
|
4102
|
+
* ```
|
|
4103
|
+
*
|
|
4104
|
+
* @see {@link liftOption} — lift an Option-returning function
|
|
4105
|
+
* @see {@link liftPredicate} — lift a boolean predicate
|
|
4106
|
+
*
|
|
4107
|
+
* @category lifting
|
|
4108
|
+
* @since 4.0.0
|
|
4109
|
+
*/
|
|
4110
|
+
export const liftResult = <A extends Array<unknown>, E, B>(
|
|
4111
|
+
f: (...a: A) => Result.Result<B, E>
|
|
4112
|
+
) =>
|
|
4113
|
+
(...a: A): Array<B> => {
|
|
4114
|
+
const e = f(...a)
|
|
4115
|
+
return Result.isFailure(e) ? [] : [e.success]
|
|
4116
|
+
}
|
|
4117
|
+
|
|
4118
|
+
/**
|
|
4119
|
+
* Checks whether all elements satisfy the predicate. Supports refinements for
|
|
4120
|
+
* type narrowing.
|
|
4121
|
+
*
|
|
4122
|
+
* **When to use**
|
|
4123
|
+
*
|
|
4124
|
+
* Use to check whether every array element satisfies a predicate, including
|
|
4125
|
+
* refinement-based type narrowing.
|
|
4126
|
+
*
|
|
4127
|
+
* **Example** (Testing all elements)
|
|
4128
|
+
*
|
|
4129
|
+
* ```ts
|
|
4130
|
+
* import { Array } from "effect"
|
|
4131
|
+
*
|
|
4132
|
+
* console.log(Array.every([2, 4, 6], (x) => x % 2 === 0)) // true
|
|
4133
|
+
* console.log(Array.every([2, 3, 6], (x) => x % 2 === 0)) // false
|
|
4134
|
+
* ```
|
|
4135
|
+
*
|
|
4136
|
+
* @see {@link some} — test if any element matches
|
|
4137
|
+
*
|
|
4138
|
+
* @category elements
|
|
4139
|
+
* @since 2.0.0
|
|
4140
|
+
*/
|
|
4141
|
+
export const every: {
|
|
4142
|
+
<A, B extends A>(
|
|
4143
|
+
refinement: (a: NoInfer<A>, i: number) => a is B
|
|
4144
|
+
): (self: ReadonlyArray<A>) => self is ReadonlyArray<B>
|
|
4145
|
+
<A>(predicate: (a: NoInfer<A>, i: number) => boolean): (self: ReadonlyArray<A>) => boolean
|
|
4146
|
+
<A, B extends A>(self: ReadonlyArray<A>, refinement: (a: A, i: number) => a is B): self is ReadonlyArray<B>
|
|
4147
|
+
<A>(self: ReadonlyArray<A>, predicate: (a: A, i: number) => boolean): boolean
|
|
4148
|
+
} = dual(
|
|
4149
|
+
2,
|
|
4150
|
+
<A, B extends A>(self: ReadonlyArray<A>, refinement: (a: A, i: number) => a is B): self is ReadonlyArray<B> =>
|
|
4151
|
+
self.every(refinement)
|
|
4152
|
+
)
|
|
4153
|
+
|
|
4154
|
+
/**
|
|
4155
|
+
* Checks whether at least one element satisfies the predicate. Narrows the type
|
|
4156
|
+
* to `NonEmptyReadonlyArray` on success.
|
|
4157
|
+
*
|
|
4158
|
+
* **Example** (Testing for any match)
|
|
4159
|
+
*
|
|
4160
|
+
* ```ts
|
|
4161
|
+
* import { Array } from "effect"
|
|
4162
|
+
*
|
|
4163
|
+
* console.log(Array.some([1, 3, 4], (x) => x % 2 === 0)) // true
|
|
4164
|
+
* console.log(Array.some([1, 3, 5], (x) => x % 2 === 0)) // false
|
|
4165
|
+
* ```
|
|
4166
|
+
*
|
|
4167
|
+
* @see {@link every} — test if all elements match
|
|
4168
|
+
* @see {@link contains} — test for a specific value
|
|
4169
|
+
*
|
|
4170
|
+
* @category elements
|
|
4171
|
+
* @since 2.0.0
|
|
4172
|
+
*/
|
|
4173
|
+
export const some: {
|
|
4174
|
+
<A>(
|
|
4175
|
+
predicate: (a: NoInfer<A>, i: number) => boolean
|
|
4176
|
+
): (self: ReadonlyArray<A>) => self is NonEmptyReadonlyArray<A>
|
|
4177
|
+
<A>(self: ReadonlyArray<A>, predicate: (a: A, i: number) => boolean): self is NonEmptyReadonlyArray<A>
|
|
4178
|
+
} = dual(
|
|
4179
|
+
2,
|
|
4180
|
+
<A>(self: ReadonlyArray<A>, predicate: (a: A, i: number) => boolean): self is NonEmptyReadonlyArray<A> =>
|
|
4181
|
+
self.some(predicate)
|
|
4182
|
+
)
|
|
4183
|
+
|
|
4184
|
+
/**
|
|
4185
|
+
* Applies a function to each suffix of the array (starting from each index),
|
|
4186
|
+
* collecting the results.
|
|
4187
|
+
*
|
|
4188
|
+
* **When to use**
|
|
4189
|
+
*
|
|
4190
|
+
* Use when you need to compute a result from every suffix of an array, such as
|
|
4191
|
+
* cumulative aggregations from each position.
|
|
4192
|
+
*
|
|
4193
|
+
* **Details**
|
|
4194
|
+
*
|
|
4195
|
+
* For index `i`, the function receives `self.slice(i)`.
|
|
4196
|
+
*
|
|
4197
|
+
* **Example** (Computing suffix lengths)
|
|
4198
|
+
*
|
|
4199
|
+
* ```ts
|
|
4200
|
+
* import { Array } from "effect"
|
|
4201
|
+
*
|
|
4202
|
+
* console.log(Array.extend([1, 2, 3], (as) => as.length)) // [3, 2, 1]
|
|
4203
|
+
* ```
|
|
4204
|
+
*
|
|
4205
|
+
* @see {@link scan} for keeping intermediate accumulator values during a fold
|
|
4206
|
+
*
|
|
4207
|
+
* @category mapping
|
|
4208
|
+
* @since 2.0.0
|
|
4209
|
+
*/
|
|
4210
|
+
export const extend: {
|
|
4211
|
+
<A, B>(f: (as: ReadonlyArray<A>) => B): (self: ReadonlyArray<A>) => Array<B>
|
|
4212
|
+
<A, B>(self: ReadonlyArray<A>, f: (as: ReadonlyArray<A>) => B): Array<B>
|
|
4213
|
+
} = dual(
|
|
4214
|
+
2,
|
|
4215
|
+
<A, B>(self: ReadonlyArray<A>, f: (as: ReadonlyArray<A>) => B): Array<B> => self.map((_, i, as) => f(as.slice(i)))
|
|
4216
|
+
)
|
|
4217
|
+
|
|
4218
|
+
/**
|
|
4219
|
+
* Returns the minimum element of a non-empty array according to the given
|
|
4220
|
+
* `Order`.
|
|
4221
|
+
*
|
|
4222
|
+
* **Example** (Finding the minimum)
|
|
4223
|
+
*
|
|
4224
|
+
* ```ts
|
|
4225
|
+
* import { Array, Order } from "effect"
|
|
4226
|
+
*
|
|
4227
|
+
* console.log(Array.min([3, 1, 2], Order.Number)) // 1
|
|
4228
|
+
* ```
|
|
4229
|
+
*
|
|
4230
|
+
* @see {@link max} — find the maximum
|
|
4231
|
+
* @see {@link sort} — sort the entire array
|
|
4232
|
+
*
|
|
4233
|
+
* @category elements
|
|
4234
|
+
* @since 2.0.0
|
|
4235
|
+
*/
|
|
4236
|
+
export const min: {
|
|
4237
|
+
<A>(O: Order.Order<A>): (self: NonEmptyReadonlyArray<A>) => A
|
|
4238
|
+
<A>(self: NonEmptyReadonlyArray<A>, O: Order.Order<A>): A
|
|
4239
|
+
} = dual(2, <A>(self: NonEmptyReadonlyArray<A>, O: Order.Order<A>): A => self.reduce(Order.min(O)))
|
|
4240
|
+
|
|
4241
|
+
/**
|
|
4242
|
+
* Returns the maximum element of a non-empty array according to the given
|
|
4243
|
+
* `Order`.
|
|
4244
|
+
*
|
|
4245
|
+
* **Example** (Finding the maximum)
|
|
4246
|
+
*
|
|
4247
|
+
* ```ts
|
|
4248
|
+
* import { Array, Order } from "effect"
|
|
4249
|
+
*
|
|
4250
|
+
* console.log(Array.max([3, 1, 2], Order.Number)) // 3
|
|
4251
|
+
* ```
|
|
4252
|
+
*
|
|
4253
|
+
* @see {@link min} — find the minimum
|
|
4254
|
+
* @see {@link sort} — sort the entire array
|
|
4255
|
+
*
|
|
4256
|
+
* @category elements
|
|
4257
|
+
* @since 2.0.0
|
|
4258
|
+
*/
|
|
4259
|
+
export const max: {
|
|
4260
|
+
<A>(O: Order.Order<A>): (self: NonEmptyReadonlyArray<A>) => A
|
|
4261
|
+
<A>(self: NonEmptyReadonlyArray<A>, O: Order.Order<A>): A
|
|
4262
|
+
} = dual(2, <A>(self: NonEmptyReadonlyArray<A>, O: Order.Order<A>): A => self.reduce(Order.max(O)))
|
|
4263
|
+
|
|
4264
|
+
/**
|
|
4265
|
+
* Builds an array by repeatedly applying a function to a seed value. The
|
|
4266
|
+
* function returns `Option.some([element, nextSeed])` to continue, or
|
|
4267
|
+
* `Option.none()` to stop.
|
|
4268
|
+
*
|
|
4269
|
+
* **Example** (Generating a sequence)
|
|
4270
|
+
*
|
|
4271
|
+
* ```ts
|
|
4272
|
+
* import { Array, Option } from "effect"
|
|
4273
|
+
*
|
|
4274
|
+
* console.log(Array.unfold(1, (n) => n <= 5 ? Option.some([n, n + 1]) : Option.none()))
|
|
4275
|
+
* // [1, 2, 3, 4, 5]
|
|
4276
|
+
* ```
|
|
4277
|
+
*
|
|
4278
|
+
* @see {@link makeBy} — generate from index
|
|
4279
|
+
* @see {@link range} — generate a numeric range
|
|
4280
|
+
*
|
|
4281
|
+
* @category constructors
|
|
4282
|
+
* @since 2.0.0
|
|
4283
|
+
*/
|
|
4284
|
+
export const unfold = <B, A>(b: B, f: (b: B) => Option.Option<readonly [A, B]>): Array<A> => {
|
|
4285
|
+
const out: Array<A> = []
|
|
4286
|
+
let next: B = b
|
|
4287
|
+
while (true) {
|
|
4288
|
+
const o = f(next)
|
|
4289
|
+
if (Option.isNone(o)) {
|
|
4290
|
+
break
|
|
4291
|
+
}
|
|
4292
|
+
const [a, b] = o.value
|
|
4293
|
+
out.push(a)
|
|
4294
|
+
next = b
|
|
4295
|
+
}
|
|
4296
|
+
return out
|
|
4297
|
+
}
|
|
4298
|
+
|
|
4299
|
+
/**
|
|
4300
|
+
* Creates an `Order` for arrays based on an element `Order`. Arrays are
|
|
4301
|
+
* compared element-wise; if all compared elements are equal, shorter arrays
|
|
4302
|
+
* come first.
|
|
4303
|
+
*
|
|
4304
|
+
* **Example** (Comparing arrays)
|
|
4305
|
+
*
|
|
4306
|
+
* ```ts
|
|
4307
|
+
* import { Array, Order } from "effect"
|
|
4308
|
+
*
|
|
4309
|
+
* const arrayOrder = Array.makeOrder(Order.Number)
|
|
4310
|
+
* console.log(arrayOrder([1, 2], [1, 3])) // -1
|
|
4311
|
+
* ```
|
|
4312
|
+
*
|
|
4313
|
+
* @see {@link makeEquivalence} — create an equivalence for arrays
|
|
4314
|
+
*
|
|
4315
|
+
* @category instances
|
|
4316
|
+
* @since 4.0.0
|
|
4317
|
+
*/
|
|
4318
|
+
export const makeOrder: <A>(O: Order.Order<A>) => Order.Order<ReadonlyArray<A>> = Order.Array
|
|
4319
|
+
|
|
4320
|
+
/**
|
|
4321
|
+
* Creates an `Equivalence` for arrays based on an element `Equivalence`. Two
|
|
4322
|
+
* arrays are equivalent when they have the same length and all elements are
|
|
4323
|
+
* pairwise equivalent.
|
|
4324
|
+
*
|
|
4325
|
+
* **Example** (Comparing arrays for equality)
|
|
4326
|
+
*
|
|
4327
|
+
* ```ts
|
|
4328
|
+
* import { Array } from "effect"
|
|
4329
|
+
*
|
|
4330
|
+
* const eq = Array.makeEquivalence<number>((a, b) => a === b)
|
|
4331
|
+
* console.log(eq([1, 2, 3], [1, 2, 3])) // true
|
|
4332
|
+
* ```
|
|
4333
|
+
*
|
|
4334
|
+
* @see {@link makeOrder} — create an ordering for arrays
|
|
4335
|
+
*
|
|
4336
|
+
* @category instances
|
|
4337
|
+
* @since 4.0.0
|
|
4338
|
+
*/
|
|
4339
|
+
export const makeEquivalence: <A>(
|
|
4340
|
+
isEquivalent: Equivalence.Equivalence<A>
|
|
4341
|
+
) => Equivalence.Equivalence<ReadonlyArray<A>> = Equivalence.Array
|
|
4342
|
+
|
|
4343
|
+
/**
|
|
4344
|
+
* Runs a side-effect for each element. The callback receives `(element, index)`.
|
|
4345
|
+
*
|
|
4346
|
+
* **When to use**
|
|
4347
|
+
*
|
|
4348
|
+
* Use to iterate over an array for side-effects only, when no transformed
|
|
4349
|
+
* result is needed.
|
|
4350
|
+
*
|
|
4351
|
+
* **Example** (Iterating with side-effects)
|
|
4352
|
+
*
|
|
4353
|
+
* ```ts
|
|
4354
|
+
* import { Array } from "effect"
|
|
4355
|
+
*
|
|
4356
|
+
* Array.forEach([1, 2, 3], (n) => console.log(n)) // 1, 2, 3
|
|
4357
|
+
* ```
|
|
4358
|
+
*
|
|
4359
|
+
* @see {@link map} for transforming each element into a new array
|
|
4360
|
+
*
|
|
4361
|
+
* @category elements
|
|
4362
|
+
* @since 2.0.0
|
|
4363
|
+
*/
|
|
4364
|
+
export const forEach: {
|
|
4365
|
+
<A>(f: (a: A, i: number) => void): (self: Iterable<A>) => void
|
|
4366
|
+
<A>(self: Iterable<A>, f: (a: A, i: number) => void): void
|
|
4367
|
+
} = dual(2, <A>(self: Iterable<A>, f: (a: A, i: number) => void): void => fromIterable(self).forEach((a, i) => f(a, i)))
|
|
4368
|
+
|
|
4369
|
+
/**
|
|
4370
|
+
* Removes duplicates using a custom equivalence, preserving the order of the
|
|
4371
|
+
* first occurrence.
|
|
4372
|
+
*
|
|
4373
|
+
* **When to use**
|
|
4374
|
+
*
|
|
4375
|
+
* Use to remove all duplicate elements with a custom equivalence when default
|
|
4376
|
+
* equality is not appropriate.
|
|
4377
|
+
*
|
|
4378
|
+
* **Example** (Deduplicating with custom equality)
|
|
4379
|
+
*
|
|
4380
|
+
* ```ts
|
|
4381
|
+
* import { Array } from "effect"
|
|
4382
|
+
*
|
|
4383
|
+
* console.log(Array.dedupeWith([1, 2, 2, 3, 3, 3], (a, b) => a === b)) // [1, 2, 3]
|
|
4384
|
+
* ```
|
|
4385
|
+
*
|
|
4386
|
+
* @see {@link dedupe} — uses default equality
|
|
4387
|
+
* @see {@link dedupeAdjacentWith} — only dedupes consecutive elements
|
|
4388
|
+
*
|
|
4389
|
+
* @category elements
|
|
4390
|
+
* @since 2.0.0
|
|
4391
|
+
*/
|
|
4392
|
+
export const dedupeWith: {
|
|
4393
|
+
<S extends Iterable<any>>(
|
|
4394
|
+
isEquivalent: (self: ReadonlyArray.Infer<S>, that: ReadonlyArray.Infer<S>) => boolean
|
|
4395
|
+
): (self: S) => ReadonlyArray.With<S, ReadonlyArray.Infer<S>>
|
|
4396
|
+
<A>(self: NonEmptyReadonlyArray<A>, isEquivalent: (self: A, that: A) => boolean): NonEmptyArray<A>
|
|
4397
|
+
<A>(self: Iterable<A>, isEquivalent: (self: A, that: A) => boolean): Array<A>
|
|
4398
|
+
} = dual(
|
|
4399
|
+
2,
|
|
4400
|
+
<A>(self: Iterable<A>, isEquivalent: (self: A, that: A) => boolean): Array<A> => {
|
|
4401
|
+
const input = fromIterable(self)
|
|
4402
|
+
if (isReadonlyArrayNonEmpty(input)) {
|
|
4403
|
+
const out: NonEmptyArray<A> = [headNonEmpty(input)]
|
|
4404
|
+
const rest = tailNonEmpty(input)
|
|
4405
|
+
for (const r of rest) {
|
|
4406
|
+
if (out.every((a) => !isEquivalent(r, a))) {
|
|
4407
|
+
out.push(r)
|
|
4408
|
+
}
|
|
4409
|
+
}
|
|
4410
|
+
return out
|
|
4411
|
+
}
|
|
4412
|
+
return []
|
|
4413
|
+
}
|
|
4414
|
+
)
|
|
4415
|
+
|
|
4416
|
+
/**
|
|
4417
|
+
* Removes duplicates using `Equal.equivalence()`, preserving the order of the
|
|
4418
|
+
* first occurrence.
|
|
4419
|
+
*
|
|
4420
|
+
* **When to use**
|
|
4421
|
+
*
|
|
4422
|
+
* Use to remove repeated values from an iterable when Effect's default equality
|
|
4423
|
+
* is the right comparison, preserving the first occurrence.
|
|
4424
|
+
*
|
|
4425
|
+
* **Example** (Removing duplicates)
|
|
4426
|
+
*
|
|
4427
|
+
* ```ts
|
|
4428
|
+
* import { Array } from "effect"
|
|
4429
|
+
*
|
|
4430
|
+
* console.log(Array.dedupe([1, 2, 1, 3, 2, 4])) // [1, 2, 3, 4]
|
|
4431
|
+
* ```
|
|
4432
|
+
*
|
|
4433
|
+
* @see {@link dedupeWith} — use custom equality
|
|
4434
|
+
* @see {@link dedupeAdjacent} — only dedupes consecutive elements
|
|
4435
|
+
*
|
|
4436
|
+
* @category elements
|
|
4437
|
+
* @since 2.0.0
|
|
4438
|
+
*/
|
|
4439
|
+
export const dedupe = <S extends Iterable<any>>(
|
|
4440
|
+
self: S
|
|
4441
|
+
): S extends NonEmptyReadonlyArray<infer A> ? NonEmptyArray<A> : S extends Iterable<infer A> ? Array<A> : never =>
|
|
4442
|
+
dedupeWith(self, Equal.asEquivalence()) as any
|
|
4443
|
+
|
|
4444
|
+
/**
|
|
4445
|
+
* Removes consecutive duplicate elements using a custom equivalence.
|
|
4446
|
+
*
|
|
4447
|
+
* **When to use**
|
|
4448
|
+
*
|
|
4449
|
+
* Use when consecutive duplicates should be collapsed using a custom
|
|
4450
|
+
* equivalence, while equivalent values that appear later should remain in the
|
|
4451
|
+
* result.
|
|
4452
|
+
*
|
|
4453
|
+
* **Details**
|
|
4454
|
+
*
|
|
4455
|
+
* Non-adjacent duplicates are preserved.
|
|
4456
|
+
*
|
|
4457
|
+
* **Example** (Deduplicating adjacent elements)
|
|
4458
|
+
*
|
|
4459
|
+
* ```ts
|
|
4460
|
+
* import { Array } from "effect"
|
|
4461
|
+
*
|
|
4462
|
+
* console.log(Array.dedupeAdjacentWith([1, 1, 2, 2, 3, 3], (a, b) => a === b))
|
|
4463
|
+
* // [1, 2, 3]
|
|
4464
|
+
* ```
|
|
4465
|
+
*
|
|
4466
|
+
* @see {@link dedupeAdjacent} — uses default equality
|
|
4467
|
+
* @see {@link dedupeWith} — dedupes all duplicates, not just adjacent
|
|
4468
|
+
*
|
|
4469
|
+
* @category elements
|
|
4470
|
+
* @since 2.0.0
|
|
4471
|
+
*/
|
|
4472
|
+
export const dedupeAdjacentWith: {
|
|
4473
|
+
<A>(isEquivalent: (self: A, that: A) => boolean): (self: Iterable<A>) => Array<A>
|
|
4474
|
+
<A>(self: Iterable<A>, isEquivalent: (self: A, that: A) => boolean): Array<A>
|
|
4475
|
+
} = dual(2, <A>(self: Iterable<A>, isEquivalent: (self: A, that: A) => boolean): Array<A> => {
|
|
4476
|
+
const out: Array<A> = []
|
|
4477
|
+
let lastA: Option.Option<A> = Option.none()
|
|
4478
|
+
for (const a of self) {
|
|
4479
|
+
if (Option.isNone(lastA) || !isEquivalent(a, lastA.value)) {
|
|
4480
|
+
out.push(a)
|
|
4481
|
+
lastA = Option.some(a)
|
|
4482
|
+
}
|
|
4483
|
+
}
|
|
4484
|
+
return out
|
|
4485
|
+
})
|
|
4486
|
+
|
|
4487
|
+
/**
|
|
4488
|
+
* Removes consecutive duplicate elements using `Equal.equivalence()`.
|
|
4489
|
+
*
|
|
4490
|
+
* **When to use**
|
|
4491
|
+
*
|
|
4492
|
+
* Use when you need to collapse consecutive duplicates while preserving later
|
|
4493
|
+
* non-consecutive repeats, and the default equality is sufficient.
|
|
4494
|
+
*
|
|
4495
|
+
* **Example** (Removing adjacent duplicates)
|
|
4496
|
+
*
|
|
4497
|
+
* ```ts
|
|
4498
|
+
* import { Array } from "effect"
|
|
4499
|
+
*
|
|
4500
|
+
* console.log(Array.dedupeAdjacent([1, 1, 2, 2, 3, 3])) // [1, 2, 3]
|
|
4501
|
+
* ```
|
|
4502
|
+
*
|
|
4503
|
+
* @see {@link dedupeAdjacentWith} — use custom equality
|
|
4504
|
+
* @see {@link dedupe} — remove all duplicates
|
|
4505
|
+
*
|
|
4506
|
+
* @category elements
|
|
4507
|
+
* @since 2.0.0
|
|
4508
|
+
*/
|
|
4509
|
+
export const dedupeAdjacent: <A>(self: Iterable<A>) => Array<A> = dedupeAdjacentWith(Equal.asEquivalence())
|
|
4510
|
+
|
|
4511
|
+
/**
|
|
4512
|
+
* Joins string elements with a separator.
|
|
4513
|
+
*
|
|
4514
|
+
* **Example** (Joining strings)
|
|
4515
|
+
*
|
|
4516
|
+
* ```ts
|
|
4517
|
+
* import { Array } from "effect"
|
|
4518
|
+
*
|
|
4519
|
+
* console.log(Array.join(["a", "b", "c"], "-")) // "a-b-c"
|
|
4520
|
+
* ```
|
|
4521
|
+
*
|
|
4522
|
+
* @see {@link intersperse} — insert separator elements without joining
|
|
4523
|
+
*
|
|
4524
|
+
* @category folding
|
|
4525
|
+
* @since 2.0.0
|
|
4526
|
+
*/
|
|
4527
|
+
export const join: {
|
|
4528
|
+
(sep: string): (self: Iterable<string>) => string
|
|
4529
|
+
(self: Iterable<string>, sep: string): string
|
|
4530
|
+
} = dual(2, (self: Iterable<string>, sep: string): string => fromIterable(self).join(sep))
|
|
4531
|
+
|
|
4532
|
+
/**
|
|
4533
|
+
* Maps over an array while threading an accumulator through each step, returning both the final state and the mapped array.
|
|
4534
|
+
*
|
|
4535
|
+
* **When to use**
|
|
4536
|
+
*
|
|
4537
|
+
* Use when you need to map while threading state through each element and keep
|
|
4538
|
+
* the final state.
|
|
4539
|
+
*
|
|
4540
|
+
* **Details**
|
|
4541
|
+
*
|
|
4542
|
+
* Combines `map` and `reduce` in a single pass. The callback receives the
|
|
4543
|
+
* current state, element, and index, and returns `[nextState, mappedValue]`.
|
|
4544
|
+
* The result is `[finalState, mappedArray]`. This can be used in both
|
|
4545
|
+
* data-first and data-last style.
|
|
4546
|
+
*
|
|
4547
|
+
* **Example** (Running sum alongside mapped values)
|
|
4548
|
+
*
|
|
4549
|
+
* ```ts
|
|
4550
|
+
* import { Array } from "effect"
|
|
4551
|
+
*
|
|
4552
|
+
* const result = Array.mapAccum([1, 2, 3], 0, (acc, n) => [acc + n, acc + n])
|
|
4553
|
+
* console.log(result) // [6, [1, 3, 6]]
|
|
4554
|
+
* ```
|
|
4555
|
+
*
|
|
4556
|
+
* @see {@link scan} — when you only need the accumulated results (not the final state)
|
|
4557
|
+
* @see {@link reduce} — when you only need the final accumulated value
|
|
4558
|
+
*
|
|
4559
|
+
* @category folding
|
|
4560
|
+
* @since 2.0.0
|
|
4561
|
+
*/
|
|
4562
|
+
export const mapAccum: {
|
|
4563
|
+
<S, A, B, I extends Iterable<A> = Iterable<A>>(
|
|
4564
|
+
s: S,
|
|
4565
|
+
f: (s: S, a: ReadonlyArray.Infer<I>, i: number) => readonly [S, B]
|
|
4566
|
+
): (self: I) => [state: S, mappedArray: ReadonlyArray.With<I, B>]
|
|
4567
|
+
<S, A, B, I extends Iterable<A> = Iterable<A>>(
|
|
4568
|
+
self: I,
|
|
4569
|
+
s: S,
|
|
4570
|
+
f: (s: S, a: ReadonlyArray.Infer<I>, i: number) => readonly [S, B]
|
|
4571
|
+
): [state: S, mappedArray: ReadonlyArray.With<I, B>]
|
|
4572
|
+
} = dual(
|
|
4573
|
+
3,
|
|
4574
|
+
<S, A, B>(self: Iterable<A>, s: S, f: (s: S, a: A, i: number) => [S, B]): [state: S, mappedArray: Array<B>] => {
|
|
4575
|
+
let i = 0
|
|
4576
|
+
let s1 = s
|
|
4577
|
+
const out: Array<B> = []
|
|
4578
|
+
for (const a of self) {
|
|
4579
|
+
const r = f(s1, a, i)
|
|
4580
|
+
s1 = r[0]
|
|
4581
|
+
out.push(r[1])
|
|
4582
|
+
i++
|
|
4583
|
+
}
|
|
4584
|
+
return [s1, out]
|
|
4585
|
+
}
|
|
4586
|
+
)
|
|
4587
|
+
|
|
4588
|
+
/**
|
|
4589
|
+
* Computes the cartesian product of two arrays, applying a combiner to each pair.
|
|
4590
|
+
*
|
|
4591
|
+
* **When to use**
|
|
4592
|
+
*
|
|
4593
|
+
* Use to compute every combination from two arrays and immediately transform
|
|
4594
|
+
* each pair into a custom result.
|
|
4595
|
+
*
|
|
4596
|
+
* **Details**
|
|
4597
|
+
*
|
|
4598
|
+
* Produces every combination of an element from `self` with an element from
|
|
4599
|
+
* `that`, so the result length is `self.length * that.length`. Iteration visits
|
|
4600
|
+
* every element of `that` for each element of `self`.
|
|
4601
|
+
*
|
|
4602
|
+
* **Example** (Combining numbers and letters)
|
|
4603
|
+
*
|
|
4604
|
+
* ```ts
|
|
4605
|
+
* import { Array } from "effect"
|
|
4606
|
+
*
|
|
4607
|
+
* const result = Array.cartesianWith([1, 2], ["a", "b"], (a, b) => `${a}-${b}`)
|
|
4608
|
+
* console.log(result) // ["1-a", "1-b", "2-a", "2-b"]
|
|
4609
|
+
* ```
|
|
4610
|
+
*
|
|
4611
|
+
* @see {@link cartesian} for returning tuples instead of applying a combiner
|
|
4612
|
+
*
|
|
4613
|
+
* @category elements
|
|
4614
|
+
* @since 2.0.0
|
|
4615
|
+
*/
|
|
4616
|
+
export const cartesianWith: {
|
|
4617
|
+
<A, B, C>(that: ReadonlyArray<B>, f: (a: A, b: B) => C): (self: ReadonlyArray<A>) => Array<C>
|
|
4618
|
+
<A, B, C>(self: ReadonlyArray<A>, that: ReadonlyArray<B>, f: (a: A, b: B) => C): Array<C>
|
|
4619
|
+
} = dual(
|
|
4620
|
+
3,
|
|
4621
|
+
<A, B, C>(self: ReadonlyArray<A>, that: ReadonlyArray<B>, f: (a: A, b: B) => C): Array<C> =>
|
|
4622
|
+
flatMap(self, (a) => map(that, (b) => f(a, b)))
|
|
4623
|
+
)
|
|
4624
|
+
|
|
4625
|
+
/**
|
|
4626
|
+
* Computes the cartesian product of two arrays, returning all pairs as tuples.
|
|
4627
|
+
*
|
|
4628
|
+
* **When to use**
|
|
4629
|
+
*
|
|
4630
|
+
* Use when you need every `[a, b]` pair from two arrays as tuples.
|
|
4631
|
+
*
|
|
4632
|
+
* **Details**
|
|
4633
|
+
*
|
|
4634
|
+
* Produces every `[a, b]` combination of an element from `self` with an element
|
|
4635
|
+
* from `that`, so the result length is `self.length * that.length`.
|
|
4636
|
+
*
|
|
4637
|
+
* **Example** (Generating all pairs from two arrays)
|
|
4638
|
+
*
|
|
4639
|
+
* ```ts
|
|
4640
|
+
* import { Array } from "effect"
|
|
4641
|
+
*
|
|
4642
|
+
* const result = Array.cartesian([1, 2], ["a", "b"])
|
|
4643
|
+
* console.log(result) // [[1, "a"], [1, "b"], [2, "a"], [2, "b"]]
|
|
4644
|
+
* ```
|
|
4645
|
+
*
|
|
4646
|
+
* @see {@link cartesianWith} — apply a combiner to each pair
|
|
4647
|
+
*
|
|
4648
|
+
* @category elements
|
|
4649
|
+
* @since 2.0.0
|
|
4650
|
+
*/
|
|
4651
|
+
export const cartesian: {
|
|
4652
|
+
<B>(that: ReadonlyArray<B>): <A>(self: ReadonlyArray<A>) => Array<[A, B]>
|
|
4653
|
+
<A, B>(self: ReadonlyArray<A>, that: ReadonlyArray<B>): Array<[A, B]>
|
|
4654
|
+
} = dual(
|
|
4655
|
+
2,
|
|
4656
|
+
<A, B>(self: ReadonlyArray<A>, that: ReadonlyArray<B>): Array<[A, B]> => cartesianWith(self, that, (a, b) => [a, b])
|
|
4657
|
+
)
|
|
4658
|
+
|
|
4659
|
+
// -------------------------------------------------------------------------------------
|
|
4660
|
+
// do notation
|
|
4661
|
+
// -------------------------------------------------------------------------------------
|
|
4662
|
+
|
|
4663
|
+
/**
|
|
4664
|
+
* Provides the starting point for the "do simulation" — an array comprehension pattern.
|
|
4665
|
+
*
|
|
4666
|
+
* **When to use**
|
|
4667
|
+
*
|
|
4668
|
+
* Use when you want array-comprehension style code with do notation.
|
|
4669
|
+
*
|
|
4670
|
+
* **Details**
|
|
4671
|
+
*
|
|
4672
|
+
* Use {@link bind} to introduce array variables and {@link let_ let} for plain
|
|
4673
|
+
* values. Each `bind` produces the cartesian product of all bound variables,
|
|
4674
|
+
* like nested loops. Use `filter` and `map` in the pipeline to add conditions
|
|
4675
|
+
* and transformations.
|
|
4676
|
+
*
|
|
4677
|
+
* **Example** (Building array comprehensions with do notation)
|
|
4678
|
+
*
|
|
4679
|
+
* ```ts
|
|
4680
|
+
* import { Array, pipe } from "effect"
|
|
4681
|
+
*
|
|
4682
|
+
* const result = pipe(
|
|
4683
|
+
* Array.Do,
|
|
4684
|
+
* Array.bind("x", () => [1, 3, 5]),
|
|
4685
|
+
* Array.bind("y", () => [2, 4, 6]),
|
|
4686
|
+
* Array.filter(({ x, y }) => x < y),
|
|
4687
|
+
* Array.map(({ x, y }) => [x, y] as const)
|
|
4688
|
+
* )
|
|
4689
|
+
* console.log(result) // [[1, 2], [1, 4], [1, 6], [3, 4], [3, 6], [5, 6]]
|
|
4690
|
+
* ```
|
|
4691
|
+
*
|
|
4692
|
+
* @see {@link bind} — introduce an array variable into the scope
|
|
4693
|
+
* @see {@link bindTo} — start a pipeline by naming the first array
|
|
4694
|
+
* @see {@link let_ let} — introduce a plain computed value
|
|
4695
|
+
*
|
|
4696
|
+
* @category do notation
|
|
4697
|
+
* @since 3.2.0
|
|
4698
|
+
*/
|
|
4699
|
+
export const Do: ReadonlyArray<{}> = of({})
|
|
4700
|
+
|
|
4701
|
+
/**
|
|
4702
|
+
* Adds a new array variable to a do-notation scope, producing the cartesian product with all previous bindings.
|
|
4703
|
+
*
|
|
4704
|
+
* **When to use**
|
|
4705
|
+
*
|
|
4706
|
+
* Use to add another array-producing binding to an `Array.Do` pipeline, pairing
|
|
4707
|
+
* each existing scope with every value returned by the callback.
|
|
4708
|
+
*
|
|
4709
|
+
* **Details**
|
|
4710
|
+
*
|
|
4711
|
+
* Each `bind` call adds a named property to the accumulated object. The
|
|
4712
|
+
* callback receives the current scope and must return an array. This is
|
|
4713
|
+
* equivalent to `flatMap` plus merging the new value into the scope object.
|
|
4714
|
+
*
|
|
4715
|
+
* **Example** (Binding two arrays)
|
|
4716
|
+
*
|
|
4717
|
+
* ```ts
|
|
4718
|
+
* import { Array, pipe } from "effect"
|
|
4719
|
+
*
|
|
4720
|
+
* const result = pipe(
|
|
4721
|
+
* Array.Do,
|
|
4722
|
+
* Array.bind("x", () => [1, 2]),
|
|
4723
|
+
* Array.bind("y", () => ["a", "b"])
|
|
4724
|
+
* )
|
|
4725
|
+
* console.log(result)
|
|
4726
|
+
* // [{ x: 1, y: "a" }, { x: 1, y: "b" }, { x: 2, y: "a" }, { x: 2, y: "b" }]
|
|
4727
|
+
* ```
|
|
4728
|
+
*
|
|
4729
|
+
* @see {@link Do} — start a do-notation pipeline
|
|
4730
|
+
* @see {@link bindTo} — name the first array in a pipeline
|
|
4731
|
+
* @see {@link let_ let} — add a plain computed value
|
|
4732
|
+
*
|
|
4733
|
+
* @category do notation
|
|
4734
|
+
* @since 3.2.0
|
|
4735
|
+
*/
|
|
4736
|
+
export const bind: {
|
|
4737
|
+
<A extends object, N extends string, B>(
|
|
4738
|
+
tag: Exclude<N, keyof A>,
|
|
4739
|
+
f: (a: NoInfer<A>) => ReadonlyArray<B>
|
|
4740
|
+
): (
|
|
4741
|
+
self: ReadonlyArray<A>
|
|
4742
|
+
) => Array<{ [K in N | keyof A]: K extends keyof A ? A[K] : B }>
|
|
4743
|
+
<A extends object, N extends string, B>(
|
|
4744
|
+
self: ReadonlyArray<A>,
|
|
4745
|
+
tag: Exclude<N, keyof A>,
|
|
4746
|
+
f: (a: NoInfer<A>) => ReadonlyArray<B>
|
|
4747
|
+
): Array<{ [K in N | keyof A]: K extends keyof A ? A[K] : B }>
|
|
4748
|
+
} = internalDoNotation.bind<ReadonlyArrayTypeLambda>(map, flatMap) as any
|
|
4749
|
+
|
|
4750
|
+
/**
|
|
4751
|
+
* Wraps each array element in an object with the given key, starting a do-notation scope.
|
|
4752
|
+
*
|
|
4753
|
+
* **When to use**
|
|
4754
|
+
*
|
|
4755
|
+
* Use when you already have an array and want to start a do-notation pipeline
|
|
4756
|
+
* by naming each element.
|
|
4757
|
+
*
|
|
4758
|
+
* **Details**
|
|
4759
|
+
*
|
|
4760
|
+
* Equivalent to `Array.map(self, (a) => ({ [tag]: a }))`. This is an
|
|
4761
|
+
* alternative to starting with `Do` plus `bind` when you already have an array.
|
|
4762
|
+
*
|
|
4763
|
+
* **Example** (Naming an existing array)
|
|
4764
|
+
*
|
|
4765
|
+
* ```ts
|
|
4766
|
+
* import { Array, pipe } from "effect"
|
|
4767
|
+
*
|
|
4768
|
+
* const result = pipe(
|
|
4769
|
+
* [1, 2, 3],
|
|
4770
|
+
* Array.bindTo("x")
|
|
4771
|
+
* )
|
|
4772
|
+
* console.log(result) // [{ x: 1 }, { x: 2 }, { x: 3 }]
|
|
4773
|
+
* ```
|
|
4774
|
+
*
|
|
4775
|
+
* @see {@link Do} — start with an empty scope
|
|
4776
|
+
* @see {@link bind} — add another array variable to the scope
|
|
4777
|
+
*
|
|
4778
|
+
* @category do notation
|
|
4779
|
+
* @since 3.2.0
|
|
4780
|
+
*/
|
|
4781
|
+
export const bindTo: {
|
|
4782
|
+
<N extends string>(tag: N): <A>(self: ReadonlyArray<A>) => Array<{ [K in N]: A }>
|
|
4783
|
+
<A, N extends string>(self: ReadonlyArray<A>, tag: N): Array<{ [K in N]: A }>
|
|
4784
|
+
} = internalDoNotation.bindTo<ReadonlyArrayTypeLambda>(map) as any
|
|
4785
|
+
|
|
4786
|
+
const let_: {
|
|
4787
|
+
<N extends string, B, A extends object>(
|
|
4788
|
+
tag: Exclude<N, keyof A>,
|
|
4789
|
+
f: (a: NoInfer<A>) => B
|
|
4790
|
+
): (self: ReadonlyArray<A>) => Array<{ [K in N | keyof A]: K extends keyof A ? A[K] : B }>
|
|
4791
|
+
<N extends string, A extends object, B>(
|
|
4792
|
+
self: ReadonlyArray<A>,
|
|
4793
|
+
tag: Exclude<N, keyof A>,
|
|
4794
|
+
f: (a: NoInfer<A>) => B
|
|
4795
|
+
): Array<{ [K in N | keyof A]: K extends keyof A ? A[K] : B }>
|
|
4796
|
+
} = internalDoNotation.let_<ReadonlyArrayTypeLambda>(map) as any
|
|
4797
|
+
|
|
4798
|
+
export {
|
|
4799
|
+
/**
|
|
4800
|
+
* Adds a computed plain value to the do-notation scope without introducing a new array dimension.
|
|
4801
|
+
*
|
|
4802
|
+
* **When to use**
|
|
4803
|
+
*
|
|
4804
|
+
* Use when each do-notation branch needs a derived field from the current
|
|
4805
|
+
* bindings without multiplying the number of branches.
|
|
4806
|
+
*
|
|
4807
|
+
* **Details**
|
|
4808
|
+
*
|
|
4809
|
+
* Unlike `bind`, the callback returns a single value instead of an array, so
|
|
4810
|
+
* no cartesian product occurs. Use this for derived or intermediate values
|
|
4811
|
+
* that depend on previously bound variables.
|
|
4812
|
+
*
|
|
4813
|
+
* **Example** (Adding a computed value)
|
|
4814
|
+
*
|
|
4815
|
+
* ```ts
|
|
4816
|
+
* import { Array, pipe } from "effect"
|
|
4817
|
+
*
|
|
4818
|
+
* const result = pipe(
|
|
4819
|
+
* Array.Do,
|
|
4820
|
+
* Array.bind("x", () => [1, 2, 3]),
|
|
4821
|
+
* Array.let("doubled", ({ x }) => x * 2)
|
|
4822
|
+
* )
|
|
4823
|
+
* console.log(result)
|
|
4824
|
+
* // [{ x: 1, doubled: 2 }, { x: 2, doubled: 4 }, { x: 3, doubled: 6 }]
|
|
4825
|
+
* ```
|
|
4826
|
+
*
|
|
4827
|
+
* @see {@link Do} — start a do-notation pipeline
|
|
4828
|
+
* @see {@link bind} — introduce an array variable (produces cartesian product)
|
|
4829
|
+
*
|
|
4830
|
+
* @category do notation
|
|
4831
|
+
* @since 3.2.0
|
|
4832
|
+
*/
|
|
4833
|
+
let_ as let
|
|
4834
|
+
}
|
|
4835
|
+
|
|
4836
|
+
const reducer = Reducer.make((a, b) => a.concat(b), [] as any)
|
|
4837
|
+
|
|
4838
|
+
/**
|
|
4839
|
+
* Returns a `Reducer` that combines `ReadonlyArray` values by concatenation.
|
|
4840
|
+
*
|
|
4841
|
+
* @see {@link makeReducerConcat} — mutable `Array` variant
|
|
4842
|
+
*
|
|
4843
|
+
* @category folding
|
|
4844
|
+
* @since 4.0.0
|
|
4845
|
+
*/
|
|
4846
|
+
export function getReadonlyReducerConcat<A>(): Reducer.Reducer<ReadonlyArray<A>> {
|
|
4847
|
+
return reducer
|
|
4848
|
+
}
|
|
4849
|
+
|
|
4850
|
+
/**
|
|
4851
|
+
* Returns a `Reducer` that combines `Array` values by concatenation.
|
|
4852
|
+
*
|
|
4853
|
+
* @see {@link getReadonlyReducerConcat} — readonly variant
|
|
4854
|
+
*
|
|
4855
|
+
* @category folding
|
|
4856
|
+
* @since 4.0.0
|
|
4857
|
+
*/
|
|
4858
|
+
export function makeReducerConcat<A>(): Reducer.Reducer<Array<A>> {
|
|
4859
|
+
return reducer
|
|
4860
|
+
}
|
|
4861
|
+
|
|
4862
|
+
/**
|
|
4863
|
+
* Computes the number of elements in an iterable that satisfy a predicate.
|
|
4864
|
+
*
|
|
4865
|
+
* **When to use**
|
|
4866
|
+
*
|
|
4867
|
+
* Use when you need to count how many elements of an iterable satisfy a
|
|
4868
|
+
* predicate.
|
|
4869
|
+
*
|
|
4870
|
+
* **Details**
|
|
4871
|
+
*
|
|
4872
|
+
* The predicate receives both the element and its index. Empty iterables return
|
|
4873
|
+
* `0`.
|
|
4874
|
+
*
|
|
4875
|
+
* **Example** (Counting even numbers)
|
|
4876
|
+
*
|
|
4877
|
+
* ```ts
|
|
4878
|
+
* import { Array } from "effect"
|
|
4879
|
+
*
|
|
4880
|
+
* const result = Array.countBy([1, 2, 3, 4, 5], (n) => n % 2 === 0)
|
|
4881
|
+
* console.log(result) // 2
|
|
4882
|
+
* ```
|
|
4883
|
+
*
|
|
4884
|
+
* @see {@link filter} — when you need the matching elements, not just the count
|
|
4885
|
+
*
|
|
4886
|
+
* @category folding
|
|
4887
|
+
* @since 3.16.0
|
|
4888
|
+
*/
|
|
4889
|
+
export const countBy: {
|
|
4890
|
+
<A>(predicate: (a: NoInfer<A>, i: number) => boolean): (self: Iterable<A>) => number
|
|
4891
|
+
<A>(self: Iterable<A>, predicate: (a: A, i: number) => boolean): number
|
|
4892
|
+
} = dual(
|
|
4893
|
+
2,
|
|
4894
|
+
<A>(
|
|
4895
|
+
self: Iterable<A>,
|
|
4896
|
+
f: (a: A, i: number) => boolean
|
|
4897
|
+
): number => {
|
|
4898
|
+
let count = 0
|
|
4899
|
+
const as = fromIterable(self)
|
|
4900
|
+
for (let i = 0; i < as.length; i++) {
|
|
4901
|
+
const a = as[i]
|
|
4902
|
+
if (f(a, i)) {
|
|
4903
|
+
count++
|
|
4904
|
+
}
|
|
4905
|
+
}
|
|
4906
|
+
return count
|
|
4907
|
+
}
|
|
4908
|
+
)
|