@@ -97,12 +97,26 @@ function tree_mapreduce(
9797 preserve_sharing:: Bool = false ,
9898 result_type:: Type{RT} = Nothing,
9999) where {T,N<: Node{T} ,F1<: Function ,F2<: Function ,G<: Function ,RT}
100- preserve_sharing && return @with_memoization (
101- _tree_mapreduce (f_leaf, f_branch, op, tree), IdDict {N,RT} ()
102- )
100+ preserve_sharing && return _tree_mapreduce (f_leaf, f_branch, op, tree, IdDict {N,RT} ())
103101 return _tree_mapreduce (f_leaf, f_branch, op, tree)
104102end
105- @memoize_on tree function _tree_mapreduce (
103+ function _tree_mapreduce (
104+ f_leaf:: F1 , f_branch:: F2 , op:: G , tree:: Node , id_map
105+ ) where {F1<: Function ,F2<: Function ,G<: Function }
106+ get! (id_map, tree) do
107+ if tree. degree == 0
108+ return @inline (f_leaf (tree))
109+ elseif tree. degree == 1
110+ l = _tree_mapreduce (f_leaf, f_branch, op, tree. l, id_map)
111+ return @inline (op (@inline (f_branch (tree)), l))
112+ else
113+ l = _tree_mapreduce (f_leaf, f_branch, op, tree. l, id_map)
114+ r = _tree_mapreduce (f_leaf, f_branch, op, tree. r, id_map)
115+ return @inline (op (@inline (f_branch (tree)), l, r))
116+ end
117+ end
118+ end
119+ function _tree_mapreduce (
106120 f_leaf:: F1 , f_branch:: F2 , op:: G , tree:: Node
107121) where {F1<: Function ,F2<: Function ,G<: Function }
108122 if tree. degree == 0
0 commit comments