Filter.ts
Filter.ts overview
Section titled “Filter.ts overview”Defines composable checks that can also transform values.
A Filter<Input, Pass, Fail> receives an input and returns a Result.
Success means the value passed the filter, and failure means the value was
filtered out. Filters may also narrow or transform the passing value. This
module includes constructors from predicates, options, and effects, built-in
filters for common JavaScript values and tags, helpers for combining filters,
and conversions to predicates, options, and results.
Since v4.0.0
Exports Grouped by Category
Section titled “Exports Grouped by Category”combinators
Section titled “combinators”andLeft
Section titled “andLeft”Combines two filters but only returns the result of the left filter.
Example (Keeping the left filter result)
import { Filter } from "effect"
const positiveNumbers = Filter.fromPredicate((n: number) => n > 0)const evenNumbers = Filter.fromPredicate((n: number) => n % 2 === 0)
const positiveEven = Filter.andLeft(positiveNumbers, evenNumbers)Signature
declare const andLeft: { <InputR, PassR, FailR>( right: Filter<InputR, PassR, FailR> ): <InputL, PassL, FailL>(left: Filter<InputL, PassL, FailL>) => Filter<InputL & InputR, PassL, FailL | FailR> <InputL, PassL, FailL, InputR, PassR, FailR>( left: Filter<InputL, PassL, FailL>, right: Filter<InputR, PassR, FailR> ): Filter<InputL & InputR, PassL, FailL | FailR>}Since v4.0.0
andRight
Section titled “andRight”Combines two filters but only returns the result of the right filter.
Example (Keeping the right filter result)
import { Filter, Result } from "effect"
const positiveNumbers = Filter.fromPredicate((n: number) => n > 0)const doubleNumbers = Filter.make((n: number) => (n > 0 ? Result.succeed(n * 2) : Result.fail(n)))
const positiveDoubled = Filter.andRight(positiveNumbers, doubleNumbers)Signature
declare const andRight: { <InputR, PassR, FailR>( right: Filter<InputR, PassR, FailR> ): <InputL, PassL, FailL>(left: Filter<InputL, PassL, FailL>) => Filter<InputL & InputR, PassR, FailL | FailR> <InputL, PassL, FailL, InputR, PassR, FailR>( left: Filter<InputL, PassL, FailL>, right: Filter<InputR, PassR, FailR> ): Filter<InputL & InputR, PassR, FailL | FailR>}Since v4.0.0
compose
Section titled “compose”Composes two filters sequentially, feeding the output of the first into the second.
Example (Composing filters)
import { Filter, Result } from "effect"
const stringFilter = Filter.stringconst nonEmptyUpper = Filter.make((s: string) => (s.length > 0 ? Result.succeed(s.toUpperCase()) : Result.fail(s)))
const stringToUpper = Filter.compose(stringFilter, nonEmptyUpper)Signature
declare const compose: { <PassL, PassR, FailR>( right: Filter<PassL, PassR, FailR> ): <InputL, FailL>(left: Filter<InputL, PassL, FailL>) => Filter<InputL, PassR, FailL | FailR> <InputL, PassL, FailL, PassR, FailR>( left: Filter<InputL, PassL, FailL>, right: Filter<PassL, PassR, FailR> ): Filter<InputL, PassR, FailL | FailR>}Since v4.0.0
composePassthrough
Section titled “composePassthrough”Composes two filters sequentially, passing the successful output of the first filter to the second.
Details
If either filter fails, the returned filter fails with the original input instead of the intermediate failure value.
Signature
declare const composePassthrough: { <InputL, PassL, PassR, FailR>( right: Filter<PassL, PassR, FailR> ): <FailL>(left: Filter<InputL, PassL, FailL>) => Filter<InputL, PassR, InputL> <InputL, PassL, FailL, PassR, FailR>( left: Filter<InputL, PassL, FailL>, right: Filter<PassL, PassR, FailR> ): Filter<InputL, PassR, InputL>}Since v4.0.0
Combines two filters with logical OR semantics.
Signature
declare const or: { <Input2, Pass2, Fail2>( that: Filter<Input2, Pass2, Fail2> ): <Input1, Pass2, Fail2>(self: Filter<Input1, Pass2>) => Filter<Input1 & Input2, Pass2 | Pass2, Fail2> <Input1, Pass1, Fail1, Input2, Pass2, Fail2>( self: Filter<Input1, Pass1, Fail1>, that: Filter<Input2, Pass2, Fail2> ): Filter<Input1 & Input2, Pass1 | Pass2, Fail2>}Since v4.0.0
Combines two filters into a tuple of their results.
Details
Both filters must succeed for the combination to succeed. If both pass, their outputs are combined into a tuple.
Example (Zipping filters)
import { Filter } from "effect"
const positiveNumbers = Filter.fromPredicate((n: number) => n > 0)const evenNumbers = Filter.fromPredicate((n: number) => n % 2 === 0)
const positiveAndEven = Filter.zip(positiveNumbers, evenNumbers)Signature
declare const zip: { <InputR, PassR, FailR>( right: Filter<InputR, PassR, FailR> ): <InputL, PassL, FailL>( left: Filter<InputL, PassL, FailL> ) => Filter<InputL & InputR, [PassL, PassR], FailL | FailR> <InputL, PassL, FailL, InputR, PassR, FailR>( left: Filter<InputL, PassL, FailL>, right: Filter<InputR, PassR, FailR> ): Filter<InputL & InputR, [PassL, PassR], FailL | FailR>}Since v4.0.0
zipWith
Section titled “zipWith”Combines two filters and applies a function to their results.
When to use
Use to combine two filters with a custom function to merge their outputs.
Details
Both filters must succeed (not return fail) for the combination to succeed.
If both filters pass, their outputs are combined using the provided function.
See
zipfor combining two filters into a tuple
Signature
declare const zipWith: { <PassL, InputR, PassR, FailR, A>( right: Filter<InputR, PassR, FailR>, f: (left: PassL, right: PassR) => A ): <InputL, FailL>(left: Filter<InputL, PassL, FailL>) => Filter<InputL & InputR, A, FailL | FailR> <InputL, PassL, FailL, InputR, PassR, FailR, A>( left: Filter<InputL, PassL, FailL>, right: Filter<InputR, PassR, FailR>, f: (left: PassL, right: PassR) => A ): Filter<InputL & InputR, A, FailL | FailR>}Since v4.0.0
constructors
Section titled “constructors”bigint
Section titled “bigint”A predefined filter that only passes through bigint primitive values.
When to use
Use to keep primitive big integer values from unknown input while staying in
the composable Filter / Result pipeline.
Details
Implemented with fromPredicate(Predicate.isBigInt), so values where
typeof input === "bigint" succeed and all other inputs fail with the
original input.
Gotchas
This filter does not coerce numbers or strings; 1n passes while 1 fails.
See
numberfor JavaScriptnumbervaluesPredicate.isBigIntfor the underlying guard
Signature
declare const bigint: Filter<unknown, bigint, unknown>Since v4.0.0
boolean
Section titled “boolean”A predefined filter that only passes through boolean values.
When to use
Use when accepting an unknown input only if it is already a boolean and you
want a Filter result rather than a plain predicate result.
Details
Implemented with fromPredicate(Predicate.isBoolean), so true and false
succeed and non-booleans fail with the original input.
See
Predicate.isBooleanfor the underlying guardfromPredicatefor custom predicate-based filters
Signature
declare const boolean: Filter<unknown, boolean, unknown>Since v4.0.0
A predefined filter that only passes through Date objects.
When to use
Use when you need to narrow unknown input to JavaScript Date instances with
a reusable Filter.
Details
Implemented with fromPredicate(Predicate.isDate), so passing values return
Result.succeed(input) and failing values return Result.fail(input).
Gotchas
The check uses instanceof Date, so invalid Date objects still pass; the
filter does not validate the timestamp.
See
Predicate.isDatefor the underlying guardinstanceOffor constructor-based filteringfromPredicatefor custom date checks
Signature
declare const date: Filter<unknown, Date, unknown>Since v4.0.0
equals
Section titled “equals”Creates a filter that only passes values equal to the specified value using structural equality.
When to use
Use to accept inputs that are structurally equal to a known expected value
while staying in a composable Filter / Result pipeline.
Details
Delegates to Equal.equals. On success it returns Result.succeed(value);
on failure it returns Result.fail(input).
See
equalsStrictfor JavaScript===matching instead of structural equalityEqual.equalsfor the underlying structural equality semantics
Signature
declare const equals: <const A, Input = unknown>( value: A) => Filter<Input, A, EqualsWith<Input, A, A, Exclude<Input, A>>>Since v4.0.0
equalsStrict
Section titled “equalsStrict”Creates a Filter that passes only values strictly equal to the specified
value using JavaScript === comparison.
When to use
Use when you need a Filter that accepts only the exact primitive value or
object reference using JavaScript strict equality in a Filter / Result
pipeline.
Gotchas
NaN never passes, even when the expected value is NaN, and objects pass
only when they are the same reference.
See
equalsfor structural equality when distinct values with equal contents should pass
Signature
declare const equalsStrict: <const A, Input = unknown>( value: A) => Filter<Input, A, EqualsWith<Input, A, A, Exclude<Input, A>>>Since v4.0.0
fromPredicate
Section titled “fromPredicate”Creates a Filter from a predicate or refinement function.
Details
This is a convenient way to create filters from boolean-returning functions.
When the predicate returns true, the input value is passed through unchanged.
When it returns false, the fail type is returned.
Example (Creating filters from predicates)
import { Filter, Result } from "effect"
// Create filter from predicateconst positiveNumbers = Filter.fromPredicate((n: number) => n > 0)const nonEmptyStrings = Filter.fromPredicate((s: string) => s.length > 0)
// Type refinementconst isString = Filter.fromPredicate((x: unknown): x is string => typeof x === "string")Signature
declare const fromPredicate: { <A, B extends A>(refinement: Predicate.Refinement<A, B>): Filter<A, B, EqualsWith<A, B, A, Exclude<A, B>>> <A>(predicate: Predicate.Predicate<A>): Filter<A>}Since v4.0.0
fromPredicateOption
Section titled “fromPredicateOption”Creates a Filter from a function that returns an Option; Some(value)
passes with value, and None fails with the original input.
Signature
declare const fromPredicateOption: <A, B>(predicate: (a: A) => Option.Option<B>) => Filter<A, B>Since v4.0.0
Creates a Filter that passes inputs whose has(key) method returns
true for the specified key.
When to use
Use to keep inputs that expose a has method, such as Set or Map, when
they contain a required key.
See
fromPredicatefor custom predicate filters or inputs without ahasmethodPredicate.hasPropertyfor guarding property presence instead of calling an input’shasmethod
Signature
declare const has: <K>( key: K) => <Input extends { readonly has: (key: K) => boolean }>(input: Input) => Result.Result<Input, Input>Since v4.0.0
instanceOf
Section titled “instanceOf”Creates a filter that only passes instances of the given constructor.
When to use
Use to narrow unknown input to values created by a specific JavaScript
constructor while keeping the result in the Filter / Result pipeline.
Details
The filter succeeds when the input satisfies instanceof constructor.
Otherwise it fails with the original input.
Gotchas
This uses JavaScript instanceof semantics, including prototype-chain and
realm behavior.
See
fromPredicatefor custom predicate-based narrowing
Signature
declare const instanceOf: <K extends new (...args: any) => any>( constructor: K) => <Input>(u: Input) => Result.Result<InstanceType<K>, Exclude<Input, InstanceType<K>>>Since v4.0.0
Creates a Filter from a function that returns either a pass or fail value.
Details
This is the primary constructor for creating custom filters. The function
should return either Result.succeed(value) or Result.fail(value).
Example (Creating custom filters)
import { Filter, Result } from "effect"
// Create a filter for positive numbersconst positiveFilter = Filter.make((n: number) => (n > 0 ? Result.succeed(n) : Result.fail(n)))
// Create a filter that transforms strings to uppercaseconst uppercaseFilter = Filter.make((s: string) => (s.length > 0 ? Result.succeed(s.toUpperCase()) : Result.fail(s)))Signature
declare const make: <Input, Pass, Fail>(f: (input: Input) => Result.Result<Pass, Fail>) => Filter<Input, Pass, Fail>Since v4.0.0
makeEffect
Section titled “makeEffect”Creates an effectful Filter from a function that returns an Effect.
Details
This constructor is used when the filtering operation needs to perform effectful computations, such as async operations, error handling, or accessing services from the environment.
Example (Creating effectful filters)
import { Effect, Filter, Result } from "effect"
// Create an effectful filter that validates asyncconst asyncValidate = Filter.makeEffect((id: string) => Effect.gen(function* () { const isValid = yield* Effect.succeed(id.length > 0) return isValid ? Result.succeed(id) : Result.fail(id) }))Signature
declare const makeEffect: <Input, Pass, Fail, E, R>( f: (input: Input) => Effect<Result.Result<Pass, Fail>, E, R>) => FilterEffect<Input, Pass, Fail, E, R>Since v4.0.0
number
Section titled “number”A predefined filter that only passes through number values.
Example (Filtering numbers)
import { Filter, Result } from "effect"
console.log(Filter.number(42)) // Result.succeed(42)console.log(Filter.number("42")) // failSignature
declare const number: Filter<unknown, number, unknown>Since v4.0.0
reason
Section titled “reason”Creates a filter that extracts a reason from a tagged error.
Signature
declare const reason: { <Input>(): <const Tag extends Tags<Input>, const ReasonTag extends ReasonTags<ExtractTag<Input, Tag>>>( tag: Tag, reasonTag: ReasonTag ) => Filter<Input, ExtractReason<ExtractTag<Input, Tag>, ReasonTag>, Input> <Input, const Tag extends Tags<Input>, const ReasonTag extends ReasonTags<ExtractTag<Input, Tag>>>( tag: Tag, reasonTag: ReasonTag ): Filter<Input, ExtractReason<ExtractTag<Input, Tag>, ReasonTag>, Input> <const Tag extends string, const ReasonTag extends string>( tag: Tag, reasonTag: ReasonTag ): <Input>(input: Input) => Result.Result<ExtractReason<ExtractTag<Input, Tag>, ReasonTag>, Input>}Since v4.0.0
string
Section titled “string”A predefined filter that only passes through string values.
Example (Filtering strings)
import { Filter, Result } from "effect"
console.log(Filter.string("hello")) // Result.succeed("hello")console.log(Filter.string(42)) // failSignature
declare const string: Filter<unknown, string, unknown>Since v4.0.0
symbol
Section titled “symbol”A predefined filter that only passes through Symbol values.
Signature
declare const symbol: Filter<unknown, symbol, unknown>Since v4.0.0
tagged
Section titled “tagged”Creates a filter that checks if an input is tagged with a specific tag.
When to use
Use to keep only the matching member of a _tag-discriminated union while
staying in a composable Filter / Result pipeline.
Details
The filter succeeds when Predicate.isTagged(input, tag) returns true.
Otherwise it fails with the original input.
Gotchas
This only checks _tag; it does not validate the rest of the variant fields.
See
Predicate.isTaggedfor the underlying boolean guard when aFilterresult is not neededreasonfor extracting a nested reason variant from tagged errors
Signature
declare const tagged: { <Input>(): <const Tag extends Tags<Input>>(tag: Tag) => Filter<Input, ExtractTag<Input, Tag>, ExcludeTag<Input, Tag>> <Input, const Tag extends Tags<Input>>(tag: Tag): Filter<Input, ExtractTag<Input, Tag>, ExcludeTag<Input, Tag>> <const Tag extends string>( tag: Tag ): <Input>(input: Input) => Result.Result<ExtractTag<Input, Tag>, ExcludeTag<Input, Tag>>}Since v4.0.0
Creates a Filter that tries to apply a function and returns fail on
error.
Signature
declare const try: <Input, Output>(f: (input: Input) => Output) => Filter<Input, Output>Since v4.0.0
converting
Section titled “converting”toOption
Section titled “toOption”Converts a Filter into a function that returns Some for passed values
and None for filtered-out values.
When to use
Use when adapting a Filter to Option-based code where passed values
become Some and filtered-out inputs become None.
See
toResultfor keeping the filter failure valuetoPredicatefor plain boolean pass/fail checks
Signature
declare const toOption: <A, Pass, Fail>(self: Filter<A, Pass, Fail>) => (input: A) => Option.Option<Pass>Since v4.0.0
toPredicate
Section titled “toPredicate”Converts a Filter into a predicate function.
When to use
Use to reuse a Filter with APIs that accept only boolean predicates when
the pass and fail payloads are not needed.
See
toOptionfor keeping passed values and discarding failure valuestoResultfor preserving both pass and failure values
Signature
declare const toPredicate: <A, Pass, Fail>(self: Filter<A, Pass, Fail>) => Predicate.Predicate<A>Since v4.0.0
toResult
Section titled “toResult”Converts a Filter into a function that returns the underlying
Result.Result for each input.
When to use
Use to adapt a Filter to APIs that expect a plain function returning
Result, while preserving both the pass value and the failure value.
See
toOptionfor keeping only passed valuestoPredicatefor plain boolean pass/fail checks
Signature
declare const toResult: <A, Pass, Fail>(self: Filter<A, Pass, Fail>) => (input: A) => Result.Result<Pass, Fail>Since v4.0.0
mapping
Section titled “mapping”mapFail
Section titled “mapFail”Transforms the failure value produced by a Filter, leaving successful
results unchanged.
Signature
declare const mapFail: { <Fail, Fail2>(f: (fail: Fail) => Fail2): <Input, Pass>(self: Filter<Input, Pass, Fail>) => Filter<Input, Pass, Fail2> <Input, Pass, Fail, Fail2>(self: Filter<Input, Pass, Fail>, f: (fail: Fail) => Fail2): Filter<Input, Pass, Fail2>}Since v4.0.0
models
Section titled “models”Filter (interface)
Section titled “Filter (interface)”Represents a filter function that can transform inputs to outputs or filter them out.
Details
A filter takes an input value and either returns a boxed pass value or the
special fail type to indicate the value should be filtered out.
Example (Defining a positive number filter)
import { Filter, Result } from "effect"
// A filter that only passes positive numbersconst positiveFilter: Filter.Filter<number> = (n) => (n > 0 ? Result.succeed(n) : Result.fail(n))
console.log(positiveFilter(5)) // Result.succeed(5)console.log(positiveFilter(-3)) // Result.fail(-3)Signature
export interface Filter<in Input, out Pass = Input, out Fail = Input> { (input: Input): Result.Result<Pass, Fail>}Since v4.0.0
FilterEffect (interface)
Section titled “FilterEffect (interface)”Represents an effectful filter function that can produce Effects.
Details
Similar to a regular Filter, but the filtering operation itself can be
effectful, allowing for asynchronous operations, error handling, and
dependency injection.
Example (Defining an effectful user filter)
import { Effect, Filter, Result } from "effect"
// An effectful filter that validates user datatype User = { id: string; isActive: boolean }type ValidationError = { message: string }
const validateUser: Filter.FilterEffect<string, User, User, ValidationError, never> = (id) => Effect.gen(function* () { const user: User = { id, isActive: id.length > 0 } return user.isActive ? Result.succeed(user) : Result.fail(user) })Signature
export interface FilterEffect<in Input, out Pass, out Fail, out E = never, out R = never> { (input: Input): Effect<Result.Result<Pass, Fail>, E, R>}Since v4.0.0