Advertisement
Guest User

Untitled

a guest
Sep 1st, 2015
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.09 KB | None | 0 0
  1. -module(fn).
  2. -author("rgibson").
  3.  
  4. %% API
  5. -export([compose/1, element_as/3, either/2]).
  6.  
  7. compose([H,T]) ->
  8. fun(X) -> H(T(X)) end;
  9. compose([H|T]) ->
  10. TCompose = compose(T),
  11. fun(X) -> H(TCompose(X)) end.
  12.  
  13. %% not using function guards to save extra element function call
  14. element_as(integer, Pos, Tuple) ->
  15. ensure_element_type(fun is_integer/1, integer, Pos, Tuple);
  16. element_as(atom, Pos, Tuple) ->
  17. ensure_element_type(fun is_atom/1, atom, Pos, Tuple);
  18. element_as(list, Pos, Tuple) ->
  19. ensure_element_type(fun is_list/1, list, Pos, Tuple);
  20. element_as(T, Pos, Tuple) ->
  21. error(unmatched_elem_msg(Pos, T, Tuple)).
  22.  
  23. ensure_element_type(Pred, Type, Pos, Tuple) ->
  24. Elem = element(Pos, Tuple),
  25. case Pred(Elem) of
  26. true -> Elem;
  27. false -> error(unmatched_elem_msg(Pos, Type, Tuple))
  28. end.
  29.  
  30. unmatched_elem_msg(Pos, Type, Tuple) ->
  31. lists:flatten(io_lib:format(<<"Unable to match element ~p as ~p in tuple ~p">>,
  32. [Pos, Type, Tuple])).
  33.  
  34. either(Fn, Args) ->
  35. try
  36. {ok, apply(Fn, Args)}
  37. catch
  38. _: Error -> {error, Error}
  39. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement