Current section

Files

Jump to
erlware_commons src ec_lists.erl
Raw

src/ec_lists.erl

%%% vi:ts=4 sw=4 et
%%%-------------------------------------------------------------------
%%% @copyright (C) 2011, Erlware LLC
%%% @doc
%%% Provides useful functionionality on standard lists that are
%%% not provided in the standard library.
%%% @end
%%%-------------------------------------------------------------------
-module(ec_lists).
%% API
-export([find/2,
fetch/2,
search/2]).
%%%===================================================================
%%% API
%%%===================================================================
%% @doc Search each value in the list with the specified
%% function. When the function returns a value of {ok, term()} the
%% search function stops and returns a tuple of {ok, term(), term()},
%% where the second value is the term returned from the function and
%% the third value is the element passed to the function. The purpose
%% of this is to allow a list to be searched where some internal state
%% is important while the input element is not.
-spec search(fun(), list()) -> {ok, Result::term(), Element::term()} | not_found.
search(Fun, [H|T]) ->
case Fun(H) of
{ok, Value} ->
{ok, Value, H};
not_found ->
search(Fun, T)
end;
search(_, []) ->
not_found.
%% @doc Find a value in the list with the specified function. If the
%% function returns the atom true, the value is returned as {ok,
%% term()} and processing is aborted, if the function returns false,
%% processing continues until the end of the list. If the end is found
%% and the function never returns true the atom error is returned.
-spec find(fun(), list()) -> {ok, term()} | error.
find(Fun, [Head|Tail]) when is_function(Fun) ->
case Fun(Head) of
true ->
{ok, Head};
false ->
find(Fun, Tail)
end;
find(_Fun, []) ->
error.
%% @doc Fetch a value from the list. If the function returns true the
%% value is returned. If processing reaches the end of the list and
%% the function has never returned true an exception not_found is
%% thrown.
-spec fetch(fun(), list()) -> term().
fetch(Fun, List) when is_list(List), is_function(Fun) ->
case find(Fun, List) of
{ok, Head} ->
Head;
error ->
throw(not_found)
end.