リストに関する処理を集めたユーティリティモジュール.
Copyright (c) 2013-2014 DWANGO Co., Ltd. All Rights Reserved.
adjacent_uniq/1 | List 内で連接する重複要素を削除する. |
delete_all/2 | List 内に存在する全てのElement を削除する. |
find_if/2 | PredFun の結果がtrue となるList 内の最初の要素を検索する. |
foldl_while/3 | lists:foldl/3 の中断機能追加版: 関数適用後の結果が{false, _} となった場合は、そこで走査が中断される. |
foldr_while/3 | lists:foldr/3 の中断機能追加版: 関数適用後の結果が{false, _} となった場合は、そこで走査が中断される. |
group_by/2 | tuple の N 番目の値でグループ化する. |
inits/1 | List の全ての先頭部分リストを長さの増加する順に並べて返す. |
longest_common_prefix/1 | Lists 内のリスト群のLongestCommonPrefixの長さを返す. |
maybe_filter/2 | lists:filter/2 の maybe版: 関数適用結果が{error, Reason} となる要素があれば、そこで走査が中断される. |
maybe_foldl/3 | lists:foldl/3 の maybe版: 関数適用結果が{error, Reason} となる要素があれば、そこで走査が中断される. |
maybe_foldr/3 | lists:foldr/3 の maybe版: 関数適用結果が{error, Reason} となる要素があれば、そこで走査が中断される. |
maybe_foreach/2 | lists:foreach/2 の maybe版: 関数適用結果が{error, Reason} となる要素があれば、そこで走査が中断される. |
maybe_map/2 | lists:map/2 の maybe版: 関数適用結果が{error, Reason} となる要素があれば、そこで走査が中断される. |
maybe_pmap/2 | Equivalent to maybe_pmap(Fun, List, infinity). |
maybe_pmap/3 | maybe_map/2 の並列版. |
position/2 | List 内で最初にValue が出現する位置を1-originで返す. |
position_if/2 | List 内で最初に述語PredFun を満たす要素の位置を1-originで返す. |
replace_if/3 | PredFun の結果がtrue となった最初の要素をValue で置換する. |
shuffle/1 | 入力リストの順番を無作為に並べ替える. |
split_longest_common_prefix/1 | Lists 内の各リストを'LongestCommonPrefix部分'と'それ以降のSuffix部分'に分割する. |
tails/1 | List の全ての末尾部分リストを長さの減少する順に並べて返す. |
take/2 | Element と一致する最初の要素を検索し、その値を除いたリストを返す. |
take_if/2 | PredFun の結果がtrue となるList 内の最初の要素を検索し, その値とその値を除いたリストを返す. |
uniq/1 | List 内で重複要素を削除する. |
adjacent_uniq(List::[term()]) -> [term()]
List
内で連接する重複要素を削除する
リスト全体を通して各要素をユニークにしたい場合は、事前にリストをソートしておくか、
この関数の代わりにlists:usort/1
またはmoyo_list:uniq/1
を使う必要がある。
なお、要素の一致判定は=:=
にて行われる (1.0
と1
は別要素扱い)
> moyo_list:adjacent_uniq([a, a, b, b, c, c]).
[a, b, c]
> moyo_list:adjacent_uniq([a, a, b, b, a, a]).
[a, b, a]
delete_all(Element, List1) -> List2
Element = term()
List1 = [Element]
List2 = [Element]
List
内に存在する全てのElement
を削除する
> moyo_list:delete_all(aaa, [aaa, bbb, ccc, bbb, aaa]).
[bbb, ccc, bbb]
find_if(PredFun, List) -> {ok, Element} | error
PredFun = fun((Element) -> boolean())
List = [Element]
Element = term()
PredFun
の結果がtrue
となるList
内の最初の要素を検索する
foldl_while(Fun, Initial::term(), List) -> Result
Fun = fun((Element, Acc::term()) -> {true, Result} | {false, Result})
List = [Element]
Element = term()
Result = term()
lists:foldl/3 の中断機能追加版: 関数適用後の結果が{false, _}
となった場合は、そこで走査が中断される.
Fun
の結果は{true, Result}
or {false, Result}
のいずれかである必要がある.
foldr_while(Fun, Initial::term(), List) -> Result
Fun = fun((Element, Acc::term()) -> {true, Result} | {false, Result})
List = [Element]
Element = term()
Result = term()
lists:foldr/3 の中断機能追加版: 関数適用後の結果が{false, _}
となった場合は、そこで走査が中断される.
Fun
の結果は{true, Result}
or {false, Result}
のいずれかである必要がある.
group_by(N::non_neg_integer(), TupleList::[tuple()]) -> [{term(), [tuple()]}]
tuple の N 番目の値でグループ化する.
inits(List::[Element]) -> [[Element]]
Element = term()
List
の全ての先頭部分リストを長さの増加する順に並べて返す
関数名およびインタフェースはHaskellのData.List.inits関数
に倣った
> moyo_list:inits("abc").
["", "a", "ab", "abc"]
longest_common_prefix(Lists) -> LongestCommonPrefixLength
Lists = [List]
List = [term()]
LongestCommonPrefixLength = non_neg_integer()
Lists
内のリスト群のLongestCommonPrefixの長さを返す
binary:longest_common_prefix/1
のリスト版
> moyo_list:longest_common_prefix(["erlang", "ergonomy"]).
2
> moyo_list:longest_common_prefix(["erlang", "perl"]).
0
maybe_filter(Fun, List) -> {ok, List} | {error, Reason}
Fun = fun((Element) -> boolean() | {error, Reason})
List = [Element]
Reason = term()
lists:filter/2 の maybe版: 関数適用結果が{error, Reason}
となる要素があれば、そこで走査が中断される.
Fun
の結果は boolean()
or {error, Reason}
のいずれかである必要がある.
maybe_foldl(Fun, Initial::term(), List) -> {ok, Result::term()} | {error, Reason}
Fun = fun((Element, Acc::term()) -> {ok, AccNext::term()} | {error, Reason})
List = [Element]
Element = term()
Reason = term()
lists:foldl/3 の maybe版: 関数適用結果が{error, Reason}
となる要素があれば、そこで走査が中断される.
Fun
の結果は {ok, Result}
or {error, Reason}
のいずれかである必要がある.
maybe_foldr(Fun, Initial::term(), List) -> {ok, Result::term()} | {error, Reason}
Fun = fun((Element, Acc::term()) -> {ok, AccNext::term()} | {error, Reason})
List = [Element]
Element = term()
Reason = term()
lists:foldr/3 の maybe版: 関数適用結果が{error, Reason}
となる要素があれば、そこで走査が中断される.
Fun
の結果は {ok, Result}
or {error, Reason}
のいずれかである必要がある.
maybe_foreach(Fun, List) -> ok | {error, Reason}
Fun = fun((Element) -> {error, Reason} | any())
List = [Element]
Element = term()
Reason = term()
lists:foreach/2 の maybe版: 関数適用結果が{error, Reason}
となる要素があれば、そこで走査が中断される.
Fun
の結果が{error, Reason}
の場合はそこで走査が中断され、それ以外の場合は継続される.
maybe_map(Fun, List) -> {ok, Result} | {error, Reason}
Fun = fun((Element) -> {ok, PerResult} | {error, Reason})
List = [Element]
Element = term()
Result = [PerResult]
PerResult = term()
Reason = term()
lists:map/2 の maybe版: 関数適用結果が{error, Reason}
となる要素があれば、そこで走査が中断される.
Fun
の結果は {ok, Result}
or {error, Reason}
のいずれかである必要がある.
maybe_pmap(Fun, List) -> {ok, Values} | {error, Reason}
Fun = fun((Arg) -> {ok, Value} | {error, Reason})
List = [Arg]
Values = [Value]
Arg = term()
Value = term()
Reason = ExitError | term()
ExitError = {EXIT, {ExitReason::term(), StackTrace::term()}}
Equivalent to maybe_pmap(Fun, List, infinity)
.
maybe_pmap(Fun, List, Timeout) -> {ok, Values} | {error, Reason}
Fun = fun((Arg) -> {ok, Value} | {error, Reason})
List = [Arg]
Timeout = timeout()
Values = [Value]
Arg = term()
Value = term()
Reason = ExitError | ExitTimeout | term()
ExitError = {EXIT, {ExitReason::term(), StackTrace::term()}}
ExitTimeout = {EXIT, timeout}
maybe_map/2
の並列版.
Fun
の実行中のエラーが発生した場合はExitError
、タイムアウトが発生した場合はExitTimeout
が結果として返される.
また, 1つでも関数適用結果が{error, Reason}
となる要素があれば, そこで走査を中断し、残ったプロセスを終了させる.
position(Value::term(), List::list()) -> {ok, Position::pos_integer()} | error
List
内で最初にValue
が出現する位置を1-originで返す
Value
が存在しない場合はerror
が返される
position_if(PredFun::fun((Element) -> boolean()), List::[Element]) -> {ok, pos_integer()} | error
Element = term()
List
内で最初に述語PredFun
を満たす要素の位置を1-originで返す
該当する要素が存在しない場合はerror
が返される
replace_if(PredFun, Value::term(), List::list()) -> list()
PredFun = fun((term()) -> boolean())
PredFun
の結果がtrue
となった最初の要素をValue
で置換する
shuffle(List::[Element]) -> [Element]
Element = term()
入力リストの順番を無作為に並べ替える
split_longest_common_prefix(Lists) -> {LongestCommonPrefix, [Suffix]}
Lists = [List]
List = [term()]
LongestCommonPrefix = List
Suffix = List
Lists
内の各リストを'LongestCommonPrefix部分'と'それ以降のSuffix部分'に分割する
なお'LongestCommonPrefix部分'は全てのリストで共通のため、結果では一つにまとめられている
> moyo_list:split_longest_common_prefix(["erlang", "ergonomy"]).
{"er", ["lang", "gonomy"]}
> moyo_list:split_longest_common_prefix(["erlang", "perl"]).
{"", ["erlang", "perl"]}
tails(List::[Element]) -> [[Element]]
Element = term()
List
の全ての末尾部分リストを長さの減少する順に並べて返す
関数名およびインタフェースはHaskellのData.List.tails関数
に倣った
> moyo_list:tails("abc").
["abc", "ab", "a", ""]
take(Element, List1) -> {ok, List2} | error
Element = term()
List1 = [Element]
List2 = [Element]
Element
と一致する最初の要素を検索し、その値を除いたリストを返す
> moyo_list:take(bbb, [aaa, bbb, ccc]).
{ok, [aaa, ccc]}.
> moyo_list:take(bbb, [111, 222, 333]).
error
take_if(PredFun, List1) -> {ok, Element, List2} | error
PredFun = fun((Element) -> boolean())
List1 = [Element]
Element = term()
List2 = [Element]
PredFun
の結果がtrue
となるList
内の最初の要素を検索し, その値とその値を除いたリストを返す.
uniq(List::[term()]) -> [term()]
List
内で重複要素を削除する
計算量はO(n log n)
. 要素の出現順は保存される.
リストがソートされてもよい場合はlists:usort/1
の方が高速.
連接する重複要素のみを削除したい場合はこの関数の代わりにmoyo_list:adjacent_uniq/1
を使う.
なお, 要素の一致判定は=:=
にて行われる (1.0
と1
は別要素扱い)
> moyo_list:uniq([a, a, b, b, c, c]).
[a, b, c]
> moyo_list:uniq([c, a, c, b, b, a]).
[c, a, b]