4
%% Copyright Ericsson AB 1998-2010. All Rights Reserved.
6
%% The contents of this file are subject to the Erlang Public License,
7
%% Version 1.1, (the "License"); you may not use this file except in
8
%% compliance with the License. You should have received a copy of the
9
%% Erlang Public License along with this software. If not, it can be
10
%% retrieved online at http://www.erlang.org/.
12
%% Software distributed under the License is distributed on an "AS IS"
13
%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
14
%% the License for the specific language governing rights and limitations
21
%% Purpose : Basic lists processing functions.
26
-export([member/2, append/2, append/1, subtract/2, reverse/1, reverse/2,
27
nth/2, nthtail/2, prefix/2, suffix/2, last/1,
28
seq/2, seq/3, sum/1, duplicate/2, min/1, max/1, sublist/2, sublist/3,
29
delete/2, sort/1, merge/2, concat/1,
30
flatten/1, flatten/2, flat_length/1, flatlength/1,
31
keymember/3, keysearch/3, keydelete/3, keyreplace/4,
32
keysort/2, keymerge/3, keymap/3, keymap/4]).
34
-export([all/2,any/2,map/2,flatmap/2,foldl/3,foldr/3,filter/2,zf/2,
35
mapfoldl/3,mapfoldr/3,foreach/2,takewhile/2,dropwhile/2,splitwith/2]).
36
-export([all/3,any/3,map/3,flatmap/3,foldl/4,foldr/4,filter/3,zf/3,
37
mapfoldl/4,mapfoldr/4,foreach/3]).
39
%% member(X, L) -> (true | false)
40
%% test if X is a member of the list L
42
member(X, [X|_]) -> true;
45
member(X, []) -> false.
47
%% append(X, Y) appends lists X and Y
49
append(L1, L2) -> L1 ++ L2.
51
%% append(L) appends the list of lists L
54
append([H|T]) -> H ++ append(T);
57
%% subtract(List1, List2) subtract elements in List2 form List1.
59
subtract(L1, L2) -> L1 -- L2.
61
%% reverse(L) reverse all elements in the list L
63
reverse(X) -> reverse(X, []).
69
%% nth(N, L) returns the N`th element of the list L
70
%% nthtail(N, L) returns the N`th tail of the list L
73
nth(N, [_|T]) when N > 1 ->
76
nthtail(1, [H|T]) -> T;
77
nthtail(N, [H|T]) when N > 1 ->
79
nthtail(0, L) when list(L) -> L.
81
%% prefix(Prefix, List) -> (true | false)
83
prefix([X|PreTail], [X|Tail]) ->
84
prefix(PreTail, Tail);
85
prefix([], List) -> true;
89
%% suffix(Suffix, List) -> (true | false)
91
suffix(Suffix, Suffix) -> true;
92
suffix(Suffix, [_|Tail]) ->
94
suffix(Suffix, []) -> false.
96
%% last(List) returns the last element in a list.
102
%% seq(Min, Max) -> [Min,Min+1, ..., Max]
103
%% seq(Min, Max, Incr) -> [Min,Min+Incr, ..., Max]
104
%% returns the sequence Min..Max
105
%% Min <= Max and Min and Max must be integers
107
seq(Min, Max) when integer(Min), integer(Max), Min =< Max ->
108
seq(Min, Max, 1, []).
110
seq(Min, Max, Incr) ->
111
seq(Min, Min + ((Max-Min) div Incr) * Incr, Incr, []).
113
seq(Min, Min, I, L) -> [Min|L];
114
seq(Min, Max, I, L) -> seq(Min, Max-I, I, [Max|L]).
116
%% sum(L) suns the sum of the elements in L
119
sum([H|T], Sum) -> sum(T, Sum + H);
122
%% duplicate(N, X) -> [X,X,X,.....,X] (N times)
123
%% return N copies of X
125
duplicate(N, X) when integer(N), N >= 0 -> duplicate(N, X, []).
127
duplicate(0, _, L) -> L;
128
duplicate(N, X, L) -> duplicate(N-1, X, [X|L]).
131
%% min(L) -> returns the minimum element of the list L
133
min([H|T]) -> min(T, H).
135
min([H|T], Min) when H < Min -> min(T, H);
136
min([_|T], Min) -> min(T, Min);
139
%% max(L) -> returns the maximum element of the list L
141
max([H|T]) -> max(T, H).
143
max([H|T], Max) when H > Max -> max(T, H);
144
max([_|T], Max) -> max(T, Max);
147
%% sublist(List, Start, Length)
148
%% Returns the sub-list starting at Start of length Length.
150
sublist(List, S, L) when L >= 0 ->
151
sublist(nthtail(S-1, List), L).
153
sublist([H|T], L) when L > 0 ->
155
sublist(List, L) -> [].
157
%% delete(Item, List) -> List'
158
%% Delete the first occurance of Item from the list L.
160
delete(Item, [Item|Rest]) -> Rest;
161
delete(Item, [H|Rest]) ->
162
[H|delete(Item, Rest)];
163
delete(Item, []) -> [].
165
%% sort(L) -> sorts the list L
169
sort(X) -> split_and_sort(X, [], []).
171
split_and_sort([A,B|T], X, Y) ->
172
split_and_sort(T, [A|X], [B|Y]);
173
split_and_sort([H], X, Y) ->
174
split_and_sort([], [H|X], Y);
175
split_and_sort([], X, Y) ->
176
merge(sort(X), sort(Y), []).
179
%% merges two sorted lists X and Y
181
merge(X, Y) -> merge(X, Y, []).
183
merge([H1|T1], [H2|T2], L) when H1 < H2 ->
184
merge(T1, [H2|T2], [H1|L]);
185
merge(T1, [H2|T2], L) ->
186
merge(T1, T2, [H2|L]);
187
merge([H|T], T2, L) ->
192
%% concat(L) concatinate the list representation of the elements
193
%% in L - the elements in L can be atoms, integers of strings.
194
%% Returns a list of characters.
197
flatmap(fun thing_to_list/1, List).
199
thing_to_list(X) when integer(X) -> integer_to_list(X);
200
thing_to_list(X) when float(X) -> float_to_list(X);
201
thing_to_list(X) when atom(X) -> atom_to_list(X);
202
thing_to_list(X) when list(X) -> X. %Assumed to be a string
205
%% flatten(List, Tail)
206
%% Flatten a list, adding optional tail.
209
flatten(List, [], []).
211
flatten(List, Tail) ->
212
flatten(List, [], Tail).
214
flatten([H|T], Cont, Tail) when list(H) ->
215
flatten(H, [T|Cont], Tail);
216
flatten([H|T], Cont, Tail) ->
217
[H|flatten(T, Cont, Tail)];
218
flatten([], [H|Cont], Tail) ->
219
flatten(H, Cont, Tail);
220
flatten([], [], Tail) ->
223
%% flat_length(List) (undocumented can be rmove later)
224
%% Calculate the length of a list of lists.
226
flat_length(List) -> flatlength(List).
229
%% Calculate the length of a list of lists.
234
flatlength([H|T], L) when list(H) ->
235
flatlength(H, flatlength(T, L));
236
flatlength([H|T], L) ->
237
flatlength(T, L + 1);
238
flatlength([], L) -> L.
240
%% keymember(Key, Index, [Tuple])
241
%% keysearch(Key, Index, [Tuple])
242
%% keydelete(Key, Index, [Tuple])
243
%% keyreplace(Key, Index, [Tuple], NewTuple)
244
%% keysort(Index, [Tuple])
245
%% keymerge(Index, [Tuple], [Tuple])
246
%% keymap(Function, Index, [Tuple])
247
%% keymap(Function, ExtraArgs, Index, [Tuple])
249
keymember(Key, N, [T|Ts]) when element(N, T) == Key -> true;
250
keymember(Key, N, [T|Ts]) ->
251
keymember(Key, N, Ts);
252
keymember(Key, N, []) -> false.
254
keysearch(Key, N, [H|T]) when element(N, H) == Key ->
256
keysearch(Key, N, [H|T]) ->
257
keysearch(Key, N, T);
258
keysearch(Key, N, []) -> false.
260
keydelete(Key, N, [H|T]) when element(N, H) == Key -> T;
261
keydelete(Key, N, [H|T]) ->
262
[H|keydelete(Key, N, T)];
263
keydelete(Key, N, []) -> [].
265
keyreplace(Key, Pos, [Tup|Tail], New) when element(Pos, Tup) == Key ->
267
keyreplace(Key, Pos, [H|T], New) ->
268
[H|keyreplace(Key, Pos, T, New)];
269
keyreplace(Key, Pos, [], New) -> [].
271
keysort(Index, [X]) -> [X];
272
keysort(Index, []) -> [];
273
keysort(Index, X) -> split_and_keysort(X, [], [], Index).
275
split_and_keysort([A,B|T], X, Y, Index) ->
276
split_and_keysort(T, [A|X], [B|Y], Index);
277
split_and_keysort([H], X, Y, Index) ->
278
split_and_keysort([], [H|X], Y, Index);
279
split_and_keysort([], X, Y, Index) ->
280
keymerge(Index, keysort(Index, X), keysort(Index, Y), []).
282
keymerge(Index, X, Y) -> keymerge(Index, X, Y, []).
284
keymerge(I, [H1|T1], [H2|T2], L) when element(I, H1) < element(I, H2) ->
285
keymerge(I, T1, [H2|T2], [H1|L]);
286
keymerge(Index, T1, [H2|T2], L) ->
287
keymerge(Index,T1, T2, [H2|L]);
288
keymerge(Index,[H|T], T2, L) ->
289
keymerge(Index,T, T2, [H|L]);
290
keymerge(Index, [], [], L) ->
293
keymap(Fun, Index, [Tup|Tail]) ->
294
[setelement(Index, Tup, Fun(element(Index, Tup)))|keymap(Fun, Index, Tail)];
295
keymap( _, _ , []) -> [].
297
keymap(Fun, ExtraArgs, Index, [Tup|Tail]) ->
298
[setelement(Index, Tup, apply(Fun, [element(Index, Tup)|ExtraArgs]))|
299
keymap(Fun, ExtraArgs, Index, Tail)];
300
keymap( _, _ , _, []) -> [].
302
%% all(Predicate, List)
303
%% any(Predicate, List)
304
%% map(Function, List)
305
%% flatmap(Function, List)
306
%% foldl(Function, First, List)
307
%% foldr(Function, Last, List)
308
%% filter(Predicate, List)
309
%% zf(Function, List)
310
%% mapfoldl(Function, First, List)
311
%% mapfoldr(Function, Last, List)
312
%% foreach(Function, List)
313
%% takewhile(Predicate, List)
314
%% dropwhile(Predicate, List)
315
%% splitwith(Predicate, List)
316
%% for list programming. Function here is either a 'fun' or a tuple
317
%% {Module,Name} and we use apply/2 to evaluate. The name zf is a joke!
319
%% N.B. Unless where the functions actually needs it only foreach/2/3,
320
%% which is meant to be used for its side effects, has a defined order
323
%% There are also versions with an extra argument, ExtraArgs, which is a
324
%% list of extra arguments to each call.
326
all(Pred, [Hd|Tail]) ->
328
true -> all(Pred, Tail);
331
all(Pred, []) -> true.
333
any(Pred, [Hd|Tail]) ->
336
false -> any(Pred, Tail)
338
any(Pred, []) -> false.
340
map(F, List) -> [ F(E) || E <- List ].
342
flatmap(F, [Hd|Tail]) ->
343
F(Hd) ++ flatmap(F, Tail);
344
flatmap(F, []) -> [].
346
foldl(F, Accu, [Hd|Tail]) ->
347
foldl(F, F(Hd, Accu), Tail);
348
foldl(F, Accu, []) -> Accu.
350
foldr(F, Accu, [Hd|Tail]) ->
351
F(Hd, foldr(F, Accu, Tail));
352
foldr(F, Accu, []) -> Accu.
354
filter(Pred, List) -> [ E || E <- List, Pred(E) ].
367
foreach(F, [Hd|Tail]) ->
370
foreach(F, []) -> ok.
372
mapfoldl(F, Accu0, [Hd|Tail]) ->
373
{R,Accu1} = F(Hd, Accu0),
374
{Rs,Accu2} = mapfoldl(F, Accu1, Tail),
376
mapfoldl(F, Accu, []) -> {[],Accu}.
378
mapfoldr(F, Accu0, [Hd|Tail]) ->
379
{Rs,Accu1} = mapfoldr(F, Accu0, Tail),
380
{R,Accu2} = F(Hd, Accu1),
382
mapfoldr(F, Accu, []) -> {[],Accu}.
384
takewhile(Pred, [Hd|Tail]) ->
386
true -> [Hd|takewhile(Pred, Tail)];
389
takewhile(Pred, []) -> [].
391
dropwhile(Pred, [Hd|Tail]) ->
393
true -> dropwhile(Pred, Tail);
396
dropwhile(Pred, []) -> [].
398
splitwith(Pred, List) -> splitwith(Pred, List, []).
400
splitwith(Pred, [Hd|Tail], Taken) ->
402
true -> splitwith(Pred, Tail, [Hd|Taken]);
403
false -> {reverse(Taken), [Hd|Tail]}
405
splitwith(Pred, [], Taken) -> {reverse(Taken),[]}.
407
%% Versions of the above functions with extra arguments.
409
all(Pred, Eas, [Hd|Tail]) ->
410
case apply(Pred, [Hd|Eas]) of
411
true -> all(Pred, Eas, Tail);
414
all(Pred, Eas, []) -> true.
416
any(Pred, Eas, [Hd|Tail]) ->
417
case apply(Pred, [Hd|Eas]) of
419
false -> any(Pred, Eas, Tail)
421
any(Pred, Eas, []) -> false.
423
map(F, Eas, List) -> [ apply(F, [E|Eas]) || E <- List ].
425
flatmap(F, Eas, [Hd|Tail]) ->
426
apply(F, [Hd|Eas]) ++ flatmap(F, Eas, Tail);
427
flatmap(F, Eas, []) -> [].
429
foldl(F, Eas, Accu, [Hd|Tail]) ->
430
foldl(F, Eas, apply(F, [Hd,Accu|Eas]), Tail);
431
foldl(F, Eas, Accu, []) -> Accu.
433
foldr(F, Eas, Accu, [Hd|Tail]) ->
434
apply(F, [Hd,foldr(F, Eas, Accu, Tail)|Eas]);
435
foldr(F, Eas, Accu, []) ->
438
filter(Pred, Eas, List) -> [ E || E <- List, apply(Pred, [E|Eas]) ].
440
zf(F, Eas, [Hd|Tail]) ->
441
case apply(F, [Hd|Eas]) of
443
[Hd|zf(F, Eas, Tail)];
445
[Val|zf(F, Eas, Tail)];
449
zf(F, Eas, []) -> [].
451
foreach(F, Eas, [Hd|Tail]) ->
453
foreach(F, Eas, Tail);
454
foreach(F, Eas, []) -> ok.
456
mapfoldl(F, Eas, Accu0, [Hd|Tail]) ->
457
{R,Accu1} = apply(F, [Hd,Accu0|Eas]),
458
{Rs,Accu2} = mapfoldl(F, Eas, Accu1, Tail),
460
mapfoldl(F, Eas, Accu, []) -> {[],Accu}.
462
mapfoldr(F, Eas, Accu0, [Hd|Tail]) ->
463
{Rs,Accu1} = mapfoldr(F, Eas, Accu0, Tail),
464
{R,Accu2} = apply(F, [Hd,Accu1|Eas]),
466
mapfoldr(F, Eas, Accu, []) -> {[],Accu}.
468
%% takewhile/2, dropwhile/2 and splitwith/2 do not have versions with
469
%% extra arguments as this going to be discontinued.