Gen_event рдХрд╛ рдкрд░рд┐рдЪрдп: рдЦрд╛рддрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдЕрдзрд┐рд╕реВрдЪрдирд╛рдПрдБ

рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ: рдореИрдВ рдХрд░реНрдо рдХреА рдХрдореА рдХреЗ рдХрд╛рд░рдг рдзреНрд╡рдЬ рдлреЗрдВрдХрдиреЗ рд╡рд╛рд▓реЗ рддрд┐рдкрддрд┐рдпрд╛ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдБрдЧрд╛ (рд╡реИрд╕реЗ, рдкрд╣рд▓реЗ рдЕрдиреБрд╡рд╛рдж рдХреЗ рд▓рд┐рдП рдЙрд╕реЗ рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж; рдпрд╣ рдЙрдирдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдерд╛ рдХрд┐ рдореИрдВрдиреЗ рд▓реЗрдЦрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реАрдЦрд╛ рд╣реИ, рдЬрд┐рдирдХреЗ рд▓реЗрдЦреЛрдВ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореИрдВ рдЕрдиреБрд╡рд╛рдж рдЬрд╛рд░реА рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ)ред

рдкрд┐рдЫрд▓реЗ рднрд╛рдЧреЛрдВ рдХреЗ рд▓рд┐рдВрдХ рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдУрдЯреАрдкреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдкрд░рд┐рдЪрдп рдореЗрдВ рдпрд╣ рддреАрд╕рд░рд╛ рд▓реЗрдЦ рд╣реИред рдореИрдВ рдкрд╣рд▓реЗ рднрд╛рдЧ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ, рдЬреЛ gen_server рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╣рдорд╛рд░реЗ рдмреИрдВрдХрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреА рдиреАрдВрд╡ рд░рдЦрддрд╛ рд╣реИ, рдЕрдЧрд░ рдЖрдкрдиреЗ рдЕрднреА рддрдХ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рджреВрд╕рд░реА рдУрд░, рдпрджрд┐ рдЖрдк рдПрдХ рд╕рдХреНрд╖рдо рдЫрд╛рддреНрд░ рд╣реИрдВ, рддреЛ рдЖрдк рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдореЙрдбреНрдпреВрд▓ eb_atm.erl рдФрд░ eb_server.erl рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ ред

рдкрд░рд┐рджреГрд╢реНрдп : рдХреЗрдВрджреНрд░реАрдп рд╕рд░реНрд╡рд░ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдФрд░ рд╕реНрдерд╛рдиреАрдп рдПрдЯреАрдПрдо рдХреЗ рдЖрдЧрдорди рдХреЗ рд╕рд╛рде, ErlyBank рдиреЗ рдЕрдкрдиреЗ рддрдХрдиреАрдХреА рдЖрдзрд╛рд░ рдХреЛ рдЖрд╢рд╛рд╡рд╛рджреА рд░реВрдк рд╕реЗ рд╕рдордЭрдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдкреНрд░рддрд┐рдпреЛрдЧрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд╕рд╛рдзрди рдХреЗ рд░реВрдк рдореЗрдВ, рд╡реЗ рдПрдХ рдРрд╕реА рдкреНрд░рдгрд╛рд▓реА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдЬреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдорд╛рддреНрд░рд╛ рдореЗрдВ рдирдХрджреА рд╡рд╛рдкрд╕ рд▓реЗрдиреЗ рдкрд░ рд╕реВрдЪрдирд╛рдПрдВ рднреЗрдЬрддреА рд╣реИред рд╡реЗ рдирдХрджреА рдирд┐рдХрд╛рд╕реА рд░рд╛рд╢рд┐ рдХреА рд╕реАрдорд╛ рдореВрд▓реНрдп рдХреЛ рдмрджрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдХреЛ рд░рд┐рдмреВрдЯ рдХрд┐рдП рдмрд┐рдирд╛ рдПрдХ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдЪрд╛рд▓реВ рд╣реЛ рдЬрд╛рддреА рд╣реИред рдкреНрд░рдмрдВрдзрди рдиреЗ рд╣рдореЗрдВ рдХрд╛рд░реНрдп рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдпреБрдХреНрдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред

рдкрд░рд┐рдгрд╛рдо : рд╣рдо gen_event рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЗрд╡реЗрдВрдЯ-рдЖрдзрд╛рд░рд┐рдд рд╕реВрдЪрдирд╛ рдкреНрд░рдгрд╛рд▓реА рдмрдирд╛рдПрдВрдЧреЗ ред рдпрд╣ рд╣рдореЗрдВ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЕрдиреНрдп рд╕реВрдЪрдирд╛рдПрдВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдореВрд▓ рдЖрдзрд╛рд░ рджреЗрдЧрд╛, рдЬрдмрдХрд┐ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╡рд░реНрддрдорд╛рди рд╕рд░реНрд╡рд░ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред

Gen_event рдХреНрдпрд╛ рд╣реИ?


gen_event Erlang / OTP ( рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдПрдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ; рдореИрдВ рд╢рдмреНрджрд╛рд╡рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ рдЬреЛ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦрдХ рдХреЗ рдЕрдиреБрд╡рд╛рджреЛрдВ рд╕реЗ рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ; рдкрд╣рд▓реЗ рдЪрдХреНрд░ рдореЗрдВ рдЗрд╕ рд╢рдмреНрдж рдХреЛ "рдЗрдВрдЯрд░рдлрд╝реЗрд╕" рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ OOP рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рд▓реЗрдХрд┐рди Erlang рдХреЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╕рд╛рд░ рдХреЗ рд╕рд╛рде рдХрдо рд╕рдВрдЧрдд рд╣реИ - рд▓рдЧрднрдЧред рдЕрдиреБрд╡рд╛рджрдХ ) рдЬреЛ рдШрдЯрдирд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдЗрд╡реЗрдВрдЯ рдореИрдиреЗрдЬрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЪрд▓рд╛рдиреЗ рдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдХрдИ рд╣реИрдВрдбрд▓рд░ рдЪрд▓рддреЗ рд╣реИрдВред рдЗрд╡реЗрдВрдЯ рдореИрдиреЗрдЬрд░ рдЕрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рд╕реЗ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рдкреНрд░рддреНрдпреЗрдХ рд╣реИрдВрдбрд▓рд░ рдШрдЯрдирд╛рдУрдВ рдХреА рд╕реВрдЪрдирд╛рдПрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдирдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд╣реИрдВрдбрд▓рд░ рдХреЗ рд▓рд┐рдП рдЕрдкреЗрдХреНрд╖рд┐рдд рдХреЙрд▓рдмреИрдХ рд╣реИрдВ:

рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдкрд╣рд▓реЗ рд╡рд░реНрдгрд┐рдд рджреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЙрдбреНрдпреВрд▓ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдХрдо рд╕рдВрдЦреНрдпрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, gen_event рдХреЛ рдЕрдХреНрд╕рд░ рд╣реА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдЕрдиреНрдп OTP рдореЙрдбреНрдпреВрд▓ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреЛрдИ рдХрдо рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдирд╣реАрдВ рд╣реИрдВред

рдЗрд╡реЗрдВрдЯ рдореИрдиреЗрдЬрд░ рдмрдирд╛рдПрдВ


рдШрдЯрдирд╛ рдкреНрд░рдмрдВрдзрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рд╣рдореЗрдВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд░рд▓ рдХрд╛рд░реНрдп рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ gen_event рд╕рд░реНрд╡рд░ рдХреЛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╢реАрд░реНрд╖ рдкрд░ рдХреБрдЫ рдПрдкреАрдЖрдИ рддрд░реАрдХреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдХрд░, рдирдП рд╣реИрдВрдбрд▓рд░ рдЬреЛрдбрд╝рдирд╛, рд╕реВрдЪрдирд╛рдПрдВ рднреЗрдЬрдирд╛ рдЖрджрд┐ рдЖрд╕рд╛рди рд╣реИред

рдореЗрд░реЗ рдЗрд╡реЗрдВрдЯ рдореИрдиреЗрдЬрд░ рдврд╛рдВрдЪреЗ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдЗрд╕реЗ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЯреБрдХрдбрд╝реЗ рджреВрдБрдЧрд╛ред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд╝рд╛рдЗрд▓ рдЕрд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИред рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╡рд┐рдзрд┐ рдЕрдиреНрдп рдУрдЯреАрдкреА рд╡реНрдпрд╡рд╣рд╛рд░ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рдорд╛рди рд╣реИред рдореИрдВрдиреЗ рдЗрд╡реЗрдВрдЯ рдореИрдиреЗрдЬрд░ рдореЗрдВ рд╣реИрдВрдбрд▓рд░ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдПрдкреАрдЖрдИ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рд╣реИ:
%%--------------------------------------------------------------------
%% Function: add_handler(Module) -> ok | {'EXIT',Reason} | term()
%% Description: Adds an event handler
%%--------------------------------------------------------------------
add_handler(Module) ->
gen_event:add_handler(?SERVER, Module, []).

рдпрд╣ рд╡рд┐рдзрд┐ рдмрд╕ рдПрдХ рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЛ рд╡рд░реНрддрдорд╛рди рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╕реНрдерд┐рдд рдЗрд╡реЗрдВрдЯ рдореИрдиреЗрдЬрд░ рдореЗрдВ рдЬреЛрдбрд╝рддреА рд╣реИред рдореИрдВрдиреЗ рдЗрд╡реЗрдВрдЯ рдореИрдиреЗрдЬрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╕рд╛рди-рд╕реЗ-рдЙрдкрдпреЛрдЧ рд╡рд┐рдзрд┐ рднреА рдЬреЛрдбрд╝рд╛,:
%%--------------------------------------------------------------------
%% Function: notify(Event) -> ok | {error, Reason}
%% Description: Sends the Event through the event manager.
%%--------------------------------------------------------------------
notify(Event) ->
gen_event:notify(?SERVER, Event).

рдЗрд╕реЗ рд╕рдордЭрдирд╛ рднреА рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡рд┐рдзрд┐ рдмрд╕ рдЗрд╡реЗрдВрдЯ рдореИрдиреЗрдЬрд░ рдХреЛ рдЗрд╡реЗрдВрдЯ рднреЗрдЬрддреА рд╣реИред gen_event: рд╕реВрдЪрд┐рдд / 2 рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЕрдиреБрд░реЛрдз рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХ рд╡рд╛рдкрд╕реА рддреБрд░рдВрдд рд╣реЛрдЧреАред

рдЗрд╡реЗрдВрдЯ рдореИрдиреЗрдЬрд░ рдХреЛ рд╕рд░реНрд╡рд░ рд╕реЗ рдЬреЛрдбрд╝рдирд╛


рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╡реЗрдВрдЯ рдореИрдиреЗрдЬрд░ рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣реА рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдм рд╣рдо рдЗрд╕реЗ рд╕рд░реНрд╡рд░ рдореЙрдбреНрдпреВрд▓ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░реЗрдВрдЧреЗред рдмрд╛рдж рдореЗрдВ, рдПрдХ рдЕрдиреНрдп рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рдкреЗрдбрд╝реЛрдВ рдХреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░реЗрдВрдЧреЗред рдпрд╣рд╛рдБ рдореЗрд░рд╛ рдирдпрд╛ рд╕рд░реНрд╡рд░ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛрдб рд╣реИ:

init([]) ->
eb_event_manager:start_link(),
{ok, dict:new()}.


рдЕрдм рдЬрдм рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╡реЗрдВрдЯ рдореИрдиреЗрдЬрд░ рдХреЛ рд╕рд░реНрд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рдкреВрд░реЗ рдЬреАрд╡рди рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред рд╣рдорд╛рд░рд╛ рдХреНрд▓рд╛рдЗрдВрдЯ, ErlyBank, рдпрд╣ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдХрд┐ рдХрдм рдирд┐рдХрд╛рд╕реА рд╣реЛрддреА рд╣реИ ( рд▓реЗрдЦрдХ рдХрд╣рддрд╛ рд╣реИ рдЬрдорд╛, рдпрд╛рдиреА рдЬрдорд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдЧрд▓рддреА рд╣реИ, рдФрд░ рдЖрдЧреЗ рдХреЛрдб рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд░рд╛рд╢рд┐ рдХреЗ рдЗрд╕ - рд▓рдЧрднрдЧ рдЕрдиреБрд╡рд╛рджрдХ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рддрд╛ рд╣реИ) ред рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕рд░реНрд╡рд░ рд╕реЗ рдХреИрд╕реЗ рдЬреЛрдбрд╝рд╛:

handle_call({withdraw, Name, Amount}, _From, State) ->
case dict:find(Name, State) of
{ok, {_PIN, Value}} when Value < Amount ->
{reply, {error, not_enough_funds}, State};
{ok, {PIN, Value}} ->
NewBalance = Value - Amount,
NewState = dict:store(Name, {PIN, NewBalance}, State),
% Send notification
eb_event_manager:notify({withdraw, Name, Amount, NewBalance}),
{reply, {ok, NewBalance}, NewState};
error ->
{reply, {error, account_does_not_exist}, State}
end;


рдЕрдм, рдЗрд╡реЗрдВрдЯ рдореИрдиреЗрдЬрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рджреМрд░рд╛рди, рдПрдХ рдИрд╡реЗрдВрдЯ рднреА рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рд╡рд┐рдзрд┐ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реИ, рдФрд░ рдЗрд╡реЗрдВрдЯ рдореИрдиреЗрдЬрд░ рдФрд░ рд╣реИрдВрдбрд▓рд░реНрд╕ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдЪрд▓реЗрдЧреА рдФрд░ рд▓реЗрдирджреЗрди рдХреЛ рдзреАрдорд╛ рдирд╣реАрдВ рдХрд░реЗрдЧреАред рдмреЗрд╢рдХ, рдпрджрд┐ рдкреНрд░реЛрд╕реЗрд╕рд░ рдЕрддрд┐рднрд╛рд░рд┐рдд рд╣реИ, рддреЛ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдЕрдзрд┐рдХ рд╕рдордп рд▓реЗрдЧрд╛, рд▓реЗрдХрд┐рди рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рдпрд╣ рдЙрд╕реА рд╕рдордп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореИрдВ рдпрд╣рд╛рдВ рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдирд┐рдХрд╛рд╕реА рд░рд╛рд╢рд┐ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд░рд╛рд╢рд┐ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИред ErlyBank рдиреЗ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдХрд┐ рд╡реЗ рдПрдХ рд╕реАрдорд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рддрдирд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ, рдФрд░ рдпрд╣ рд╕рд░реНрд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЗрд╕реЗ рдХрдард┐рди рдХреЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд╣реЛрдЧрд╛ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рд╕рднреА рддрд░реНрдХ рдЫреЛрдбрд╝рдирд╛ рдФрд░ рдПрдХ рд╕реВрдЪрдирд╛ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред рдФрд░ рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рд╣рдо рдЖрдЧреЗ рдХрд░реЗрдВрдЧреЗ!

Eb_server.erl рдХреА рд╕рднреА рд╕рд╛рдордЧреНрд░реА рдпрд╣рд╛рдБ рджреЗрдЦреА рдЬрд╛ рд╕рдХрддреА рд╣реИ ред

рд╣реИрдВрдбрд▓рд░ рдлреНрд░реЗрдо


рдореЗрд░реЗ рдкрд╛рд╕ рд╕рднреА рдУрдЯреАрдкреА рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪрд╛ рд╣реИ рдЬреЛ рдореИрдВ рд╣рдореЗрд╢рд╛ рд╕реЗ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реВрдВред рд╡рд╣ рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд▓рд┐рдП рд╣реИ ред

рдПрдХ рдЪреАрдЬ рдЬреЛ рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЕрд▓рдЧ рдХрд░рддреА рд╣реИ: рдпрд╣рд╛рдВ рдХреЛрдИ start_link рдпрд╛ рдкреНрд░рд╛рд░рдВрдн рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИ ред рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдХрд╛рд░рдг рдРрд╕рд╛ рд╣реБрдЖ, рд╣рдо eb_event_manager рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ : add_handler (рдореЙрдбреНрдпреВрд▓) рд╡рд┐рдзрд┐, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рддреА рд╣реИ рдФрд░ рд╢реБрд░реВ рдХрд░рддреА рд╣реИ!

init([]) ->
{ok, 500}.


Gen_event рд╣реИрдВрдбрд▓рд░ рдХреЗ рд▓рд┐рдП рдЖрд░рдВрднреАрдХрд░рдг рд╡рд┐рдзрд┐ рдЕрдиреНрдп рд╕рднреА Erlang / OTP рд╡реНрдпрд╡рд╣рд╛рд░ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рдорд╛рди рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ {ok, State} рджреЗрддрд╛ рд╣реИ , рдЬрд╣рд╛рдВ рд░рд╛рдЬреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо 500 рдирдВрдмрд░ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рдЦрд╛рддреЗ рд╕реЗ рдирд┐рдХрд╛рд╕реА рдХреА рд╕реВрдЪрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЪреЗрддрд╛рд╡рдиреА рд╕реАрдорд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗред

рдХреИрд╢ рд╡рд┐рджрдбреНрд░реЙрд▓ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ


рдЗрд╕ рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдЙрджреНрджреЗрд╢реНрдп рдирд┐рдХрд╛рд╕реА рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдФрд░ рдХреБрдЫ рдХрд░рдирд╛ рд╣реИ рдЕрдЧрд░ рдирд┐рдХрд╛рд╕реА рд░рд╛рд╢рд┐ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реАрдорд╛ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИред рдШрдЯрдирд╛ рдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрджреЗрд╢ gen_event рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ : рд╕реВрдЪрд┐рдд рдХрд░реЗрдВ / 2 ред рд╣реИрдВрдбрд▓рд░реНрд╕ рдХреЛ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди рдХреЛ handle_event рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдкрд░реЛрд╕рд╛ рдЬрд╛рддрд╛ рд╣реИ:

handle_event({withdraw, Name, Amount, NewBalance}, State) when Amount >= State ->
io:format("WITHDRAWAL NOTIFICATION: ~p withdrew ~p leaving ~p left.~n", [Name, Amount, NewBalance]),
{ok, State};
handle_event(_Event, State) ->
{ok, State}.


рд╕рдВрджреЗрд╢ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рд╕рд░рд▓ рд╣реИред рд╣рдордиреЗ рдПрдХ рдШрдЯрдирд╛ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╛рдкрд╕реА рд╕рдВрджреЗрд╢ рдФрд░ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЬреЛрдбрд╝рд╛ рд╣реИ, рдХреЗрд╡рд▓ рддрднреА рдЬрдм рдереНрд░реЗрд╢реЛрд▓реНрдб рдорд╛рди рдХреА рд╡рд╛рдкрд╕реА рдХреА рдорд╛рддреНрд░рд╛ рдкрд╛рд░ рд╣реЛ рдЬрд╛рддреА рд╣реИред

рдЬрдм рдирд┐рдХрд╛рд╕реА рд░рд╛рд╢рд┐ рд╕реАрдорд╛ рдореВрд▓реНрдп рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рдЯрд░реНрдорд┐рдирд▓ рдкрд░ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддреЗ рд╣реИрдВред

рддреИрдпрд╛рд░ eb_withdrawal_handler.erl рдореЙрдбреНрдпреВрд▓ рдХреЛ рдпрд╣рд╛рдВ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

рдСрдкрд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рдереНрд░реЗрд╕рд╣реЛрд▓реНрдб рдкрд░рд┐рд╡рд░реНрддрди


ErlyBank рдиреЗ рдпрд╣ рднреА рдиреЛрдЯ рдХрд┐рдпрд╛ рдХрд┐ рд╡реЗ рдХрд╛рдо рдХреЗ рджреМрд░рд╛рди рдирдХрджреА рдирд┐рдХрд╛рд╕реА рдХреА рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдХреЗ рд▓рд┐рдП рд╕реАрдорд╛ рдХреЛ рдмрджрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдкреАрдЖрдИ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВрдЧреЗред рдпрд╣рд╛рдБ рдпрд╣ рд╣реИ:

%%--------------------------------------------------------------------
%% Function: change_threshold(Amount) -> {ok, Old, NewThreshold}
%% | {error, Reason}
%% Description: Changes the withdrawal amount threshold during runtime
%%--------------------------------------------------------------------
change_threshold(Amount) ->
gen_event:call(eb_event_manager, ?MODULE, {change_threshold, Amount}).


рдпрд╣ рдПрдХ рдирдИ get_event рд╡рд┐рдзрд┐, рдХреЙрд▓ рд╡рд┐рдзрд┐ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИред рдпрд╣ рд╡рд┐рдзрд┐ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрддреА рд╣реИ рдФрд░ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдЙрдореНрдореАрдж рдХрд░рддреА рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╕рдордХрд╛рд▓рд┐рдХ рд╣реИред рдЙрдирдХреЗ рддрд░реНрдХ рд╣реИрдВ: рдХреЙрд▓ (EventManager, рд╣реИрдВрдбрд▓рд░, рд╕рдВрджреЗрд╢) ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдЗрд╡реЗрдВрдЯ рдореИрдиреЗрдЬрд░ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВрдЧреЗ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рдкрдВрдЬреАрдХреГрдд рд╣реИред рджреВрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИрдВрдбрд▓рд░ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ, рдФрд░ рджрд╣рд▓реАрдЬ рдорд╛рди рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬреЗрдВред

рд╣рдо рдЗрд╕ рдЕрдиреБрд░реЛрдз рдХреЛ handle_call / 2 рдлреАрдбрдмреИрдХ рд╡рд┐рдзрд┐ рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

handle_call({change_threshold, Amount}, State) ->
io:format("NOTICE: Changing withdrawal threshold from ~p to ~p~n", [State, Amount]),
{ok, {ok, State, Amount}, Amount};
handle_call(_Request, State) ->
Reply = ok,
{ok, Reply, State}.


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЯрд░реНрдорд┐рдирд▓ рдкрд░ рдПрдХ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдереНрд░реЗрд╢реЛрд▓реНрдб рдмрджрд▓ рд░рд╣рд╛ рд╣реИ, рдлрд┐рд░ рд╣рдо рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рдЙрддреНрддрд░ рджреЗрдВрдЧреЗ {ok, OldThreshold, NewThreshold} рдФрд░ рдирдП рдереНрд░реЗрд╢реЛрд▓реНрдб рдорд╛рди рдХреЛ рдбреЗрдЯрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░реЗрдВред рдЕрдЧрд▓реА рд╡рд╛рдкрд╕реА рдХреА рд╕реВрдЪрдирд╛ рдорд┐рд▓рдиреЗ рдкрд░, рд╣реИрдВрдбрд▓рд░ рдирдП рдЪреЗрддрд╛рд╡рдиреА рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛! :)

рдкреВрд░реНрдг eb_withdrawal_handler рдореЙрдбреНрдпреВрд▓ рдХреЛ рдпрд╣рд╛рдБ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

рдирд┐рд╖реНрдХрд░реНрд╖


Gen_event рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ , рдореИрдВрдиреЗ рдПрдХ рдЗрд╡реЗрдВрдЯ рдореИрдиреЗрдЬрд░ рд▓рд┐рдЦрдиреЗ, рдШрдЯрдирд╛рдУрдВ рдХреЛ рднреЗрдЬрдиреЗ, рдПрдХ рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ, рдЗрди рдШрдЯрдирд╛рдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреАред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рдореИрдВрдиреЗ рдирд╣реАрдВ рдмрддрд╛рдИ рдереА рд╡рд╣ gen_event рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдЬреЛ рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдпрд╛ рдЦреБрдж рдХреЛ рджреВрд╕рд░реЗ рд╣реИрдВрдбрд▓рд░ рд╕реЗ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЗрд╕ рддрдВрддреНрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдореЗрд░рд╛ рдЕрдкрдирд╛ рд╡реНрдпрд╛рдкрдХ рдЕрдиреБрднрд╡ рдирд╣реАрдВ рд╣реИред рдЕрднреА рддрдХ рдореБрдЭреЗ рдЗрди рдЕрд╡рд╕рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ - рдкреНрд░рд▓реЗрдЦрди рджреЗрдЦреЗрдВ ред

рдФрд░ рдпрд╣ Erlang / OTP рдкрд░рд┐рдЪрдп рдЪрдХреНрд░ рдХреЗ рддреАрд╕рд░реЗ рднрд╛рдЧ рдХрд╛ рд╕рдорд╛рдкрди рдХрд░рддрд╛ рд╣реИред рдЕрдиреБрдЪреНрдЫреЗрдж рдЪрд╛рд░ рдХреБрдЫ рджрд┐рдиреЛрдВ рдореЗрдВ рдкреНрд░рдХрд╛рд╢рди рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реИ рдФрд░ рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдЧрд╛ред



рдпреВрдкреАрдбреА
рдХреБрдЯреНрдЯреВ рд╣рдмреНрд░рд╛рдпреБрдЬрд╝рд░ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдПрдХ рдЧрдВрднреАрд░ рдЪреВрдХ рдХреА рдЦреЛрдЬ рдХреА рдЧрдИ рдереА, рдЬреЛ рдореВрд▓ рдкрд╛рда рдореЗрдВ рдмрдирд╛рдИ рдЧрдИ рдереА рдФрд░ рдлрд┐рд░ рдЕрдиреБрд╡рд╛рдж рдХреЗ рд▓рд┐рдП рдЪрд▓реА рдЧрдИред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ: рд▓реЗрдЦ рдХрд╣реАрдВ рднреА рдЗрдВрдЧрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ eb_event_manager рдХреЛ рдХреЙрд▓ : add_handler (рдореЙрдбреНрдпреВрд▓) рд╣рдорд╛рд░реЗ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреЙрд▓ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдХрд╛рдо рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рд╕реНрддрд░ рдкрд░ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рддрд╛рд░реНрдХрд┐рдХ рд╕реНрдерд╛рди eb_serverl.erl рдореЗрдВ init (Args) рд╣реЛрдЧрд╛ред рдЖрд╡рд╢реНрдпрдХ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:

init([]) ->
eb_event_manager:start_link(),
eb_event_manager:add_handler(eb_withdrawal_handler),
{ok, dict:new()}.


рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓реЗрдЦреЛрдВ рдореЗрдВ, рдореВрд▓ рдкрд╛рда рдХрд╛ рд▓реЗрдЦрдХ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╡рд╛рджрд╛ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рд╢реБрд░реБрдЖрдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдХ рд╣реА рд╕реНрдерд╛рди рд╕реЗ рд▓реЙрдиреНрдЪ рдХреА рдЬрд╛рддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦреЛрдВ рдореЗрдВ рд╣реЛрдЧрд╛ред рд╣рдорд╛рд░реЗ рд╕рд╛рде рд░рд╣реЛ!

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, eb_withdrawal_handler рд╣реИрдВрдбрд▓рд░ рдХреЗ рдкреВрд░реНрдг рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рд▓рд┐рдВрдХ , рдЬрд┐рд╕реЗ рдореИрдВ рдЧрд▓рддреА рд╕реЗ рдЙрджреНрдзреГрдд рдХрд░рдирд╛ рднреВрд▓ рдЧрдпрд╛ рдерд╛, рдЕрдиреБрд╡рд╛рдж рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред


рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд▓реЗрдЦ

4. ErlyBank рдХреЛ рдмрдЪрд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
3. gen_event рдХрд╛ рдкрд░рд┐рдЪрдп: рдЪрд╛рд▓рд╛рди рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЕрдзрд┐рд╕реВрдЪрдирд╛ (рд╡рд░реНрддрдорд╛рди рд▓реЗрдЦ)

рдЕрдиреБрд╡рд╛рдж рдХрд╛ рд▓реЗрдЦрдХ tiesto рд╣реИ :
2. gen_fsm рдХрд╛ рдкрд░рд┐рдЪрдп: ErlyBank ATM
1. gen_server рдХрд╛ рдкрд░рд┐рдЪрдп: ErlyBank
0. рдУрдкрди рдЯреЗрд▓рд┐рдХреЙрдо рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо / рдУрдкрди рдЯреЗрд▓реАрдХрдореНрдпреВрдирд┐рдХреЗрд╢рди рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо (OTP / OTP) рдХрд╛ рдкрд░рд┐рдЪрдп
-1ред рдкреНрд░рд╛рдЧрд┐рддрд┐рд╣рд╛рд╕

Source: https://habr.com/ru/post/In129136/


All Articles