List.ts overview
A data type for immutable linked lists representing ordered collections of elements of type A
.
This data type is optimal for last-in-first-out (LIFO), stack-like access patterns. If you need another access pattern, for example, random access or FIFO, consider using a collection more suited to this than List
.
Performance
- Time:
List
hasO(1)
prepend and head/tail access. Most other operations areO(n)
on the number of elements in the list. This includes the index-based lookup of elements,length
,append
andreverse
. - Space:
List
implements structural sharing of the tail list. This means that many operations are either zero- or constant-memory cost.
Since v2.0.0
Exports Grouped by Category
- combinators
- concatenating
- constructors
- conversions
- elements
- equivalence
- folding
- getters
- mapping
- models
- refinements
- sequencing
- symbol
- unsafe
- utils
combinators
compact
Removes all None
values from the specified list.
Signature
declare const compact: <A>(self: List<Option.Option<A>>) => List<A>
Since v2.0.0
drop
Drops the first n
elements from the specified list.
Signature
declare const drop: { (n: number): <A>(self: List<A>) => List<A>; <A>(self: List<A>, n: number): List<A> }
Since v2.0.0
filter
Filters a list using the specified predicate.
Signature
declare const filter: {
<A, B extends A>(refinement: Refinement<NoInfer<A>, B>): (self: List<A>) => List<B>
<A>(predicate: Predicate<NoInfer<A>>): (self: List<A>) => List<A>
<A, B extends A>(self: List<A>, refinement: Refinement<A, B>): List<B>
<A>(self: List<A>, predicate: Predicate<A>): List<A>
}
Since v2.0.0
filterMap
Filters and maps a list using the specified partial function. The resulting list may be smaller than the input list due to the possibility of the partial function not being defined for some elements.
Signature
declare const filterMap: {
<A, B>(f: (a: A) => Option.Option<B>): (self: List<A>) => List<B>
<A, B>(self: List<A>, f: (a: A) => Option.Option<B>): List<B>
}
Since v2.0.0
forEach
Applies the specified function to each element of the List
.
Signature
declare const forEach: { <A, B>(f: (a: A) => B): (self: List<A>) => void; <A, B>(self: List<A>, f: (a: A) => B): void }
Since v2.0.0
partition
Partition a list into two lists, where the first list contains all elements that did not satisfy the specified predicate, and the second list contains all elements that did satisfy the specified predicate.
Signature
declare const partition: {
<A, B extends A>(
refinement: Refinement<NoInfer<A>, B>
): (self: List<A>) => [excluded: List<Exclude<A, B>>, satisfying: List<B>]
<A>(predicate: Predicate<NoInfer<A>>): (self: List<A>) => [excluded: List<A>, satisfying: List<A>]
<A, B extends A>(self: List<A>, refinement: Refinement<A, B>): [excluded: List<Exclude<A, B>>, satisfying: List<B>]
<A>(self: List<A>, predicate: Predicate<A>): [excluded: List<A>, satisfying: List<A>]
}
Since v2.0.0
partitionMap
Partition a list into two lists, where the first list contains all elements for which the specified function returned a Left
, and the second list contains all elements for which the specified function returned a Right
.
Signature
declare const partitionMap: {
<A, B, C>(f: (a: A) => Either.Either<C, B>): (self: List<A>) => [left: List<B>, right: List<C>]
<A, B, C>(self: List<A>, f: (a: A) => Either.Either<C, B>): [left: List<B>, right: List<C>]
}
Since v2.0.0
splitAt
Splits the specified list into two lists at the specified index.
Signature
declare const splitAt: {
(n: number): <A>(self: List<A>) => [beforeIndex: List<A>, fromIndex: List<A>]
<A>(self: List<A>, n: number): [beforeIndex: List<A>, fromIndex: List<A>]
}
Since v2.0.0
take
Takes the specified number of elements from the beginning of the specified list.
Signature
declare const take: { (n: number): <A>(self: List<A>) => List<A>; <A>(self: List<A>, n: number): List<A> }
Since v2.0.0
concatenating
append
Appends the specified element to the end of the List
, creating a new Cons
.
Signature
declare const append: {
<B>(element: B): <A>(self: List<A>) => Cons<A | B>
<A, B>(self: List<A>, element: B): Cons<A | B>
}
Since v2.0.0
appendAll
Concatenates two lists, combining their elements. If either list is non-empty, the result is also a non-empty list.
Example
import * as assert from "node:assert"
import { List } from "effect"
assert.deepStrictEqual(List.make(1, 2).pipe(List.appendAll(List.make("a", "b")), List.toArray), [1, 2, "a", "b"])
Signature
declare const appendAll: {
<S extends List<any>, T extends List<any>>(that: T): (self: S) => List.OrNonEmpty<S, T, List.Infer<S> | List.Infer<T>>
<A, B>(self: List<A>, that: Cons<B>): Cons<A | B>
<A, B>(self: Cons<A>, that: List<B>): Cons<A | B>
<A, B>(self: List<A>, that: List<B>): List<A | B>
}
Since v2.0.0
prepend
Prepends the specified element to the beginning of the list.
Signature
declare const prepend: {
<B>(element: B): <A>(self: List<A>) => Cons<A | B>
<A, B>(self: List<A>, element: B): Cons<A | B>
}
Since v2.0.0
prependAll
Prepends the specified prefix list to the beginning of the specified list. If either list is non-empty, the result is also a non-empty list.
Example
import * as assert from "node:assert"
import { List } from "effect"
assert.deepStrictEqual(List.make(1, 2).pipe(List.prependAll(List.make("a", "b")), List.toArray), ["a", "b", 1, 2])
Signature
declare const prependAll: {
<S extends List<any>, T extends List<any>>(that: T): (self: S) => List.OrNonEmpty<S, T, List.Infer<S> | List.Infer<T>>
<A, B>(self: List<A>, that: Cons<B>): Cons<A | B>
<A, B>(self: Cons<A>, that: List<B>): Cons<A | B>
<A, B>(self: List<A>, that: List<B>): List<A | B>
}
Since v2.0.0
prependAllReversed
Prepends the specified prefix list (in reverse order) to the beginning of the specified list.
Signature
declare const prependAllReversed: {
<B>(prefix: List<B>): <A>(self: List<A>) => List<A | B>
<A, B>(self: List<A>, prefix: List<B>): List<A | B>
}
Since v2.0.0
constructors
cons
Constructs a new List.Cons<A>
from the specified head
and tail
values.
Signature
declare const cons: <A>(head: A, tail: List<A>) => Cons<A>
Since v2.0.0
empty
Constructs a new empty List<A>
.
Alias of nil
.
Signature
declare const empty: <A = never>() => List<A>
Since v2.0.0
fromIterable
Creates a new List
from an iterable collection of values.
Signature
declare const fromIterable: <A>(prefix: Iterable<A>) => List<A>
Since v2.0.0
make
Constructs a new List<A>
from the specified values.
Signature
declare const make: <Elements extends readonly [any, ...Array<any>]>(...elements: Elements) => Cons<Elements[number]>
Since v2.0.0
nil
Constructs a new empty List<A>
.
Signature
declare const nil: <A = never>() => List<A>
Since v2.0.0
of
Constructs a new List<A>
from the specified value.
Signature
declare const of: <A>(value: A) => Cons<A>
Since v2.0.0
conversions
toArray
Converts the specified List
to an Array
.
Signature
declare const toArray: <A>(self: List<A>) => Array<A>
Since v2.0.0
toChunk
Converts the specified List
to a Chunk
.
Signature
declare const toChunk: <A>(self: List<A>) => Chunk.Chunk<A>
Since v2.0.0
elements
every
Check if a predicate holds true for every List
element.
Signature
declare const every: {
<A, B extends A>(refinement: Refinement<NoInfer<A>, B>): (self: List<A>) => self is List<B>
<A>(predicate: Predicate<A>): (self: List<A>) => boolean
<A, B extends A>(self: List<A>, refinement: Refinement<A, B>): self is List<B>
<A>(self: List<A>, predicate: Predicate<A>): boolean
}
Since v2.0.0
findFirst
Returns the first element that satisfies the specified predicate, or None
if no such element exists.
Signature
declare const findFirst: {
<A, B extends A>(refinement: Refinement<NoInfer<A>, B>): (self: List<A>) => Option.Option<B>
<A>(predicate: Predicate<NoInfer<A>>): (self: List<A>) => Option.Option<A>
<A, B extends A>(self: List<A>, refinement: Refinement<A, B>): Option.Option<B>
<A>(self: List<A>, predicate: Predicate<A>): Option.Option<A>
}
Since v2.0.0
reverse
Returns a new list with the elements of the specified list in reverse order.
Signature
declare const reverse: <A>(self: List<A>) => List<A>
Since v2.0.0
some
Check if a predicate holds true for some List
element.
Signature
declare const some: {
<A>(predicate: Predicate<NoInfer<A>>): (self: List<A>) => self is Cons<A>
<A>(self: List<A>, predicate: Predicate<A>): self is Cons<A>
}
Since v2.0.0
equivalence
getEquivalence
Signature
declare const getEquivalence: <A>(isEquivalent: Equivalence.Equivalence<A>) => Equivalence.Equivalence<List<A>>
Since v2.0.0
folding
reduce
Folds over the elements of the list using the specified function, using the specified initial value.
Signature
declare const reduce: {
<Z, A>(zero: Z, f: (b: Z, a: A) => Z): (self: List<A>) => Z
<A, Z>(self: List<A>, zero: Z, f: (b: Z, a: A) => Z): Z
}
Since v2.0.0
reduceRight
Folds over the elements of the list using the specified function, beginning with the last element of the list, using the specified initial value.
Signature
declare const reduceRight: {
<Z, A>(zero: Z, f: (accumulator: Z, value: A) => Z): (self: List<A>) => Z
<Z, A>(self: List<A>, zero: Z, f: (accumulator: Z, value: A) => Z): Z
}
Since v2.0.0
getters
head
Returns the first element of the specified list, or None
if the list is empty.
Signature
declare const head: <A>(self: List<A>) => Option.Option<A>
Since v2.0.0
last
Returns the last element of the specified list, or None
if the list is empty.
Signature
declare const last: <A>(self: List<A>) => Option.Option<A>
Since v2.0.0
size
Returns the number of elements contained in the specified List
Signature
declare const size: <A>(self: List<A>) => number
Since v2.0.0
tail
Returns the tail of the specified list, or None
if the list is empty.
Signature
declare const tail: <A>(self: List<A>) => Option.Option<List<A>>
Since v2.0.0
mapping
map
Applies the specified mapping function to each element of the list.
Signature
declare const map: {
<S extends List<any>, B>(f: (a: List.Infer<S>, i: number) => B): (self: S) => List.With<S, B>
<S extends List<any>, B>(self: S, f: (a: List.Infer<S>, i: number) => B): List.With<S, B>
}
Since v2.0.0
models
Cons (interface)
Signature
export interface Cons<out A> extends NonEmptyIterable<A>, Equal.Equal, Pipeable, Inspectable {
readonly [TypeId]: TypeId
readonly _tag: "Cons"
readonly head: A
readonly tail: List<A>
}
Since v2.0.0
List (type alias)
Represents an immutable linked list of elements of type A
.
A List
is optimal for last-in-first-out (LIFO), stack-like access patterns. If you need another access pattern, for example, random access or FIFO, consider using a collection more suited for that other than List
.
Signature
type List<A> = Cons<A> | Nil<A>
Since v2.0.0
Nil (interface)
Signature
export interface Nil<out A> extends Iterable<A>, Equal.Equal, Pipeable, Inspectable {
readonly [TypeId]: TypeId
readonly _tag: "Nil"
}
Since v2.0.0
refinements
isCons
Returns true
if the specified value is a List.Cons<A>
, false
otherwise.
Signature
declare const isCons: <A>(self: List<A>) => self is Cons<A>
Since v2.0.0
isList
Returns true
if the specified value is a List
, false
otherwise.
Signature
declare const isList: { <A>(u: Iterable<A>): u is List<A>; (u: unknown): u is List<unknown> }
Since v2.0.0
isNil
Returns true
if the specified value is a List.Nil<A>
, false
otherwise.
Signature
declare const isNil: <A>(self: List<A>) => self is Nil<A>
Since v2.0.0
sequencing
flatMap
Applies a function to each element in a list and returns a new list containing the concatenated mapped elements.
Signature
declare const flatMap: {
<S extends List<any>, T extends List<any>>(
f: (a: List.Infer<S>, i: number) => T
): (self: S) => List.AndNonEmpty<S, T, List.Infer<T>>
<A, B>(self: Cons<A>, f: (a: A, i: number) => Cons<B>): Cons<B>
<A, B>(self: List<A>, f: (a: A, i: number) => List<B>): List<B>
}
Since v2.0.0
symbol
TypeId
Signature
declare const TypeId: unique symbol
Since v2.0.0
TypeId (type alias)
Signature
type TypeId = typeof TypeId
Since v2.0.0
unsafe
unsafeHead
Unsafely returns the first element of the specified List
.
Signature
declare const unsafeHead: <A>(self: List<A>) => A
Since v2.0.0
unsafeLast
Unsafely returns the last element of the specified List
.
Signature
declare const unsafeLast: <A>(self: List<A>) => A
Since v2.0.0
unsafeTail
Unsafely returns the tail of the specified List
.
Signature
declare const unsafeTail: <A>(self: List<A>) => List<A>
Since v2.0.0
utils
List (namespace)
Since v2.0.0
Infer (type alias)
Signature
type Infer<S> = S extends List<infer A> ? A : never
Since v2.0.0
With (type alias)
Signature
type With<S, A> = S extends Cons<any> ? Cons<A> : List<A>
Since v2.0.0
OrNonEmpty (type alias)
Signature
type OrNonEmpty<S, T, A> = S extends Cons<any> ? Cons<A> : T extends Cons<any> ? Cons<A> : List<A>
Since v2.0.0
AndNonEmpty (type alias)
Signature
type AndNonEmpty<S, T, A> = S extends Cons<any> ? (T extends Cons<any> ? Cons<A> : List<A>) : List<A>
Since v2.0.0