@@ -156,18 +156,22 @@ defmodule Stream do
156
156
@ spec chunk ( Enumerable . t , non_neg_integer , non_neg_integer , Enumerable . t | nil ) :: Enumerable . t
157
157
def chunk ( enum , n , step , pad \\ nil ) when n > 0 and step > 0 do
158
158
limit = :erlang . max ( n , step )
159
- lazy enum , { [ ] , 0 } ,
160
- fn ( f1 ) -> R . chunk ( n , step , limit , f1 ) end ,
161
- fn ( f1 ) -> & do_chunk ( & 1 , n , pad , f1 ) end
159
+ if is_nil ( pad ) do
160
+ lazy enum , { [ ] , 0 } , fn ( f1 ) -> R . chunk ( n , step , limit , f1 ) end
161
+ else
162
+ lazy enum , { [ ] , 0 } ,
163
+ fn ( f1 ) -> R . chunk ( n , step , limit , f1 ) end ,
164
+ & do_chunk ( & 1 , n , pad , & 2 )
165
+ end
162
166
end
163
167
164
- defp do_chunk ( acc ( h , { buffer , count } = old , t ) = acc , n , pad , f1 ) do
165
- if is_nil ( pad ) || count == 0 do
166
- { :cont , acc }
167
- else
168
- buffer = :lists . reverse ( buffer ) ++ Enum . take ( pad , n - count )
169
- cont_with_acc ( f1 , buffer , h , old , t )
170
- end
168
+ defp do_chunk ( acc ( _ , { _ , 0 } , _ ) = acc , _ , _ , _ ) do
169
+ { :cont , acc }
170
+ end
171
+
172
+ defp do_chunk ( acc ( h , { buffer , count } = old , t ) , n , pad , f1 ) do
173
+ buffer = :lists . reverse ( buffer ) ++ Enum . take ( pad , n - count )
174
+ cont_with_acc ( f1 , buffer , h , old , t )
171
175
end
172
176
173
177
@ doc """
@@ -186,7 +190,7 @@ defmodule Stream do
186
190
def chunk_by ( enum , fun ) do
187
191
lazy enum , nil ,
188
192
fn ( f1 ) -> R . chunk_by ( fun , f1 ) end ,
189
- fn ( f1 ) -> & do_chunk_by ( & 1 , f1 ) end
193
+ & do_chunk_by ( & 1 , & 2 )
190
194
end
191
195
192
196
defp do_chunk_by ( acc ( _ , nil , _ ) = acc , _f1 ) do
@@ -1127,12 +1131,12 @@ defmodule Stream do
1127
1131
1128
1132
@ compile { :inline , lazy: 2 , lazy: 3 , lazy: 4 }
1129
1133
1130
- defp lazy ( % Stream { funs: funs } = lazy , fun ) ,
1134
+ defp lazy ( % Stream { done: nil , funs: funs } = lazy , fun ) ,
1131
1135
do: % { lazy | funs: [ fun | funs ] }
1132
1136
defp lazy ( enum , fun ) ,
1133
1137
do: % Stream { enum: enum , funs: [ fun ] }
1134
1138
1135
- defp lazy ( % Stream { funs: funs , accs: accs } = lazy , acc , fun ) ,
1139
+ defp lazy ( % Stream { done: nil , funs: funs , accs: accs } = lazy , acc , fun ) ,
1136
1140
do: % { lazy | funs: [ fun | funs ] , accs: [ acc | accs ] }
1137
1141
defp lazy ( enum , acc , fun ) ,
1138
1142
do: % Stream { enum: enum , funs: [ fun ] , accs: [ acc ] }
@@ -1171,19 +1175,20 @@ defimpl Enumerable, for: Stream do
1171
1175
case reduce . ( { command , [ acc | accs ] } ) do
1172
1176
{ :suspended , [ acc | accs ] , continuation } ->
1173
1177
{ :suspended , acc , & do_each ( continuation , done , accs , & 1 ) }
1174
- { :halted , [ acc | _ ] } ->
1175
- { :halted , acc }
1176
- { :done , [ acc | _ ] = accs } ->
1177
- case done do
1178
- nil ->
1179
- { :done , acc }
1180
- { done , fun } ->
1181
- case done . ( fun ) . ( accs ) do
1182
- { :cont , [ acc | _ ] } -> { :done , acc }
1183
- { :halt , [ acc | _ ] } -> { :halted , acc }
1184
- { :suspend , [ acc | _ ] } -> { :suspended , acc , & ( { :done , elem ( & 1 , 1 ) } ) }
1185
- end
1186
- end
1178
+ { :halted , accs } ->
1179
+ do_done { :halted , accs } , done
1180
+ { :done , accs } ->
1181
+ do_done { :done , accs } , done
1182
+ end
1183
+ end
1184
+
1185
+ defp do_done ( { reason , [ acc | _ ] } , nil ) , do: { reason , acc }
1186
+ defp do_done ( { reason , [ acc | t ] } , { done , fun } ) do
1187
+ [ h | _ ] = Enum . reverse ( t )
1188
+ case done . ( [ acc , h ] , fun ) do
1189
+ { :cont , [ acc | _ ] } -> { reason , acc }
1190
+ { :halt , [ acc | _ ] } -> { :halted , acc }
1191
+ { :suspend , [ acc | _ ] } -> { :suspended , acc , & ( { :done , elem ( & 1 , 1 ) } ) }
1187
1192
end
1188
1193
end
1189
1194
end
0 commit comments