-module(subscription). -export([start/0, subscribe/1, unsubscribe/1, send/2, stop/1]). start() -> Owner = self(), spawn_link(fun () -> loop(Owner, []) end). subscribe(Server) -> Server ! {add, self()}. unsubscribe(Server) -> Server ! {remove, self()}. send(Server, Message) -> Server ! {deliver, self(), Message}. stop(Server) -> Server ! {quit, self()}, ok. loop(Owner, Subscribers) -> receive {add, New} -> loop(Owner, add(New, Subscribers)); {remove, Old} -> loop(Owner, remove(Old, Subscribers)); {deliver, Owner, Message} -> lists:map(fun(Each) -> Each ! Message end, Subscribers), loop(Owner, Subscribers); {quit, Owner} -> ok; Other -> io:format("Subscription: didn't understand: ~w~n", [Other]), exit({subscription, bad_message}) end. add(X, []) -> [X]; add(X, [X|T]) -> [X|T]; add(X, [H|T]) -> [H|add(X, T)]. remove(_, []) -> []; remove(X, [X|T]) -> T; remove(X, [H|T]) -> [H|remove(X, T)].