[erlang-questions] Re: The If expression
Richard O'Keefe
ok@REDACTED
Fri Apr 23 00:14:40 CEST 2010
On Apr 23, 2010, at 2:28 AM, James Aimonetti wrote:
> This thread is well-timed as I have an issue I wanted some help on.
>
> I have two lists, one of keys and one of values. I want to zip them
> together, but I have one specific key/value combo that I want to
> exclude from the zipped list. For context, this is creating an
> appropriate {proplist} for couchbeam.
>
> to_couchbeam(Fields, Values) ->
> { lists:flatten( lists:zipwith(fun to_couchbeam_zipper/2, Fields,
> Values) ) }.
>
> to_couchbeam_zipper(F, V) ->
> K = to_couchbeam_key(F),
> Val = to_couchbeam_value(V),
> case Key == <<"_rev">> andalso Val == undefined of
> true -> [];
> false -> {K, Val}
> end.
to_couchbeam([], []) ->
[];
to_couchbeam([Field|Fields], [Value|Values]) ->
Key = to_couchbeam_key(Field),
Val = to_couchbeam_value(Value),
Tail = to_couchbeam(Fields, Values)
case {Key,Val}
of {<<"_rev">>, undefined} -> Tail
; Pair -> [Pair|Tail]
end.
What have 'true' or 'false' to do with it?
It's <<"_rev">> and 'undefined' you want to watch out
for, so it's they that belong in the case.
Why build a list including stuff you don't want,
and then strip it out?
What we really want here is EEP 19
(http://www.erlang.org/eeps/eep-0019.html)
to_couchbeam(Fields, Values) ->
[Pair || F <- Fields && V <- Values,
Pair = {to_couchbeam_key(F), to_couchbeam_value(V)},
Pair =/= {<<"_rev">>, undefined}].
(THAT IS NOT LEGAL ERLANG RIGHT NOW.)
If you are willing to build a list and then squish out the
element you don't want, then
to_couchbeam(Fields, Values) ->
P = fun (K,V) -> {to_couchbeam_key(K), to_couchbeam_value(V)} end,
lists:delete({<<"_rev">>,undefined}, lists:zipwith(P, Fields,
Values)).
seems like the best that can be done.
More information about the erlang-questions
mailing list