Skip to content

Instantly share code, notes, and snippets.

@santosh79
Created October 23, 2015 07:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save santosh79/b8f413c206145b755aac to your computer and use it in GitHub Desktop.
Save santosh79/b8f413c206145b755aac to your computer and use it in GitHub Desktop.
defprotocol Simple.StreamReader do
def read_line(stream)
end
defmodule Simple.Socket do
defstruct socket: nil
end
defimpl Simple.StreamReader, for: Simple.Socket do
def read_line(simple_socket) do
:gen_tcp.recv simple_socket.socket, 0
end
end
defmodule Simple.Client do
def start(socket) do
spawn Simple.Client, :loop, [socket]
end
def loop(socket) do
parser = Simple.Parser.start self, %Simple.Socket{socket: socket}
loop socket, parser
end
defp loop(socket, parser) do
receive do
{^parser, :add} -> IO.puts("got add"); loop(socket, parser)
{^parser, :remove} -> IO.puts("got remove"); loop(socket, parser)
end
end
end
defmodule Simple.Parser do
def start(client, stream) do
spawn Simple.Parser, :loop, [client, stream]
end
def loop(client, stream) do
case Simple.StreamReader.read_line(stream) ->
val ->
cond do
String.starts_with?(val, "add") -> send client, {self(), :add}
String.starts_with?(val, "remove") -> send client, {self(), :remove}
true -> :void
end
end
loop client, stream
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment