Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -module(fn).
- -author("rgibson").
- %% API
- -export([compose/1, element_as/3, either/2]).
- compose([H,T]) ->
- fun(X) -> H(T(X)) end;
- compose([H|T]) ->
- TCompose = compose(T),
- fun(X) -> H(TCompose(X)) end.
- %% not using function guards to save extra element function call
- element_as(integer, Pos, Tuple) ->
- ensure_element_type(fun is_integer/1, integer, Pos, Tuple);
- element_as(atom, Pos, Tuple) ->
- ensure_element_type(fun is_atom/1, atom, Pos, Tuple);
- element_as(list, Pos, Tuple) ->
- ensure_element_type(fun is_list/1, list, Pos, Tuple);
- element_as(T, Pos, Tuple) ->
- error(unmatched_elem_msg(Pos, T, Tuple)).
- ensure_element_type(Pred, Type, Pos, Tuple) ->
- Elem = element(Pos, Tuple),
- case Pred(Elem) of
- true -> Elem;
- false -> error(unmatched_elem_msg(Pos, Type, Tuple))
- end.
- unmatched_elem_msg(Pos, Type, Tuple) ->
- lists:flatten(io_lib:format(<<"Unable to match element ~p as ~p in tuple ~p">>,
- [Pos, Type, Tuple])).
- either(Fn, Args) ->
- try
- {ok, apply(Fn, Args)}
- catch
- _: Error -> {error, Error}
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement