Pretty new to Elixir and I’ve been going through Elixir in Action. I sense this issue could be solved if I drop down to a previous Elixir version but any advice to be able to do this on 1.11 would be very nice.
In 7.2.1 it talks about implementing a cache to manage multiple to-do lists.
Code from the book’s repo: https://github.com/sasa1977/elixir-in-action/tree/master/code_samples/ch07/todo_cache/lib/todo
The problem is, when I run these commands after iex -S mix
{:ok, cache} = Todo.Cache.start()
{:ok, #PID<0.154.0>}
Todo.Cache.server_process(cache, "Bob's List")
#PID<0.156.0>
Todo.Cache.server_process(cache, "Alice's Lists")
I receive the following error:
21:28:33.353 [error] GenServer #PID<0.154.0> terminating
** (MatchError) no match of right hand side value: {:error, {:already_started, #PID<0.156.0>}}
(todo_cache 0.1.0) lib/todo/cache.ex:29: Todo.Cache.handle_call/3
(stdlib 3.13.2) gen_server.erl:706: :gen_server.try_handle_call/4
(stdlib 3.13.2) gen_server.erl:735: :gen_server.handle_msg/6
(stdlib 3.13.2) proc_lib.erl:226: :proc_lib.init_p_do_apply/3
Last message (from #PID<0.152.0>): {:server_process, "Bob's Lists"}
State: %{"Bob's List" => #PID<0.156.0>}
Client #PID<0.152.0> is alive
(stdlib 3.13.2) gen.erl:208: :gen.do_call/4
(elixir 1.11.2) lib/gen_server.ex:1024: GenServer.call/3
(stdlib 3.13.2) erl_eval.erl:680: :erl_eval.do_apply/6
(elixir 1.11.2) src/elixir.erl:280: :elixir.recur_eval/3
(elixir 1.11.2) src/elixir.erl:265: :elixir.eval_forms/3
(iex 1.11.2) lib/iex/evaluator.ex:261: IEx.Evaluator.handle_eval/5
(iex 1.11.2) lib/iex/evaluator.ex:242: IEx.Evaluator.do_eval/3
(iex 1.11.2) lib/iex/evaluator.ex:220: IEx.Evaluator.eval/3
** (exit) exited in: GenServer.call(#PID<0.154.0>, {:server_process, "Bob's Lists"}, 5000)
** (EXIT) an exception was raised:
** (MatchError) no match of right hand side value: {:error, {:already_started, #PID<0.156.0>}}
(todo_cache 0.1.0) lib/todo/cache.ex:29: Todo.Cache.handle_call/3
(stdlib 3.13.2) gen_server.erl:706: :gen_server.try_handle_call/4
(stdlib 3.13.2) gen_server.erl:735: :gen_server.handle_msg/6
(stdlib 3.13.2) proc_lib.erl:226: :proc_lib.init_p_do_apply/3
(elixir 1.11.2) lib/gen_server.ex:1027: GenServer.call/3
This seems to only happen when I change the string in the second parameter. Adding another clause for the case statement didn’t stop the error. How do I get past this?