Functors.@leaf
— Macro@leaf T
Define functor
for the type T
so that isleaf(x::T) == true
.
diff --git a/previews/PR51/.documenter-siteinfo.json b/previews/PR51/.documenter-siteinfo.json
index e750bcd..310f530 100644
--- a/previews/PR51/.documenter-siteinfo.json
+++ b/previews/PR51/.documenter-siteinfo.json
@@ -1 +1 @@
-{"documenter":{"julia_version":"1.10.5","generation_timestamp":"2024-10-28T07:19:52","documenter_version":"1.7.0"}}
\ No newline at end of file
+{"documenter":{"julia_version":"1.10.5","generation_timestamp":"2024-10-28T09:09:08","documenter_version":"1.7.0"}}
\ No newline at end of file
diff --git a/previews/PR51/api/index.html b/previews/PR51/api/index.html
index 80e55bf..f25bc23 100644
--- a/previews/PR51/api/index.html
+++ b/previews/PR51/api/index.html
@@ -29,8 +29,8 @@
TwoThirds("ten", 20, "thirty")
julia> fmap(x -> 10x, TwoThirds(Foo(1,2), Foo(3,4), 56))
-TwoThirds(Foo(10, 20), Foo(3, 4), 560)source Define Returns a tuple containing, first, a Methods should be added to Return the children of Return true if Examples Define Returns a tuple containing, first, a Methods should be added to Return the children of Return true if Examples Traverse Doesn't recurse inside branches rooted at nodes See also Examples Traverse Doesn't recurse inside branches rooted at nodes See also Examples Traverse The See also Examples Traverse The See also ExamplesFunctors.@leaf
— Macro@leaf T
functor
for the type T
so that isleaf(x::T) == true
.Functors.functor
— Functionfunctor(x)
-functor(typeof(x), x)
NamedTuple
of the children of x
(typically its fields), and second, a reconstruction function. This controls the behaviour of fmap
.functor(::Type{T}, x)
for custom types, usually using the macro @functor
.Functors.children
— Functionchildren(x)
x
as defined by functor
. Equivalent to functor(x)[1]
.Functors.isleaf
— Functionisleaf(x)
x
has no children
according to functor
.julia> Functors.isleaf(1)
+TwoThirds(Foo(10, 20), Foo(3, 4), 560)
Functors.@leaf
— Macro@leaf T
functor
for the type T
so that isleaf(x::T) == true
.Functors.functor
— Functionfunctor(x)
+functor(typeof(x), x)
NamedTuple
of the children of x
(typically its fields), and second, a reconstruction function. This controls the behaviour of fmap
.functor(::Type{T}, x)
for custom types, usually using the macro @functor
.Functors.children
— Functionchildren(x)
x
as defined by functor
. Equivalent to functor(x)[1]
.Functors.isleaf
— Functionisleaf(x)
x
has no children
according to functor
.julia> Functors.isleaf(1)
true
julia> Functors.isleaf([2, 3, 4])
@@ -46,7 +46,7 @@
false
julia> Functors.isleaf(())
-true
Functors.fcollect
— Functionfcollect(x; exclude = v -> false)
x
by recursing each child of x
as defined by functor
and collecting the results into a flat array, ordered by a breadth-first traversal of x
, respecting the iteration order of children
calls.v
for which exclude(v) == true
. In such cases, the root v
is also excluded from the result. By default, exclude
always yields false
.children
.julia> struct Foo; x; y; end
+true
Functors.fcollect
— Functionfcollect(x; exclude = v -> false)
x
by recursing each child of x
as defined by functor
and collecting the results into a flat array, ordered by a breadth-first traversal of x
, respecting the iteration order of children
calls.v
for which exclude(v) == true
. In such cases, the root v
is also excluded from the result. By default, exclude
always yields false
.children
.julia> struct Foo; x; y; end
julia> struct Bar; x; end
@@ -72,7 +72,7 @@
julia> fcollect(m, exclude = v -> Functors.isleaf(v))
2-element Vector{Any}:
Foo(Bar([1, 2, 3]), TypeWithNoChildren(:a, :b))
- Bar([1, 2, 3])
Functors.fleaves
— Functionfleaves(x; exclude = isleaf)
x
by recursing each child of x
as defined by functor
and collecting the leaves into a flat array, ordered by a breadth-first traversal of x
, respecting the iteration order of children
calls.exclude
function is used to determine whether to recurse into a node, therefore identifying the leaves as the nodes for which exclude
returns true
.fcollect
for a similar function that collects all nodes instead.julia> struct Bar; x; end
+ Bar([1, 2, 3])
Functors.fleaves
— Functionfleaves(x; exclude = isleaf)
x
by recursing each child of x
as defined by functor
and collecting the leaves into a flat array, ordered by a breadth-first traversal of x
, respecting the iteration order of children
calls.exclude
function is used to determine whether to recurse into a node, therefore identifying the leaves as the nodes for which exclude
returns true
.fcollect
for a similar function that collects all nodes instead.julia> struct Bar; x; end
julia> struct TypeWithNoChildren; x; y; end
@@ -83,7 +83,7 @@
julia> fleaves(m)
2-element Vector{Any}:
[1, 2, 3]
- TypeWithNoChildren(4, 5)
Functors.fmap
— Functionfmap(f, x, ys...; exclude = Functors.isleaf, walk = Functors.DefaultWalk(), [prune])
A structure and type preserving map
.
By default it transforms every leaf node (identified by exclude
, default isleaf
) by applying f
, and otherwise traverses x
recursively using functor
. Optionally, it may also be associated with objects ys
with the same tree structure. In that case, f
is applied to the corresponding leaf nodes in x
and ys
.
See also fmap_with_path
and fmapstructure
.
Examples
julia> fmap(string, (x=1, y=(2, 3)))
+ TypeWithNoChildren(4, 5)
Functors.fmap
— Functionfmap(f, x, ys...; exclude = Functors.isleaf, walk = Functors.DefaultWalk(), [prune])
A structure and type preserving map
.
By default it transforms every leaf node (identified by exclude
, default isleaf
) by applying f
, and otherwise traverses x
recursively using functor
. Optionally, it may also be associated with objects ys
with the same tree structure. In that case, f
is applied to the corresponding leaf nodes in x
and ys
.
See also fmap_with_path
and fmapstructure
.
Examples
julia> fmap(string, (x=1, y=(2, 3)))
(x = "1", y = ("2", "3"))
julia> nt = (a = [1,2], b = [23, (45,), (x=6//7, y=())], c = [8,9]);
@@ -140,12 +140,12 @@
Foo("hello", (40, 50, "hello"))
The behaviour when the same node appears twice can be altered by giving a value to the prune
keyword, which is then used in place of all but the first:
julia> twice = [1, 2];
julia> fmap(float, (x = twice, y = [1,2], z = twice); prune = missing)
-(x = [1.0, 2.0], y = [1.0, 2.0], z = missing)
Functors.fmap_with_path
— Functionfmap_with_path(f, x, ys...; exclude = isleaf, walk = DefaultWalkWithPath(), [prune])
Like fmap
, but also passes a KeyPath
to f
for each node in the recursion. The KeyPath
is a tuple of the indices used to reach the current node from the root of the recursion. The KeyPath
is constructed by the walk
function, and can be used to reconstruct the path to the current node from the root of the recursion.
f
has to accept two arguments: the associated KeyPath
and the value of the current node.
exclude
also receives the KeyPath
as its first argument and a node as its second. It should return true
if the recursion should not continue on its children and f
applied to it.
prune
is used to control the behaviour when the same node appears twice, see fmap
for more information.
Examples
julia> x = ([1, 2, 3], 4, (a=5, b=Dict("A"=>6, "B"=>7), c=Dict("C"=>8, "D"=>9)));
+(x = [1.0, 2.0], y = [1.0, 2.0], z = missing)
Functors.fmap_with_path
— Functionfmap_with_path(f, x, ys...; exclude = isleaf, walk = DefaultWalkWithPath(), [prune])
Like fmap
, but also passes a KeyPath
to f
for each node in the recursion. The KeyPath
is a tuple of the indices used to reach the current node from the root of the recursion. The KeyPath
is constructed by the walk
function, and can be used to reconstruct the path to the current node from the root of the recursion.
f
has to accept two arguments: the associated KeyPath
and the value of the current node.
exclude
also receives the KeyPath
as its first argument and a node as its second. It should return true
if the recursion should not continue on its children and f
applied to it.
prune
is used to control the behaviour when the same node appears twice, see fmap
for more information.
Examples
julia> x = ([1, 2, 3], 4, (a=5, b=Dict("A"=>6, "B"=>7), c=Dict("C"=>8, "D"=>9)));
julia> exclude(kp, x) = kp == KeyPath(3, :c) || Functors.isleaf(x);
julia> fmap_with_path((kp, x) -> x isa Dict ? nothing : x.^2, x; exclude = exclude)
-([1, 4, 9], 16, (a = 25, b = Dict("B" => 49, "A" => 36), c = nothing))
Functors.fmapstructure
— Functionfmapstructure(f, x, ys...; exclude = isleaf, [prune])
Like fmap
, but doesn't preserve the type of custom structs. Instead, it returns a NamedTuple
(or a Tuple
, or an array), or a nested set of these.
Useful for when the output must not contain custom structs.
See also fmap
and fmapstructure_with_path
.
Examples
julia> struct Foo; x; y; end
+([1, 4, 9], 16, (a = 25, b = Dict("B" => 49, "A" => 36), c = nothing))
Functors.fmapstructure
— Functionfmapstructure(f, x, ys...; exclude = isleaf, [prune])
Like fmap
, but doesn't preserve the type of custom structs. Instead, it returns a NamedTuple
(or a Tuple
, or an array), or a nested set of these.
Useful for when the output must not contain custom structs.
See also fmap
and fmapstructure_with_path
.
Examples
julia> struct Foo; x; y; end
julia> m = Foo([1,2,3], [4, (5, 6), Foo(7, 8)]);
@@ -159,11 +159,11 @@
6
7
8
-(x = nothing, y = Any[nothing, (nothing, nothing), (x = nothing, y = nothing)])
Functors.fmapstructure_with_path
— Functionfmapstructure_with_path(f, x, ys...; [exclude, prune])
Like fmap_with_path
, but doesn't preserve the type of custom structs. Instead, it returns a named tuple, a tuple, an array, a dict, or a nested set of these.
See also fmapstructure
.
Functors.AbstractWalk
— TypeAbstractWalk
Any walk for use with fmap
should inherit from this type. A walk subtyping AbstractWalk
must satisfy the walk function interface:
struct MyWalk <: AbstractWalk end
+(x = nothing, y = Any[nothing, (nothing, nothing), (x = nothing, y = nothing)])
Functors.fmapstructure_with_path
— Functionfmapstructure_with_path(f, x, ys...; [exclude, prune])
Like fmap_with_path
, but doesn't preserve the type of custom structs. Instead, it returns a named tuple, a tuple, an array, a dict, or a nested set of these.
See also fmapstructure
.
Functors.AbstractWalk
— TypeAbstractWalk
Any walk for use with fmap
should inherit from this type. A walk subtyping AbstractWalk
must satisfy the walk function interface:
struct MyWalk <: AbstractWalk end
function (::MyWalk)(recurse, x, ys...)
# implement this
-end
The walk function is called on a node x
in a Functors tree. It may also be passed associated nodes ys...
in other Functors trees. The walk function recurses further into (x, ys...)
by calling recurse
on the child nodes. The choice of which nodes to recurse and in what order is custom to the walk.
Functors.execute
— Functionexecute(walk, x, ys...)
Execute a walk
that recursively calls itself, starting at a node x
in a Functors tree, as well as optional associated nodes ys...
in other Functors trees. Any custom walk
function that subtypes Functors.AbstractWalk
is permitted.
Functors.DefaultWalk
— TypeDefaultWalk()
The default walk behavior for Functors.jl. Walks all the Functors.children
of trees (x, ys...)
based on the structure of x
. The resulting mapped child nodes are restructured into the type of x
.
See fmap
for more information.
Functors.StructuralWalk
— TypeStructuralWalk()
A structural variant of Functors.DefaultWalk
. The recursion behavior is identical, but the mapped children are not restructured.
See fmapstructure
for more information.
Functors.ExcludeWalk
— TypeExcludeWalk(walk, fn, exclude)
A walk that recurses nodes (x, ys...)
according to walk
, except when exclude(x)
is true. Then, fn(x, ys...)
is applied instead of recursing further.
Typically wraps an existing walk
for use with fmap
.
Functors.CachedWalk
— TypeCachedWalk(walk[; prune])
A walk that recurses nodes (x, ys...)
according to walk
and storing the output of the recursion in a cache indexed by x
(based on object ID). Whenever the cache already contains x
, either:
prune
is specified, then it is returned, orprune
is unspecified, and the previously cached recursion of (x, ys...)
returned.Typically wraps an existing walk
for use with fmap
.
Functors.CollectWalk
— TypeCollectWalk()
A walk that recurses into a node x
via Functors.children
, storing the recursion history in a cache. The resulting ordered recursion history is returned.
See fcollect
for more information.
Functors.AnonymousWalk
— TypeAnonymousWalk(walk_fn)
Wrap a walk_fn
so that AnonymousWalk(walk_fn) isa AbstractWalk
. This type only exists for backwards compatability and should not be directly used. Attempting to wrap an existing AbstractWalk
is a no-op (i.e. it is not wrapped).
Functors.IterateWalk
— TypeIterateWalk()
A walk that walks all the Functors.children
of trees (x, ys...)
and concatenates the iterators of the children via Iterators.flatten
. The resulting iterator is returned.
When used with fmap
, the provided function f
should return an iterator. For example, to iterate through the square of every scalar value:
julia> x = ([1, 2, 3], 4, (5, 6, [7, 8]));
+end
The walk function is called on a node x
in a Functors tree. It may also be passed associated nodes ys...
in other Functors trees. The walk function recurses further into (x, ys...)
by calling recurse
on the child nodes. The choice of which nodes to recurse and in what order is custom to the walk.
Functors.execute
— Functionexecute(walk, x, ys...)
Execute a walk
that recursively calls itself, starting at a node x
in a Functors tree, as well as optional associated nodes ys...
in other Functors trees. Any custom walk
function that subtypes Functors.AbstractWalk
is permitted.
Functors.DefaultWalk
— TypeDefaultWalk()
The default walk behavior for Functors.jl. Walks all the Functors.children
of trees (x, ys...)
based on the structure of x
. The resulting mapped child nodes are restructured into the type of x
.
See fmap
for more information.
Functors.StructuralWalk
— TypeStructuralWalk()
A structural variant of Functors.DefaultWalk
. The recursion behavior is identical, but the mapped children are not restructured.
See fmapstructure
for more information.
Functors.ExcludeWalk
— TypeExcludeWalk(walk, fn, exclude)
A walk that recurses nodes (x, ys...)
according to walk
, except when exclude(x)
is true. Then, fn(x, ys...)
is applied instead of recursing further.
Typically wraps an existing walk
for use with fmap
.
Functors.CachedWalk
— TypeCachedWalk(walk[; prune])
A walk that recurses nodes (x, ys...)
according to walk
and storing the output of the recursion in a cache indexed by x
(based on object ID). Whenever the cache already contains x
, either:
prune
is specified, then it is returned, orprune
is unspecified, and the previously cached recursion of (x, ys...)
returned.Typically wraps an existing walk
for use with fmap
.
Functors.CollectWalk
— TypeCollectWalk()
A walk that recurses into a node x
via Functors.children
, storing the recursion history in a cache. The resulting ordered recursion history is returned.
See fcollect
for more information.
Functors.AnonymousWalk
— TypeAnonymousWalk(walk_fn)
Wrap a walk_fn
so that AnonymousWalk(walk_fn) isa AbstractWalk
. This type only exists for backwards compatability and should not be directly used. Attempting to wrap an existing AbstractWalk
is a no-op (i.e. it is not wrapped).
Functors.IterateWalk
— TypeIterateWalk()
A walk that walks all the Functors.children
of trees (x, ys...)
and concatenates the iterators of the children via Iterators.flatten
. The resulting iterator is returned.
When used with fmap
, the provided function f
should return an iterator. For example, to iterate through the square of every scalar value:
julia> x = ([1, 2, 3], 4, (5, 6, [7, 8]));
julia> make_iterator(x) = x isa AbstractVector ? x.^2 : (x^2,);
@@ -193,7 +193,7 @@
(25, 16)
(36, 9)
(49, 4)
- (64, 1)
Functors.KeyPath
— TypeKeyPath(keys...)
A type for representing a path of keys to a value in a nested structure. Can be constructed with a sequence of keys, or by concatenating other KeyPath
s. Keys can be of type Symbol
, String
, or Int
.
For custom types, access through symbol keys is assumed to be done with getproperty
. For consistency, the method Base.propertynames
is used to get the viable property names.
For string and integer keys instead, the access is done with getindex
.
See also getkeypath
, haskeypath
.
Examples
julia> kp = KeyPath(:b, 3)
+ (64, 1)
Functors.KeyPath
— TypeKeyPath(keys...)
A type for representing a path of keys to a value in a nested structure. Can be constructed with a sequence of keys, or by concatenating other KeyPath
s. Keys can be of type Symbol
, String
, or Int
.
For custom types, access through symbol keys is assumed to be done with getproperty
. For consistency, the method Base.propertynames
is used to get the viable property names.
For string and integer keys instead, the access is done with getindex
.
See also getkeypath
, haskeypath
.
Examples
julia> kp = KeyPath(:b, 3)
KeyPath(:b, 3)
julia> KeyPath(:a, kp, :c, 4) # construct mixing keys and keypaths
@@ -222,7 +222,7 @@
"ab"
julia> getkeypath(x, KeyPath(:b, :c)) # equivalent to (x.b)[:c]
-4
Functors.haskeypath
— Functionhaskeypath(x, kp::KeyPath)
Return true
if x
has a value at the path kp
.
See also KeyPath
, getkeypath
, and setkeypath!
.
Examples
julia> x = Dict(:a => 3, :b => Dict(:c => 4, "d" => [5, 6, 7]))
+4
Functors.haskeypath
— Functionhaskeypath(x, kp::KeyPath)
Return true
if x
has a value at the path kp
.
See also KeyPath
, getkeypath
, and setkeypath!
.
Examples
julia> x = Dict(:a => 3, :b => Dict(:c => 4, "d" => [5, 6, 7]))
Dict{Symbol, Any} with 2 entries:
:a => 3
:b => Dict{Any, Any}(:c=>4, "d"=>[5, 6, 7])
@@ -234,10 +234,10 @@
true
julia> haskeypath(x, KeyPath(:b, "d", 4))
-false
Functors.getkeypath
— Functiongetkeypath(x, kp::KeyPath)
Return the value in x
at the path kp
.
See also KeyPath
, haskeypath
, and setkeypath!
.
Examples
julia> x = Dict(:a => 3, :b => Dict(:c => 4, "d" => [5, 6, 7]))
+false
Functors.getkeypath
— Functiongetkeypath(x, kp::KeyPath)
Return the value in x
at the path kp
.
See also KeyPath
, haskeypath
, and setkeypath!
.
Examples
julia> x = Dict(:a => 3, :b => Dict(:c => 4, "d" => [5, 6, 7]))
Dict{Symbol, Any} with 2 entries:
:a => 3
:b => Dict{Any, Any}(:c=>4, "d"=>[5, 6, 7])
julia> getkeypath(x, KeyPath(:b, "d", 2))
-6
Functors.setkeypath!
— Functionsetkeypath!(x, kp::KeyPath, v)
Set the value in x
at the path kp
to v
.
See also KeyPath
, getkeypath
, and haskeypath
.
Settings
This document was generated with Documenter.jl version 1.7.0 on Monday 28 October 2024. Using Julia version 1.10.5.