defmodule StaleMail do def start() do loop(%{}) end def loop(state) do newstate = receive do x -> parse(state, x) end loop(newstate) end def parse(state, arg) do case arg do { :new_mailbox, zname, _sender } -> name = String.strip(zname) old = Map.has_key?(state, name) newstate = unless old do Map.put(state, name, []) else state end newstate { :new_mail, zname, sender } -> name = String.strip(zname) # TODO: asking about new mail if state |> Map.has_key?(name) do case state |> Map.get(name, []) do [ head | _tail ] -> send sender, head state _ -> state end end state { :got_mail, zname } -> name = String.strip(zname) # TODO: delete mail with given key if state |> Map.has_key?(name) do case state |> Map.get(name, []) do [ _ | tail ] -> state |> Map.put(name, tail) _ -> state end else state end { :pass_message, zreceiver, zmessage, zsender } -> receiver = String.strip(zreceiver) message = String.strip(zmessage) sender = String.strip(zsender) # TODO: passes message to mailbox of receiver if Map.has_key?(state, receiver) do list = state |> Map.get(receiver, []) state |> Map.put(receiver, list ++ [ { :received_message, sender, message } ]) else state |> Map.put(receiver, [ { :received_message, sender, message } ]) end end end end