|
41 | 41 | keyfind/3,
|
42 | 42 | keymember/3,
|
43 | 43 | keyreplace/4,
|
| 44 | + keystore/4, |
44 | 45 | keytake/3,
|
45 | 46 | foldl/3,
|
46 | 47 | foldr/3,
|
@@ -280,31 +281,48 @@ keymember(K, I, [_H | T]) ->
|
280 | 281 | %% @end
|
281 | 282 | %%-----------------------------------------------------------------------------
|
282 | 283 | -spec keyreplace(
|
283 |
| - K :: term(), |
284 |
| - I :: pos_integer(), |
285 |
| - L :: list(tuple()), |
286 |
| - NewTuple :: {NewKey :: term(), Val :: term()} |
287 |
| -) -> boolean(). |
288 |
| -keyreplace(K, I, L, NewTuple) -> |
289 |
| - keyreplace(K, I, L, L, NewTuple, []). |
| 284 | + Key :: term(), |
| 285 | + N :: pos_integer(), |
| 286 | + TupleList :: [tuple()], |
| 287 | + NewTuple :: tuple() |
| 288 | +) -> [tuple()]. |
| 289 | +keyreplace(Key, N, TupleList, NewTuple) when is_tuple(NewTuple) -> |
| 290 | + case keyreplace(Key, N, TupleList, TupleList, NewTuple, []) of |
| 291 | + {false, _Reversed} -> TupleList; |
| 292 | + {value, Updated} -> Updated |
| 293 | + end. |
290 | 294 |
|
291 | 295 | %% @private
|
292 |
| -keyreplace(_K, _I, [], OrigL, _NewTuple, _NewList) -> |
293 |
| - OrigL; |
294 |
| -keyreplace(K, I, [H | T], L, NewTuple, NewList) when is_tuple(H) andalso is_tuple(NewTuple) -> |
295 |
| - case I =< tuple_size(H) of |
296 |
| - true -> |
297 |
| - case element(I, H) of |
298 |
| - K -> |
299 |
| - ?MODULE:reverse(NewList, [NewTuple | T]); |
300 |
| - _ -> |
301 |
| - keyreplace(K, I, T, L, NewTuple, [H | NewList]) |
302 |
| - end; |
303 |
| - false -> |
304 |
| - keyreplace(K, I, T, L, NewTuple, [H | NewList]) |
305 |
| - end; |
306 |
| -keyreplace(K, I, [H | T], L, NewTuple, NewList) -> |
307 |
| - keyreplace(K, I, T, L, NewTuple, [H | NewList]). |
| 296 | +keyreplace(_Key, _N, [], _OrigL, _NewTuple, Acc) -> |
| 297 | + {false, Acc}; |
| 298 | +keyreplace(Key, N, [H | Tail], _OrigL, NewTuple, Acc) when element(N, H) =:= Key -> |
| 299 | + {value, ?MODULE:reverse(Acc, [NewTuple | Tail])}; |
| 300 | +keyreplace(Key, N, [H | Tail], OrigL, NewTuple, Acc) -> |
| 301 | + keyreplace(Key, N, Tail, OrigL, NewTuple, [H | Acc]). |
| 302 | + |
| 303 | +%%----------------------------------------------------------------------------- |
| 304 | +%% @param Key the key to match |
| 305 | +%% @param N the position in the tuple to compare (1..tuple_size) |
| 306 | +%% @param TupleList the list of tuples from which to find the element |
| 307 | +%% @param NewTuple the tuple to add to the list |
| 308 | +%% @returns An updated TupleList where the first occurrence of `Key' has been |
| 309 | +%% replaced with `NewTuple'. |
| 310 | +%% @doc Searches the list of tuples `TupleList' for a tuple whose `N'th |
| 311 | +%% element compares equal to `Key', replaces it with `NewTuple' if |
| 312 | +%% found. If not found, append `NewTuple' to `TupleList'. |
| 313 | +%% @end |
| 314 | +%%----------------------------------------------------------------------------- |
| 315 | +-spec keystore( |
| 316 | + Key :: term(), |
| 317 | + N :: pos_integer(), |
| 318 | + TupleList :: [tuple()], |
| 319 | + NewTuple :: tuple() |
| 320 | +) -> [tuple()]. |
| 321 | +keystore(Key, N, TupleList, NewTuple) when is_tuple(NewTuple) -> |
| 322 | + case keyreplace(Key, N, TupleList, TupleList, NewTuple, []) of |
| 323 | + {false, Reversed} -> ?MODULE:reverse(Reversed, [NewTuple]); |
| 324 | + {value, Updated} -> Updated |
| 325 | + end. |
308 | 326 |
|
309 | 327 | %%-----------------------------------------------------------------------------
|
310 | 328 | %% @param Key the key to match
|
|
0 commit comments