<div dir="ltr">Julian, thank you!<div><br></div><div>As usual you've provided seriously good feedback; that last suggestion looks particularly cool as it seems to be the mercury equivant of haskells ">>=" i.e. you've implemented a maybe monad for real. Excellent educational material. I have however opted to understand and user the "mapping a list of predicates" solution as it will be a nice segway into using "inst" for the first time ever.</div><div><br></div><div>Thanks again,</div><div>Sean.</div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, 26 Jul 2019 at 01:09, Julian Fondren <<a href="mailto:jfondren@minimaltype.com">jfondren@minimaltype.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On 2019-07-25 11:43, emacstheviking wrote:<br>
> is there a more idiomatic / efficient / less $%^&*( ugly way to do<br>
> this please...<br>
<br>
I'd like to point out that I have no idea as far as idiomatic<br>
and efficient goes.<br>
<br>
Especially so with this option:<br>
<br>
   :- module initall.<br>
   :- interface.<br>
   :- import_module io.<br>
   :- pred main(io::di, io::uo) is det.<br>
   :- implementation.<br>
   :- import_module list, bool.<br>
<br>
   :- type initializer == (pred(bool, io, io)).<br>
   :- inst initializer == (pred(out, di, uo) is det).<br>
<br>
   :- func initializer >> initializer = initializer.<br>
   :- mode in(initializer) >> in(initializer) = out(initializer).<br>
   A >> B = C :-<br>
       C = (pred(R::out, !.IO::di, !:IO::uo) is det :-<br>
           A(R1, !IO),<br>
           ( R1 = yes, B(R, !IO) ; R1 = no, R = no)).<br>
<br>
   :- pred setup_sdl(bool::out, io::di, io::uo) is det.<br>
   :- pred setup_sdlmix(bool::out, io::di, io::uo) is det.<br>
   :- pred setup_sdlimg(bool::out, io::di, io::uo) is det.<br>
   :- pred setup_sdlmaybe(bool::in, bool::out, io::di, io::uo) is det.<br>
<br>
   setup_sdl(yes, !IO) :- io.write_string("at sdl\n", !IO).<br>
   setup_sdlmix(yes, !IO) :- io.write_string("at sdlmix\n", !IO).<br>
   setup_sdlimg(yes, !IO) :- io.write_string("at sdlimg\n", !IO).<br>
   setup_sdlmaybe(B, B, !IO) :-<br>
       io.write_string("at sdlmaybe: ", !IO),<br>
       io.write_line(B, !IO).<br>
<br>
   main(!IO) :-<br>
       Init = setup_sdl<br>
           >> setup_sdlmaybe(no)<br>
           >> setup_sdlmix<br>
           >> setup_sdlimg,<br>
       Init(Res, !IO),<br>
       io.write_line(Res, !IO).<br>
</blockquote></div>