@@ -86,11 +86,6 @@ defmodule Enum do
86
86
Counts for how many items the function returns true.
87
87
"""
88
88
@ spec count ( t , ( element -> as_boolean ( term ) ) ) :: non_neg_integer
89
- def count ( collection , fun ) when is_list ( collection ) do
90
- folder = fn ( x , acc ) -> if fun . ( x ) , do: acc + 1 , else: acc end
91
- :lists . foldl ( folder , 0 , collection )
92
- end
93
-
94
89
def count ( collection , fun ) do
95
90
I . reduce ( collection , 0 , fn ( entry , acc ) ->
96
91
if fun . ( entry ) , do: acc + 1 , else: acc
@@ -129,10 +124,9 @@ defmodule Enum do
129
124
end
130
125
131
126
def all? ( collection , fun ) do
132
- I . reduce ( collection , nil , fn ( entry , _ ) ->
133
- if fun . ( entry ) , do: nil , else: throw ( :enum_all? )
127
+ I . reduce ( collection , true , fn ( entry , _ ) ->
128
+ if fun . ( entry ) , do: true , else: throw ( :enum_all? )
134
129
end )
135
- true
136
130
catch
137
131
:enum_all? -> false
138
132
end
@@ -168,10 +162,9 @@ defmodule Enum do
168
162
end
169
163
170
164
def any? ( collection , fun ) do
171
- I . reduce ( collection , nil , fn ( entry , _ ) ->
172
- if fun . ( entry ) , do: throw ( :enum_any? ) , else: nil
165
+ I . reduce ( collection , false , fn ( entry , _ ) ->
166
+ if fun . ( entry ) , do: throw ( :enum_any? ) , else: false
173
167
end )
174
- false
175
168
catch
176
169
:enum_any? -> true
177
170
end
@@ -224,12 +217,9 @@ defmodule Enum do
224
217
end
225
218
226
219
def drop ( collection , count ) when count >= 0 do
227
- { list , _ } = I . reduce ( collection , { [ ] , count } , fn ( entry , { list , count } ) ->
228
- if count > 0 do
229
- { [ ] , count - 1 }
230
- else
231
- { [ entry | list ] , count }
232
- end
220
+ { list , _ } = I . reduce ( collection , { [ ] , count } , fn
221
+ _ , { _ , count } when count > 0 -> { [ ] , count - 1 }
222
+ entry , { list , count } -> { [ entry | list ] , count }
233
223
end )
234
224
:lists . reverse ( list )
235
225
end
@@ -254,8 +244,9 @@ defmodule Enum do
254
244
end
255
245
256
246
def drop_while ( collection , fun ) do
257
- I . reduce ( collection , [ ] , fn ( entry , acc ) ->
258
- if fun . ( entry ) , do: [ ] , else: [ entry | acc ]
247
+ I . reduce ( collection , [ ] , fn
248
+ entry , [ ] -> if fun . ( entry ) , do: [ ] , else: [ entry ]
249
+ entry , acc -> [ entry | acc ]
259
250
end ) |> :lists . reverse
260
251
end
261
252
@@ -314,8 +305,7 @@ defmodule Enum do
314
305
end
315
306
316
307
def empty? ( collection ) do
317
- I . reduce ( collection , nil , fn ( _ , _ ) -> throw ( :enum_empty? ) end )
318
- true
308
+ I . reduce ( collection , true , fn ( _ , _ ) -> throw ( :enum_empty? ) end )
319
309
catch
320
310
:enum_empty? -> false
321
311
end
@@ -451,10 +441,9 @@ defmodule Enum do
451
441
end
452
442
453
443
def find ( collection , ifnone , fun ) do
454
- I . reduce ( collection , nil , fn ( entry , _ ) ->
444
+ I . reduce ( collection , ifnone , fn ( entry , _ ) ->
455
445
if fun . ( entry ) , do: throw ( { :enum_find , entry } )
456
446
end )
457
- ifnone
458
447
catch
459
448
{ :enum_find , entry } -> entry
460
449
end
@@ -482,11 +471,10 @@ defmodule Enum do
482
471
end
483
472
484
473
def find_value ( collection , ifnone , fun ) do
485
- I . reduce ( collection , nil , fn ( entry , _ ) ->
474
+ I . reduce ( collection , ifnone , fn ( entry , _ ) ->
486
475
fun_entry = fun . ( entry )
487
476
if fun_entry , do: throw ( { :enum_find , fun_entry } )
488
477
end )
489
- ifnone
490
478
catch
491
479
{ :enum_find , entry } -> entry
492
480
end
@@ -571,13 +559,9 @@ defmodule Enum do
571
559
:unicode . characters_to_list join ( collection , :unicode . characters_to_binary ( joiner ) )
572
560
end
573
561
574
- def join ( collection , joiner ) when is_list ( collection ) and is_binary ( joiner ) do
575
- do_join ( collection , joiner , nil )
576
- end
577
-
578
562
def join ( collection , joiner ) when is_binary ( joiner ) do
579
- I . reduce ( collection , nil , fn
580
- entry , nil -> to_binary ( entry )
563
+ I . reduce ( collection , "" , fn
564
+ entry , "" -> to_binary ( entry )
581
565
entry , acc -> acc <> joiner <> to_binary ( entry )
582
566
end )
583
567
end
@@ -642,16 +626,12 @@ defmodule Enum do
642
626
def map_join ( collection , joiner // "" , mapper )
643
627
644
628
def map_join ( collection , joiner , mapper ) when is_list ( joiner ) do
645
- binary_to_list map_join ( collection , list_to_binary ( joiner ) , mapper )
646
- end
647
-
648
- def map_join ( collection , joiner , mapper ) when is_list ( collection ) and is_binary ( joiner ) do
649
- do_map_join ( collection , mapper , joiner , nil )
629
+ :unicode . characters_to_list map_join ( collection , :unicode . characters_to_binary ( joiner ) , mapper )
650
630
end
651
631
652
632
def map_join ( collection , joiner , mapper ) when is_binary ( joiner ) do
653
- I . reduce ( collection , nil , fn
654
- entry , nil -> to_binary ( mapper . ( entry ) )
633
+ I . reduce ( collection , "" , fn
634
+ entry , "" -> to_binary ( mapper . ( entry ) )
655
635
entry , acc -> acc <> joiner <> to_binary ( mapper . ( entry ) )
656
636
end )
657
637
end
@@ -672,10 +652,6 @@ defmodule Enum do
672
652
673
653
"""
674
654
@ spec map_reduce ( t , any , ( element , any -> any ) ) :: any
675
- def map_reduce ( collection , acc , f ) when is_list ( collection ) do
676
- :lists . mapfoldl ( f , acc , collection )
677
- end
678
-
679
655
def map_reduce ( collection , acc , fun ) do
680
656
{ list , acc } = I . reduce ( collection , { [ ] , acc } , fn ( entry , { list , acc } ) ->
681
657
{ new_entry , acc } = fun . ( entry , acc )
@@ -696,10 +672,6 @@ defmodule Enum do
696
672
697
673
"""
698
674
@ spec partition ( t , ( element -> any ) ) :: { list , list }
699
- def partition ( collection , fun ) when is_list ( collection ) do
700
- do_partition ( collection , fun , [ ] , [ ] )
701
- end
702
-
703
675
def partition ( collection , fun ) do
704
676
{ acc1 , acc2 } = I . reduce ( collection , { [ ] , [ ] } , fn ( entry , { acc1 , acc2 } ) ->
705
677
if fun . ( entry ) do
@@ -724,10 +696,6 @@ defmodule Enum do
724
696
725
697
"""
726
698
@ spec reduce ( t , any , ( element , any -> any ) ) :: any
727
- def reduce ( collection , acc , fun ) when is_list ( collection ) do
728
- :lists . foldl ( fun , acc , collection )
729
- end
730
-
731
699
def reduce ( collection , acc , fun ) do
732
700
I . reduce ( collection , acc , fun )
733
701
end
@@ -852,17 +820,12 @@ defmodule Enum do
852
820
end
853
821
854
822
def split_while ( collection , fun ) do
855
- { _ , list1 , list2 } =
856
- I . reduce ( collection , { false , [ ] , [ ] } , fn ( entry , { split , acc1 , acc2 } ) ->
857
- cond do
858
- split ->
859
- { true , acc1 , [ entry | acc2 ] }
860
- fun . ( entry ) ->
861
- { false , [ entry | acc1 ] , acc2 }
862
- true ->
863
- { true , acc1 , [ entry | acc2 ] }
864
- end
865
- end )
823
+ { list1 , list2 } = I . reduce ( collection , { [ ] , [ ] } , fn
824
+ entry , { acc1 , [ ] } ->
825
+ if fun . ( entry ) , do: { [ entry | acc1 ] , [ ] } , else: { acc1 , [ entry ] }
826
+ entry , { acc1 , acc2 } ->
827
+ { acc1 , [ entry | acc2 ] }
828
+ end )
866
829
867
830
{ :lists . reverse ( list1 ) , :lists . reverse ( list2 ) }
868
831
end
@@ -1024,9 +987,14 @@ defmodule Enum do
1024
987
1025
988
"""
1026
989
@ spec max ( t ) :: element | no_return
1027
- def max ( collection ) when is_list ( collection ) do
1028
- if collection == [ ] , do: raise Enum.EmptyError
1029
- :lists . max ( collection )
990
+ def max ( [ h | t ] ) do
991
+ I . reduce ( t , h , fn ( entry , max ) ->
992
+ if entry > max , do: entry , else: max
993
+ end )
994
+ end
995
+
996
+ def max ( [ ] ) do
997
+ raise Enum.EmptyError
1030
998
end
1031
999
1032
1000
def max ( collection ) do
@@ -1038,7 +1006,7 @@ defmodule Enum do
1038
1006
end )
1039
1007
1040
1008
case result do
1041
- :first -> raise Enum.EmptyError
1009
+ :first -> raise Enum.EmptyError
1042
1010
{ :reduce , max } -> max
1043
1011
end
1044
1012
end
@@ -1055,8 +1023,17 @@ defmodule Enum do
1055
1023
1056
1024
"""
1057
1025
@ spec max ( t , ( element -> any ) ) :: element | no_return
1058
- def max ( collection , fun ) when is_list ( collection ) do
1059
- do_max_first ( collection , fun )
1026
+ def max ( [ h | t ] , fun ) do
1027
+ { max , _ } = I . reduce ( t , { h , fun . ( h ) } , fn ( entry , { _ , fun_max } = old ) ->
1028
+ fun_entry = fun . ( entry )
1029
+ if fun_entry > fun_max , do: { entry , fun_entry } , else: old
1030
+ end )
1031
+
1032
+ max
1033
+ end
1034
+
1035
+ def max ( [ ] , _fun ) do
1036
+ raise Enum.EmptyError
1060
1037
end
1061
1038
1062
1039
def max ( collection , fun ) do
@@ -1085,6 +1062,16 @@ defmodule Enum do
1085
1062
1086
1063
"""
1087
1064
@ spec min ( t ) :: element | no_return
1065
+ def min ( [ h | t ] ) do
1066
+ I . reduce ( t , h , fn ( entry , min ) ->
1067
+ if entry < min , do: entry , else: min
1068
+ end )
1069
+ end
1070
+
1071
+ def min ( [ ] ) do
1072
+ raise Enum.EmptyError
1073
+ end
1074
+
1088
1075
def min ( collection ) when is_list ( collection ) do
1089
1076
if collection == [ ] , do: raise Enum.EmptyError
1090
1077
:lists . min ( collection )
@@ -1115,8 +1102,17 @@ defmodule Enum do
1115
1102
1116
1103
"""
1117
1104
@ spec min ( t , ( element -> any ) ) :: element | no_return
1118
- def min ( collection , fun ) when is_list ( collection ) do
1119
- do_min_first ( collection , fun )
1105
+ def min ( [ h | t ] , fun ) do
1106
+ { min , _ } = I . reduce ( t , { h , fun . ( h ) } , fn ( entry , { _ , fun_min } = old ) ->
1107
+ fun_entry = fun . ( entry )
1108
+ if fun_entry < fun_min , do: { entry , fun_entry } , else: old
1109
+ end )
1110
+
1111
+ min
1112
+ end
1113
+
1114
+ def min ( [ ] , _fun ) do
1115
+ raise Enum.EmptyError
1120
1116
end
1121
1117
1122
1118
def min ( collection , fun ) do
@@ -1252,50 +1248,6 @@ defmodule Enum do
1252
1248
ifnone
1253
1249
end
1254
1250
1255
- ## join
1256
-
1257
- defp do_join ( [ h | t ] , joiner , nil ) do
1258
- do_join ( t , joiner , to_binary ( h ) )
1259
- end
1260
-
1261
- defp do_join ( [ h | t ] , joiner , acc ) do
1262
- acc = acc <> joiner <> to_binary ( h )
1263
- do_join ( t , joiner , acc )
1264
- end
1265
-
1266
- defp do_join ( [ ] , _joiner , acc ) do
1267
- acc || ""
1268
- end
1269
-
1270
- ## map join
1271
-
1272
- defp do_map_join ( [ h | t ] , mapper , joiner , nil ) do
1273
- do_map_join ( t , mapper , joiner , to_binary ( mapper . ( h ) ) )
1274
- end
1275
-
1276
- defp do_map_join ( [ h | t ] , mapper , joiner , acc ) do
1277
- acc = acc <> joiner <> to_binary ( mapper . ( h ) )
1278
- do_map_join ( t , mapper , joiner , acc )
1279
- end
1280
-
1281
- defp do_map_join ( [ ] , _mapper , _joiner , acc ) do
1282
- acc || ""
1283
- end
1284
-
1285
- ## partition
1286
-
1287
- defp do_partition ( [ h | t ] , fun , acc1 , acc2 ) do
1288
- if fun . ( h ) do
1289
- do_partition ( t , fun , [ h | acc1 ] , acc2 )
1290
- else
1291
- do_partition ( t , fun , acc1 , [ h | acc2 ] )
1292
- end
1293
- end
1294
-
1295
- defp do_partition ( [ ] , _ , acc1 , acc2 ) do
1296
- { :lists . reverse ( acc1 ) , :lists . reverse ( acc2 ) }
1297
- end
1298
-
1299
1251
## sort
1300
1252
1301
1253
defp sort_reducer ( entry , { :split , y , x , r , rs , bool } , fun ) do
@@ -1485,52 +1437,6 @@ defmodule Enum do
1485
1437
1486
1438
defp do_zip_next ( [ h | t ] ) , do: { h , t }
1487
1439
defp do_zip_next ( [ ] ) , do: { nil , [ ] }
1488
-
1489
- ## max
1490
-
1491
- defp do_max_first ( [ ] , _ ) do
1492
- raise Enum.EmptyError
1493
- end
1494
-
1495
- defp do_max_first ( [ h | t ] , fun ) do
1496
- do_max ( t , fun , h , fun . ( h ) )
1497
- end
1498
-
1499
- defp do_max ( [ ] , _ , acc , _ ) do
1500
- acc
1501
- end
1502
-
1503
- defp do_max ( [ h | t ] , fun , acc , applied_acc ) do
1504
- applied = fun . ( h )
1505
- if applied > applied_acc do
1506
- do_max ( t , fun , h , applied )
1507
- else
1508
- do_max ( t , fun , acc , applied_acc )
1509
- end
1510
- end
1511
-
1512
- ## min
1513
-
1514
- defp do_min_first ( [ ] , _ ) do
1515
- raise Enum.EmptyError
1516
- end
1517
-
1518
- defp do_min_first ( [ h | t ] , fun ) do
1519
- do_min ( t , fun , h , fun . ( h ) )
1520
- end
1521
-
1522
- defp do_min ( [ ] , _ , acc , _ ) do
1523
- acc
1524
- end
1525
-
1526
- defp do_min ( [ h | t ] , fun , acc , applied_acc ) do
1527
- applied = fun . ( h )
1528
- if applied < applied_acc do
1529
- do_min ( t , fun , h , applied )
1530
- else
1531
- do_min ( t , fun , acc , applied_acc )
1532
- end
1533
- end
1534
1440
end
1535
1441
1536
1442
defimpl Enum.Iterator , for: List do
0 commit comments