@@ -97,35 +97,35 @@ defmodule Stream do
97
97
98
98
defimpl Enumerable , for: Lazy do
99
99
def reduce ( Lazy [ ] = lazy , acc , fun ) do
100
- do_reduce ( lazy , acc , fun )
100
+ do_reduce ( lazy , acc , fun , 0 )
101
101
end
102
102
103
103
def count ( Lazy [ ] = lazy ) do
104
- do_reduce ( lazy , 0 , fn _ , acc -> acc + 1 end )
104
+ do_reduce ( lazy , 0 , fn _ , acc -> acc + 1 end , 0 )
105
105
end
106
106
107
107
def member? ( Lazy [ ] = lazy , value ) do
108
108
do_reduce ( lazy , false , fn ( entry , _ ) ->
109
109
if entry === value , do: throw ( { :stream_lazy , true } ) , else: false
110
- end )
110
+ end , 0 )
111
111
end
112
112
113
- defp do_reduce ( Lazy [ enumerable : enumerable , fun: f1 , acc: nil ] , acc , fun ) do
114
- do_reduce ( enumerable , acc , f1 . ( fun ) )
113
+ defp do_reduce ( Lazy [ enumerable : enumerable , fun: f1 , acc: nil ] , acc , fun , nesting ) do
114
+ do_reduce ( enumerable , acc , f1 . ( fun ) , nesting )
115
115
end
116
116
117
- defp do_reduce ( Lazy [ enumerable : enumerable , fun: f1 , acc: side ] , acc , fun ) do
118
- case do_reduce ( enumerable , { acc , side } , f1 . ( fun ) ) do
119
- { acc , _ } -> acc
120
- acc -> acc
121
- end
117
+ defp do_reduce ( Lazy [ enumerable : enumerable , fun: f1 , acc: side ] , acc , fun , nesting ) do
118
+ do_reduce ( enumerable , { acc , side } , f1 . ( fun ) , nesting + 1 )
122
119
end
123
120
124
- defp do_reduce ( enumerable , acc , fun ) do
125
- Enumerable . reduce ( enumerable , acc , fun )
121
+ defp do_reduce ( enumerable , acc , fun , nesting ) do
122
+ Enumerable . reduce ( enumerable , acc , fun ) |> remove_nesting ( nesting )
126
123
catch
127
- { :stream_lazy , acc } -> acc
124
+ { :stream_lazy , res } -> res
128
125
end
126
+
127
+ defp remove_nesting ( acc , 0 ) , do: acc
128
+ defp remove_nesting ( acc , nesting ) , do: remove_nesting ( elem ( acc , 0 ) , nesting - 1 )
129
129
end
130
130
131
131
@ type t :: Lazy . t | ( acc , ( element , acc -> acc ) -> acc )
@@ -394,8 +394,8 @@ defmodule Stream do
394
394
Lazy [ enumerable : enumerable ,
395
395
fun: fn ( f1 ) ->
396
396
fn ( entry , { acc , n } ) ->
397
- acc = { f1 . ( entry , acc ) , n - 1 }
398
- if n > 1 , do: acc , else: throw { :stream_lazy , acc }
397
+ res = f1 . ( entry , acc )
398
+ if n > 1 , do: { res , n - 1 } , else: throw { :stream_lazy , res }
399
399
end
400
400
end ,
401
401
acc: n ]
@@ -420,7 +420,7 @@ defmodule Stream do
420
420
if f . ( entry ) do
421
421
{ f1 . ( entry , acc ) , true }
422
422
else
423
- throw { :stream_lazy , { acc , false } }
423
+ throw { :stream_lazy , acc }
424
424
end
425
425
end
426
426
end ,
0 commit comments