<div dir="ltr">You are headed in the right direction.  Two comments on your refactor:<div><br></div><div>1. Ditch the atom selector.  Just make this part of the function name.</div><div>2. You can flatten out the remaining case expressions if you like.  Whether this is better or not is a matter of opinion, but it definitely makes tracing easier.</div><div><br></div><div>This is where I got with your code...<br><div><br></div><div><div>send_update(Arg1) -></div><div>    send_update_check_indices(...).</div><div><br></div><div>send_update_check_indices({ok, [Val1, Val2]}) -></div><div>    send_update_check_values(...);</div><div>send_update_check_indices(Else) -></div><div>    lager:error("ERROR: ..").</div><div><br></div><div>% and so on</div></div><div><br></div><div><br></div></div></div><br><div class="gmail_quote"><div dir="ltr">On Mon, Sep 25, 2017 at 8:26 AM code wiget <<a href="mailto:codewiget95@gmail.com">codewiget95@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello everyone,<br>
<br>
As I get further into Erlang, I am starting to realize that some of my functions have been getting pretty ugly with nested case statements. For example, I had a nested case statement that looked something like this:<br>
<br>
Send_update(Arg1) -><br>
        case do this(Arg1) of<br>
                {ok, [Val1, Val2]} -><br>
                        case do_that(Val1, Val2) of<br>
                                {ok, [Val3, Val4]} -><br>
                                        case do_this2(…) of<br>
….<br>
<br>
It continued into this for another few functions, you get the picture - its ugly, and it is hard to read.<br>
<br>
So I went and I converted it to a top level function that would then call lower level functions like so:<br>
<br>
<br>
<br>
 send_update(Arg1) -><br>
     case ... of<br>
         {ok, [Val1, Val2]} -><br>
             send_update(check_indices, {Arg1, Val1, Val2});<br>
         Else -><br>
             lager:error("ERROR: ..")<br>
     end.<br>
 send_update(check_indices, {Arg1, Arg2, Arg3}) -><br>
     case check_indices(Arg2, Arg3)of<br>
         true -><br>
             send_update(get_values, {Arg1, Arg3});<br>
         false -><br>
             lager:error("EMERGENCY: ….")<br>
     end;<br>
 send_update(get_values, {Arg1, Arg2}) -><br>
   ...<br>
     case ... of<br>
         {ok, [Val1, Val2, VAl3]} -><br>
             send_update(send_value, {Arg1, Val1, Val2, Val3});<br>
         Error -><br>
             lager:error("ERROR: …")<br>
     end;<br>
 send_update(send_value, {Arg1, Arg2, Arg3, Arg4}) -><br>
    …<br>
     Do_something(Args),<br>
     ok.<br>
<br>
<br>
Now that I look at it though, both don’t look right. They don’t look like something I would write in any other language where I would just have if’s and else’s.<br>
<br>
Is this the proper way to write Erlang? I know everyone has their own style, but I assume there is some accepted form of writing functional programs with deep nests.<br>
<br>
Thank you for your advice!<br>
_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" rel="noreferrer" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
</blockquote></div>