Tree overview
Multi-way trees (aka rose trees) and forests, where a forest is
type Forest<A> = Array<Tree<A>>
Added in v2.0.0
Table of contents
- Extract
- constructors
- do notation
- folding
- instances
- legacy
- mapping
- model
- sequencing
- traversing
- type lambdas
- utils
- zone of death
Extract
extract
Signature
export declare const extract: <A>(wa: Tree<A>) => A
Added in v2.6.2
constructors
make
Signature
export declare function make<A>(value: A, forest: Forest<A> = []): Tree<A>
Added in v2.0.0
of
Signature
export declare const of: <A>(a: A) => Tree<A>
Added in v2.7.0
unfoldForest
Build a (possibly infinite) forest from a list of seed values in breadth-first order.
Signature
export declare function unfoldForest<A, B>(bs: Array<B>, f: (b: B) => [A, Array<B>]): Forest<A>
Added in v2.0.0
unfoldForestM
Monadic forest builder, in depth-first order
Signature
export declare function unfoldForestM<M extends URIS4>(
M: Monad4<M>
): <S, R, E, A, B>(bs: Array<B>, f: (b: B) => Kind4<M, S, R, E, [A, Array<B>]>) => Kind4<M, S, R, E, Forest<A>>
export declare function unfoldForestM<M extends URIS3>(
M: Monad3<M>
): <R, E, A, B>(bs: Array<B>, f: (b: B) => Kind3<M, R, E, [A, Array<B>]>) => Kind3<M, R, E, Forest<A>>
export declare function unfoldForestM<M extends URIS3, E>(
M: Monad3C<M, E>
): <R, A, B>(bs: Array<B>, f: (b: B) => Kind3<M, R, E, [A, Array<B>]>) => Kind3<M, R, E, Forest<A>>
export declare function unfoldForestM<M extends URIS2>(
M: Monad2<M>
): <R, E, B>(bs: Array<B>, f: (b: B) => Kind2<M, R, [E, Array<B>]>) => Kind2<M, R, Forest<E>>
export declare function unfoldForestM<M extends URIS2, E>(
M: Monad2C<M, E>
): <A, B>(bs: Array<B>, f: (b: B) => Kind2<M, E, [A, Array<B>]>) => Kind2<M, E, Forest<A>>
export declare function unfoldForestM<M extends URIS>(
M: Monad1<M>
): <A, B>(bs: Array<B>, f: (b: B) => Kind<M, [A, Array<B>]>) => Kind<M, Forest<A>>
export declare function unfoldForestM<M>(
M: MonadHKT<M>
): <A, B>(bs: Array<B>, f: (b: B) => HKT<M, [A, Array<B>]>) => HKT<M, Forest<A>>
Added in v2.0.0
unfoldTree
Build a (possibly infinite) tree from a seed value in breadth-first order.
Signature
export declare function unfoldTree<A, B>(b: B, f: (b: B) => [A, Array<B>]): Tree<A>
Added in v2.0.0
unfoldTreeM
Monadic tree builder, in depth-first order
Signature
export declare function unfoldTreeM<M extends URIS4>(
M: Monad4<M>
): <S, R, E, A, B>(b: B, f: (b: B) => Kind4<M, S, R, E, [A, Array<B>]>) => Kind4<M, S, R, E, Tree<A>>
export declare function unfoldTreeM<M extends URIS3>(
M: Monad3<M>
): <R, E, A, B>(b: B, f: (b: B) => Kind3<M, R, E, [A, Array<B>]>) => Kind3<M, R, E, Tree<A>>
export declare function unfoldTreeM<M extends URIS3, E>(
M: Monad3C<M, E>
): <R, A, B>(b: B, f: (b: B) => Kind3<M, R, E, [A, Array<B>]>) => Kind3<M, R, E, Tree<A>>
export declare function unfoldTreeM<M extends URIS2>(
M: Monad2<M>
): <E, A, B>(b: B, f: (b: B) => Kind2<M, E, [A, Array<B>]>) => Kind2<M, E, Tree<A>>
export declare function unfoldTreeM<M extends URIS2, E>(
M: Monad2C<M, E>
): <A, B>(b: B, f: (b: B) => Kind2<M, E, [A, Array<B>]>) => Kind2<M, E, Tree<A>>
export declare function unfoldTreeM<M extends URIS>(
M: Monad1<M>
): <A, B>(b: B, f: (b: B) => Kind<M, [A, Array<B>]>) => Kind<M, Tree<A>>
export declare function unfoldTreeM<M>(
M: MonadHKT<M>
): <A, B>(b: B, f: (b: B) => HKT<M, [A, Array<B>]>) => HKT<M, Tree<A>>
Added in v2.0.0
do notation
Do
Signature
export declare const Do: Tree<{}>
Added in v2.9.0
apS
Signature
export declare const apS: <N, A, B>(
name: Exclude<N, keyof A>,
fb: Tree<B>
) => (fa: Tree<A>) => Tree<{ readonly [K in N | keyof A]: K extends keyof A ? A[K] : B }>
Added in v2.8.0
bind
Signature
export declare const bind: <N, A, B>(
name: Exclude<N, keyof A>,
f: (a: A) => Tree<B>
) => (ma: Tree<A>) => Tree<{ readonly [K in N | keyof A]: K extends keyof A ? A[K] : B }>
Added in v2.8.0
bindTo
Signature
export declare const bindTo: <N>(name: N) => <A>(fa: Tree<A>) => Tree<{ readonly [K in N]: A }>
Added in v2.8.0
let
Signature
export declare const let: <N, A, B>(
name: Exclude<N, keyof A>,
f: (a: A) => B
) => (fa: Tree<A>) => Tree<{ readonly [K in N | keyof A]: K extends keyof A ? A[K] : B }>
Added in v2.13.0
folding
fold
Fold a tree into a “summary” value in depth-first order.
For each node in the tree, apply f
to the value
and the result of applying f
to each forest
.
This is also known as the catamorphism on trees.
Signature
export declare function fold<A, B>(f: (a: A, bs: Array<B>) => B): (tree: Tree<A>) => B
Example
import { fold, make } from 'fp-ts/Tree'
import { concatAll } from 'fp-ts/Monoid'
import { MonoidSum } from 'fp-ts/number'
const t = make(1, [make(2), make(3)])
const sum = concatAll(MonoidSum)
// Sum the values in a tree:
assert.deepStrictEqual(fold((a: number, bs: Array<number>) => a + sum(bs))(t), 6)
// Find the maximum value in the tree:
assert.deepStrictEqual(fold((a: number, bs: Array<number>) => bs.reduce((b, acc) => Math.max(b, acc), a))(t), 3)
// Count the number of leaves in the tree:
assert.deepStrictEqual(fold((_: number, bs: Array<number>) => (bs.length === 0 ? 1 : sum(bs)))(t), 2)
Added in v2.6.0
foldMap
Signature
export declare const foldMap: <M>(M: Monoid<M>) => <A>(f: (a: A) => M) => (fa: Tree<A>) => M
Added in v2.0.0
reduce
Signature
export declare const reduce: <A, B>(b: B, f: (b: B, a: A) => B) => (fa: Tree<A>) => B
Added in v2.0.0
reduceRight
Signature
export declare const reduceRight: <A, B>(b: B, f: (a: A, b: B) => B) => (fa: Tree<A>) => B
Added in v2.0.0
instances
Applicative
Signature
export declare const Applicative: Applicative1<'Tree'>
Added in v2.7.0
Apply
Signature
export declare const Apply: Apply1<'Tree'>
Added in v2.10.0
Chain
Signature
export declare const Chain: Chain1<'Tree'>
Added in v2.10.0
Comonad
Signature
export declare const Comonad: Comonad1<'Tree'>
Added in v2.7.0
Foldable
Signature
export declare const Foldable: Foldable1<'Tree'>
Added in v2.7.0
Functor
Signature
export declare const Functor: Functor1<'Tree'>
Added in v2.7.0
Monad
Signature
export declare const Monad: Monad1<'Tree'>
Added in v2.7.0
Pointed
Signature
export declare const Pointed: Pointed1<'Tree'>
Added in v2.10.0
Traversable
Signature
export declare const Traversable: Traversable1<'Tree'>
Added in v2.7.0
getEq
Signature
export declare function getEq<A>(E: Eq<A>): Eq<Tree<A>>
Added in v2.0.0
getShow
Signature
export declare function getShow<A>(S: Show<A>): Show<Tree<A>>
Added in v2.0.0
legacy
chain
Alias of flatMap
.
Signature
export declare const chain: <A, B>(f: (a: A) => Tree<B>) => (ma: Tree<A>) => Tree<B>
Added in v2.0.0
mapping
flap
Signature
export declare const flap: <A>(a: A) => <B>(fab: Tree<(a: A) => B>) => Tree<B>
Added in v2.10.0
map
map
can be used to turn functions (a: A) => B
into functions (fa: F<A>) => F<B>
whose argument and return types use the type constructor F
to represent some computational context.
Signature
export declare const map: <A, B>(f: (a: A) => B) => (fa: Tree<A>) => Tree<B>
Added in v2.0.0
model
Forest (type alias)
Signature
export type Forest<A> = Array<Tree<A>>
Added in v2.0.0
Tree (interface)
Signature
export interface Tree<A> {
readonly value: A
readonly forest: Forest<A>
}
Added in v2.0.0
sequencing
flatMap
Signature
export declare const flatMap: {
<A, B>(f: (a: A) => Tree<B>): (ma: Tree<A>) => Tree<B>
<A, B>(ma: Tree<A>, f: (a: A) => Tree<B>): Tree<B>
}
Added in v2.14.0
flatten
Signature
export declare const flatten: <A>(mma: Tree<Tree<A>>) => Tree<A>
Added in v2.0.0
traversing
sequence
Signature
export declare const sequence: Sequence1<'Tree'>
Added in v2.6.3
traverse
Signature
export declare const traverse: PipeableTraverse1<'Tree'>
Added in v2.6.3
type lambdas
URI
Signature
export declare const URI: 'Tree'
Added in v2.0.0
URI (type alias)
Signature
export type URI = typeof URI
Added in v2.0.0
utils
ap
Signature
export declare const ap: <A>(fa: Tree<A>) => <B>(fab: Tree<(a: A) => B>) => Tree<B>
Added in v2.0.0
apFirst
Combine two effectful actions, keeping only the result of the first.
Signature
export declare const apFirst: <B>(second: Tree<B>) => <A>(first: Tree<A>) => Tree<A>
Added in v2.0.0
apSecond
Combine two effectful actions, keeping only the result of the second.
Signature
export declare const apSecond: <B>(second: Tree<B>) => <A>(first: Tree<A>) => Tree<B>
Added in v2.0.0
chainFirst
Composes computations in sequence, using the return value of one computation to determine the next computation and keeping only the result of the first.
Signature
export declare const chainFirst: <A, B>(f: (a: A) => Tree<B>) => (first: Tree<A>) => Tree<A>
Added in v2.0.0
drawForest
Neat 2-dimensional drawing of a forest
Signature
export declare function drawForest(forest: Forest<string>): string
Added in v2.0.0
drawTree
Neat 2-dimensional drawing of a tree
Signature
export declare function drawTree(tree: Tree<string>): string
Example
import { make, drawTree } from 'fp-ts/Tree'
const fa = make('a', [make('b'), make('c'), make('d', [make('e'), make('f')])])
assert.strictEqual(
drawTree(fa),
`a
├─ b
├─ c
└─ d
├─ e
└─ f`
)
Added in v2.0.0
duplicate
Signature
export declare const duplicate: <A>(wa: Tree<A>) => Tree<Tree<A>>
Added in v2.0.0
elem
Signature
export declare function elem<A>(E: Eq<A>): (a: A, fa: Tree<A>) => boolean
Added in v2.0.0
exists
Signature
export declare const exists: <A>(predicate: Predicate<A>) => (ma: Tree<A>) => boolean
Added in v2.11.0
extend
Signature
export declare const extend: <A, B>(f: (wa: Tree<A>) => B) => (wa: Tree<A>) => Tree<B>
Added in v2.0.0
zone of death
tree
This instance is deprecated, use small, specific instances instead. For example if a function needs a Functor
instance, pass T.Functor
instead of T.tree
(where T
is from import T from 'fp-ts/Tree'
)
Signature
export declare const tree: Monad1<'Tree'> & Foldable1<'Tree'> & Traversable1<'Tree'> & Comonad1<'Tree'>
Added in v2.0.0