Sha256: 0682642f4c1e484564a10a8c62a6328dd33fdad394c2d6e6db5e3784eaf435d8

Contents?: true

Size: 1.74 KB

Versions: 310

Compression:

Stored size: 1.74 KB

Contents

-module(example).

-export( [create/1, read/1, size/1, write/2, write_attempt/2, test_version/0] ).

create( Size ) -> erlang:spawn( fun() -> loop( 0, Size, queue:new() ) end ).

read( Pid ) -> request( Pid, read ).

size( Pid ) -> request( Pid, size ).

write( Pid, Item ) -> Pid ! {write, Item}.

write_attempt( Pid, Item ) ->
  Pid ! {write_attempt, Item, erlang:self()},
  receive
    {write_attempt, true, Pid} -> ok;
    {write_attempt, false, Pid} -> {error, full}
  end.

loop( Current_size, Max_size, Queue ) ->
  receive
    {read, Pid} ->
      {Result, New_queue} = queue:out( Queue ),
      Pid ! {read, Result, erlang:self()},
      loop( Current_size - 1, Max_size, New_queue );
    {size, Pid} ->
      Pid ! {size, Max_size, erlang:self()},
      loop( Current_size, Max_size, Queue );
    {write, Item} ->
      {New_size, New_queue} = write( Current_size, Max_size, Item, Queue ),
      loop( New_size, Max_size, New_queue );
    {write_attempt, Item, Pid} ->
      Pid ! {write_attempt, Current_size < Max_size, erlang:self()},
      {New_size, New_queue} = write_attempt( Current_size, Max_size, Item, Queue ),
      loop( New_size, Max_size, New_queue )
  end.

request( Pid, Request ) ->
  Pid ! {Request, erlang:self()},
  receive
    {Request, empty, Pid} -> {error, empty};
    {Request, {value, Answer}, Pid} -> {ok, Answer};
    {Request, Answer, Pid} -> {ok, Answer}
  end.

write( Current, Max, Item, Queue ) when Current < Max ->
  {Current + 1, queue:in( Item, Queue )};
write( Max, Max, Item, Queue ) ->
  {_Old, New_queue} = queue:out( Queue ),
  {Max, queue:in( Item, New_queue )}.

write_attempt( Max, Max, _Item, Queue ) -> {Max, Queue};
write_attempt( Current, Max, Item, Queue ) -> write( Current, Max, Item, Queue ).

test_version() ->
    1.

Version data entries

310 entries across 310 versions & 1 rubygems

Version Path
trackler-2.2.1.180 tracks/erlang/exercises/circular-buffer/src/example.erl
trackler-2.2.1.179 tracks/erlang/exercises/circular-buffer/src/example.erl
trackler-2.2.1.178 tracks/erlang/exercises/circular-buffer/src/example.erl
trackler-2.2.1.177 tracks/erlang/exercises/circular-buffer/src/example.erl
trackler-2.2.1.176 tracks/erlang/exercises/circular-buffer/src/example.erl
trackler-2.2.1.175 tracks/erlang/exercises/circular-buffer/src/example.erl
trackler-2.2.1.174 tracks/erlang/exercises/circular-buffer/src/example.erl
trackler-2.2.1.173 tracks/erlang/exercises/circular-buffer/src/example.erl
trackler-2.2.1.172 tracks/erlang/exercises/circular-buffer/src/example.erl
trackler-2.2.1.171 tracks/erlang/exercises/circular-buffer/src/example.erl
trackler-2.2.1.170 tracks/erlang/exercises/circular-buffer/src/example.erl
trackler-2.2.1.169 tracks/erlang/exercises/circular-buffer/src/example.erl
trackler-2.2.1.167 tracks/erlang/exercises/circular-buffer/src/example.erl
trackler-2.2.1.166 tracks/erlang/exercises/circular-buffer/src/example.erl
trackler-2.2.1.165 tracks/erlang/exercises/circular-buffer/src/example.erl
trackler-2.2.1.164 tracks/erlang/exercises/circular-buffer/src/example.erl
trackler-2.2.1.163 tracks/erlang/exercises/circular-buffer/src/example.erl
trackler-2.2.1.162 tracks/erlang/exercises/circular-buffer/src/example.erl
trackler-2.2.1.161 tracks/erlang/exercises/circular-buffer/src/example.erl
trackler-2.2.1.160 tracks/erlang/exercises/circular-buffer/src/example.erl