@@ -24,6 +24,7 @@ defmodule Keyword do
24
24
in `Enum` and `List` can also be applied.
25
25
"""
26
26
27
+ @ compile :inline_list_funcs
27
28
@ behaviour Dict
28
29
29
30
@ type key :: atom
@@ -174,7 +175,12 @@ defmodule Keyword do
174
175
"""
175
176
@ spec get_values ( t , key ) :: [ value ]
176
177
def get_values ( keywords , key ) when is_list ( keywords ) and is_atom ( key ) do
177
- for { k , v } <- keywords , key == k , do: v
178
+ fun = fn
179
+ { k , v } when k === key -> { true , v }
180
+ { _ , _ } -> false
181
+ end
182
+
183
+ :lists . filtermap ( fun , keywords )
178
184
end
179
185
180
186
@ doc """
@@ -192,7 +198,7 @@ defmodule Keyword do
192
198
"""
193
199
@ spec keys ( t ) :: [ key ]
194
200
def keys ( keywords ) when is_list ( keywords ) do
195
- for { key , _ } <- keywords , do: key
201
+ :lists . map ( fn { k , _ } -> k end , keywords )
196
202
end
197
203
198
204
@ doc """
@@ -206,11 +212,11 @@ defmodule Keyword do
206
212
"""
207
213
@ spec values ( t ) :: [ value ]
208
214
def values ( keywords ) when is_list ( keywords ) do
209
- for { _ , value } <- keywords , do: value
215
+ :lists . map ( fn { _ , v } -> v end , keywords )
210
216
end
211
217
212
218
@ doc """
213
- Deletes the entry in the keyword list for a `key` with `value`.
219
+ Deletes the entries in the keyword list for a `key` with `value`.
214
220
If no `key` with `value` exists, returns the keyword list unchanged.
215
221
216
222
## Examples
@@ -227,11 +233,11 @@ defmodule Keyword do
227
233
"""
228
234
@ spec delete ( t , key , value ) :: t
229
235
def delete ( keywords , key , value ) when is_list ( keywords ) and is_atom ( key ) do
230
- for { k , v } = tuple <- keywords , key != k or value != v , do: tuple
236
+ :lists . filter ( fn { k , v } -> k != key or v != value end , keywords )
231
237
end
232
238
233
239
@ doc """
234
- Deletes all entries in the keyword list for a specific `key`.
240
+ Deletes the entries in the keyword list for a specific `key`.
235
241
If the `key` does not exist, returns the keyword list unchanged.
236
242
Use `delete_first` to delete just the first entry in case of
237
243
duplicated keys.
@@ -250,7 +256,7 @@ defmodule Keyword do
250
256
"""
251
257
@ spec delete ( t , key ) :: t
252
258
def delete ( keywords , key ) when is_list ( keywords ) and is_atom ( key ) do
253
- for { k , _ } = tuple <- keywords , key != k , do: tuple
259
+ :lists . filter ( fn { k , _ } -> k != key end , keywords )
254
260
end
255
261
256
262
@ doc """
@@ -339,7 +345,8 @@ defmodule Keyword do
339
345
"""
340
346
@ spec merge ( t , t ) :: t
341
347
def merge ( d1 , d2 ) when is_list ( d1 ) and is_list ( d2 ) do
342
- d2 ++ for ( { k , _ } = tuple <- d1 , not has_key? ( d2 , k ) , do: tuple )
348
+ fun = fn { k , _v } -> not has_key? ( d2 , k ) end
349
+ d2 ++ :lists . filter ( fun , d1 )
343
350
end
344
351
345
352
@ doc """
@@ -467,16 +474,16 @@ defmodule Keyword do
467
474
468
475
"""
469
476
def split ( keywords , keys ) when is_list ( keywords ) do
470
- acc = { [ ] , [ ] }
471
-
472
- { take , drop } = Enum . reduce keywords , acc , fn ( { k , v } , { take , drop } ) ->
477
+ fun = fn { k , v } , { take , drop } ->
473
478
case k in keys do
474
479
true -> { [ { k , v } | take ] , drop }
475
480
false -> { take , [ { k , v } | drop ] }
476
481
end
477
482
end
478
483
479
- { Enum . reverse ( take ) , Enum . reverse ( drop ) }
484
+ acc = { [ ] , [ ] }
485
+ { take , drop } = :lists . foldl ( fun , acc , keywords )
486
+ { :lists . reverse ( take ) , :lists . reverse ( drop ) }
480
487
end
481
488
482
489
@ doc """
@@ -497,7 +504,7 @@ defmodule Keyword do
497
504
498
505
"""
499
506
def take ( keywords , keys ) when is_list ( keywords ) do
500
- for { k , _ } = tuple <- keywords , k in keys , do: tuple
507
+ :lists . filter ( fn { k , _ } -> k in keys end , keywords )
501
508
end
502
509
503
510
@ doc """
@@ -517,7 +524,7 @@ defmodule Keyword do
517
524
518
525
"""
519
526
def drop ( keywords , keys ) when is_list ( keywords ) do
520
- for { k , _ } = tuple <- keywords , not k in keys , do: tuple
527
+ :lists . filter ( fn { k , _ } -> not k in keys end , keywords )
521
528
end
522
529
523
530
@ doc """
0 commit comments