Sam Bobroff <>
Wed Dec 2 17:41:21 CET 2009

```Jarrod Roberson wrote:
> is there anything that I can do to improve this code? Are the nested case of
> the best way to do that? It was the only thing I could get to work.
>
Hi Jarrod,

I have another suggestion you might find interesting. I would like to
factor out the recursion in the "is_subscribed" function because I think
it's generally good to use comprehensions or folds if you can, instead
of creating your own recursion. Unfortunately I can't see a way to do
this trivially, so:

Given this code:
> % test to see if a dns_rr.domain is subscribed to
> is_subscribed(_,[]) -> false;
> is_subscribed(Dom,[S|Rest]) ->
>     case lists:suffix(S,Dom) of
>         true ->
>             {ok,S};
>         false ->
>             is_subscribed(Dom,Rest)
>     end.
I would first write a function like this:

%% first(Pred, List): Return either false or {true, Elem} where Elem is
the first element of List for which Pred(Elem) returns true.
%% Pred must take one argument and return true or false.
first(Pred, []) ->
false;
first(Pred, [X | Xs]) ->
case Pred(X) of
true ->
{true, X};
false ->
first(Pred, Xs)
end.

Then I could write is_subscribed like this:

is_subscribed(Dom, SS) ->
first(fun(S) -> lists:suffix(S, Dom) end, SS).

This makes the "is_subscribed" function really easy to understand and
provides "first" as a useful tool.

To be honest I was quite surprised that it wasn't in the "lists"
module... maybe there is one somewhere I couldn't find.

Sam.

```