<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head><body><div data-crea="font-wrapper" style="font-family: Tahoma; font-size: 16px; direction: ltr"><div style="font-family: Tahoma; font-size: 16px"></div><font face="Courier New, monospace">Hi Karlo, list,</font><div><font face="Courier New, monospace"><br></font></div><div><font face="Courier New, monospace">I am just learning erlang and found this an interesting topic to explore.</font></div><div><font face="Courier New, monospace">I wrote a little server, which creates generator functions. </font></div><div><font face="Courier New, monospace">Right now it is not usable for list comprehensions, I think.</font></div><div><font face="Courier New, monospace">And the termination is not very nice yet..</font></div><div><font face="Courier New, monospace">But maybe someone finds it useful.</font></div><div><font face="Courier New, monospace"><br></font></div><div><font face="Courier New, monospace">Kind regards,</font></div><div><font face="Courier New, monospace">dieter</font></div><div><font face="Courier New, monospace">------------------------------------------------------------------------</font></div><div><font face="Courier New, monospace"><br></font></div><div><div><span style='font-family: "Courier New", monospace;'>-module(generator).</span><br></div><div><span style='font-family: "Courier New", monospace;'>-behaviour(gen_server).</span><br></div><div><font face="Courier New, monospace"><br></font></div><div><font face="Courier New, monospace">%% API</font></div><div><font face="Courier New, monospace">-export([generate/2]).</font></div><div><font face="Courier New, monospace"><br></font></div><div><font face="Courier New, monospace">%% gen_server callbacks</font></div><div><font face="Courier New, monospace">-export([init/1, handle_call/3, handle_cast/2, handle_info/2,</font></div><div><font face="Courier New, monospace">         terminate/2, code_change/3]).</font></div><div><font face="Courier New, monospace"><br></font></div><div><font face="Courier New, monospace">-define(SERVER, ?MODULE).</font></div><div><span style='font-family: "Courier New", monospace;'>-record(state, {client_state, client_fun}).</span><br></div><div><font face="Courier New, monospace"><br></font></div><div><font face="Courier New, monospace">%%%===================================================================</font></div><div><font face="Courier New, monospace">%%% API</font></div><div><font face="Courier New, monospace">%%%===================================================================</font></div><div><font face="Courier New, monospace">generate(Function,State) -></font></div><div><font face="Courier New, monospace">    {ok, Pid} = gen_server:start_link(?MODULE, [Function,State], []),</font></div><div><font face="Courier New, monospace">    Generator = fun(Params) -></font></div><div><font face="Courier New, monospace">                        {ok, Value} = gen_server:call(Pid, {next, Params}),</font></div><div><font face="Courier New, monospace">                        Value</font></div><div><font face="Courier New, monospace">                end,</font></div><div><font face="Courier New, monospace">    Generator.</font></div><div><font face="Courier New, monospace">                        </font></div><div><span style='font-family: "Courier New", monospace;'>init([Function, State]) -></span><br></div><div><font face="Courier New, monospace">    {ok, #state{client_fun=Function, client_state=State}}.</font></div><div><font face="Courier New, monospace"><br></font></div><div><span style='font-family: "Courier New", monospace;'>handle_call({next, Params}, _From, State = #state{client_fun=Function, client_state=ClientState}) -></span><br></div><div><font face="Courier New, monospace">    case Function(Params, ClientState) of</font></div><div><font face="Courier New, monospace">        {ok, Value, NewClientState} -></font></div><div><font face="Courier New, monospace">            {reply, {ok, Value}, State#state{client_state=NewClientState}};</font></div><div><font face="Courier New, monospace">        stop -></font></div><div><font face="Courier New, monospace">            {stop, stopped, State}</font></div><div><font face="Courier New, monospace">    end.</font></div><div><font face="Courier New, monospace"><br></font></div><div><font face="Courier New, monospace">[..]</font></div><div><br></div><div><br></div><div><font face="Courier New, monospace"><br></font></div><div><font face="Courier New, monospace">%% Client callback function definition</font></div><div><font face="Courier New, monospace">%% @spec func(Params, State) -> {ok, Value, State} | stop</font></div><div><font face="Courier New, monospace"><br></font></div><div><font face="Courier New, monospace"><br></font></div><div><font face="Courier New, monospace"><br></font></div><div><font face="Courier New, monospace">%% Test run</font></div><div><br></div><div><span style='font-family: "Courier New", monospace;'>1> G = generator:generate(fun(P,S) -> </span><br></div><div><font face="Courier New, monospace">                              V=P+S, </font></div><div><font face="Courier New, monospace">                              NS=S+1, </font></div><div><font face="Courier New, monospace">                              case NS of </font></div><div><font face="Courier New, monospace">                                   13 -> stop; </font></div><div><font face="Courier New, monospace">                                   _ -> {ok, V, NS} </font></div><div><font face="Courier New, monospace">                              end </font></div><div><font face="Courier New, monospace">                        end, </font></div><div><font face="Courier New, monospace">                        10).</font></div></div><div><font face="Courier New, monospace"><br></font></div><div><font face="Courier New, monospace"><div>#Fun<generator.0.70999052><br></div><div>2> </div><div>2> </div><div>2> </div><div>2> G13(1).                                                                                              11  </div><div>3> G13(1).</div><div>12</div><div>4> G13(1).</div><div>** exception exit: stopped</div><div>5> </div><div>=ERROR REPORT==== 29-Jun-2018::10:32:54 ===</div><div>** Generic server <0.67.0> terminating </div><div>** Last message in was {next,1}</div><div>** When Server state == {state,12,#Fun<erl_eval.12.99386804>}</div><div>** Reason for termination == </div><div>** stopped</div><div>** Client <0.65.0> stacktrace</div><div>** [{gen,do_call,4,[{file,"gen.erl"},{line,169}]},</div><div>    {gen_server,call,2,[{file,"gen_server.erl"},{line,202}]},</div><div>    {generator,'-generate/2-fun-0-',2,[{file,"generator.erl"},{line,30}]},</div><div>    {erl_eval,do_apply,5,[{file,"erl_eval.erl"},{line,661}]},</div><div>    {shell,exprs,7,[{file,"shell.erl"},{line,687}]},</div><div>    {shell,eval_exprs,7,[{file,"shell.erl"},{line,642}]},</div><div>    {shell,eval_loop,3,[{file,"shell.erl"},{line,627}]}]</div><div><br></div></font></div><div><font face="Courier New, monospace"><br></font><div></div><font face="Courier New, monospace"><br><br></font><div data-anchor="reply-title"><font face="Courier New, monospace">Am Fr., Jun. 29, 2018 00:27 schrieb Karlo Kuna <kuna.prime@gmail.com>:</font></div><blockquote><div><div>
<div dir="ltr"><font face="Courier New, monospace">i was wandering is there protocol or "interface" for making custom generators in erlang? here i asume generator can be used in list comprehensions </font><div><font face="Courier New, monospace"><br></font></div><div><font face="Courier New, monospace">something similar to I/O protocol </font></div><div><font face="Courier New, monospace"><br></font></div><div><font face="Courier New, monospace"><br></font></div><div><br></div></div>
</div></div></blockquote></div></div></body></html>