From 55589a963fd84e2a00075b8dd31eedf28624ce17 Mon Sep 17 00:00:00 2001 From: AYM1607 Date: Mon, 22 Jun 2020 09:53:15 -0500 Subject: [PATCH] Update: Finished persistable todo server --- chapter7/persistable_todo_cache/README.md | 21 ++++++ .../_build/dev/lib/todo/.mix/compile.elixir | Bin 0 -> 450 bytes .../dev/lib/todo/.mix/compile.elixir_scm | Bin 0 -> 45 bytes .../dev/lib/todo/.mix/compile.protocols | Bin 0 -> 5 bytes .../todo/consolidated/Elixir.Collectable.beam | Bin 0 -> 5012 bytes .../todo/consolidated/Elixir.Enumerable.beam | Bin 0 -> 7708 bytes .../todo/consolidated/Elixir.IEx.Info.beam | Bin 0 -> 3888 bytes .../lib/todo/consolidated/Elixir.Inspect.beam | Bin 0 -> 5936 bytes .../todo/consolidated/Elixir.List.Chars.beam | Bin 0 -> 4092 bytes .../consolidated/Elixir.String.Chars.beam | Bin 0 -> 4456 bytes .../dev/lib/todo/ebin/Elixir.Todo.Cache.beam | Bin 0 -> 5080 bytes .../lib/todo/ebin/Elixir.Todo.Database.beam | Bin 0 -> 4964 bytes .../dev/lib/todo/ebin/Elixir.Todo.List.beam | Bin 0 -> 5552 bytes .../dev/lib/todo/ebin/Elixir.Todo.Server.beam | Bin 0 -> 5064 bytes .../_build/dev/lib/todo/ebin/todo.app | 7 ++ .../test/lib/todo/.mix/.mix_test_failures | Bin 0 -> 10 bytes .../_build/test/lib/todo/.mix/compile.elixir | Bin 0 -> 458 bytes .../test/lib/todo/.mix/compile.elixir_scm | Bin 0 -> 45 bytes .../test/lib/todo/.mix/compile.protocols | Bin 0 -> 5 bytes .../todo/consolidated/Elixir.Collectable.beam | Bin 0 -> 5012 bytes .../todo/consolidated/Elixir.Enumerable.beam | Bin 0 -> 7708 bytes .../todo/consolidated/Elixir.IEx.Info.beam | Bin 0 -> 3888 bytes .../lib/todo/consolidated/Elixir.Inspect.beam | Bin 0 -> 5936 bytes .../todo/consolidated/Elixir.List.Chars.beam | Bin 0 -> 4092 bytes .../consolidated/Elixir.String.Chars.beam | Bin 0 -> 4456 bytes .../test/lib/todo/ebin/Elixir.Todo.Cache.beam | Bin 0 -> 4976 bytes .../test/lib/todo/ebin/Elixir.Todo.List.beam | Bin 0 -> 5528 bytes .../lib/todo/ebin/Elixir.Todo.Server.beam | Bin 0 -> 4992 bytes .../_build/test/lib/todo/ebin/todo.app | 7 ++ .../persistable_todo_cache/lib/todo/cache.ex | 34 ++++++++++ .../lib/todo/database.ex | 47 +++++++++++++ .../persistable_todo_cache/lib/todo/list.ex | 57 ++++++++++++++++ .../persistable_todo_cache/lib/todo/server.ex | 62 +++++++++++++++++ chapter7/persistable_todo_cache/mix.exs | 28 ++++++++ .../persist/marianos list | Bin 0 -> 199 bytes .../test/test_helper.exs | 1 + .../test/todo_cache_test.exs | 21 ++++++ .../test/todo_list_test.exs | 64 ++++++++++++++++++ chapter7/todo/.formatter.exs | 4 ++ chapter7/todo/.gitignore | 24 +++++++ chapter7/todo/README.md | 21 ++++++ chapter7/todo/lib/todo/list.ex | 47 +++++++++++++ chapter7/todo/lib/todo/server.ex | 48 +++++++++++++ chapter7/todo/mix.exs | 28 ++++++++ chapter7/todo/test/test_helper.exs | 1 + chapter7/todo_cache/README.md | 21 ++++++ .../_build/dev/lib/todo/.mix/compile.elixir | Bin 0 -> 396 bytes .../dev/lib/todo/.mix/compile.elixir_scm | Bin 0 -> 45 bytes .../dev/lib/todo/.mix/compile.protocols | Bin 0 -> 5 bytes .../todo/consolidated/Elixir.Collectable.beam | Bin 0 -> 5012 bytes .../todo/consolidated/Elixir.Enumerable.beam | Bin 0 -> 7708 bytes .../todo/consolidated/Elixir.IEx.Info.beam | Bin 0 -> 3888 bytes .../lib/todo/consolidated/Elixir.Inspect.beam | Bin 0 -> 5936 bytes .../todo/consolidated/Elixir.List.Chars.beam | Bin 0 -> 4092 bytes .../consolidated/Elixir.String.Chars.beam | Bin 0 -> 4456 bytes .../dev/lib/todo/ebin/Elixir.Todo.Cache.beam | Bin 0 -> 4976 bytes .../dev/lib/todo/ebin/Elixir.Todo.List.beam | Bin 0 -> 4940 bytes .../dev/lib/todo/ebin/Elixir.Todo.Server.beam | Bin 0 -> 4976 bytes .../_build/dev/lib/todo/ebin/todo.app | 7 ++ .../test/lib/todo/.mix/.mix_test_failures | Bin 0 -> 10 bytes .../_build/test/lib/todo/.mix/compile.elixir | Bin 0 -> 458 bytes .../test/lib/todo/.mix/compile.elixir_scm | Bin 0 -> 45 bytes .../test/lib/todo/.mix/compile.protocols | Bin 0 -> 5 bytes .../todo/consolidated/Elixir.Collectable.beam | Bin 0 -> 5012 bytes .../todo/consolidated/Elixir.Enumerable.beam | Bin 0 -> 7708 bytes .../todo/consolidated/Elixir.IEx.Info.beam | Bin 0 -> 3888 bytes .../lib/todo/consolidated/Elixir.Inspect.beam | Bin 0 -> 5936 bytes .../todo/consolidated/Elixir.List.Chars.beam | Bin 0 -> 4092 bytes .../consolidated/Elixir.String.Chars.beam | Bin 0 -> 4456 bytes .../test/lib/todo/ebin/Elixir.Todo.Cache.beam | Bin 0 -> 4976 bytes .../test/lib/todo/ebin/Elixir.Todo.List.beam | Bin 0 -> 5528 bytes .../lib/todo/ebin/Elixir.Todo.Server.beam | Bin 0 -> 4992 bytes .../_build/test/lib/todo/ebin/todo.app | 7 ++ chapter7/todo_cache/lib/todo/cache.ex | 33 +++++++++ chapter7/todo_cache/lib/todo/list.ex | 57 ++++++++++++++++ chapter7/todo_cache/lib/todo/server.ex | 48 +++++++++++++ chapter7/todo_cache/mix.exs | 28 ++++++++ chapter7/todo_cache/test/test_helper.exs | 1 + chapter7/todo_cache/test/todo_cache_test.exs | 21 ++++++ chapter7/todo_cache/test/todo_list_test.exs | 64 ++++++++++++++++++ 80 files changed, 809 insertions(+) create mode 100644 chapter7/persistable_todo_cache/README.md create mode 100644 chapter7/persistable_todo_cache/_build/dev/lib/todo/.mix/compile.elixir create mode 100644 chapter7/persistable_todo_cache/_build/dev/lib/todo/.mix/compile.elixir_scm create mode 100644 chapter7/persistable_todo_cache/_build/dev/lib/todo/.mix/compile.protocols create mode 100644 chapter7/persistable_todo_cache/_build/dev/lib/todo/consolidated/Elixir.Collectable.beam create mode 100644 chapter7/persistable_todo_cache/_build/dev/lib/todo/consolidated/Elixir.Enumerable.beam create mode 100644 chapter7/persistable_todo_cache/_build/dev/lib/todo/consolidated/Elixir.IEx.Info.beam create mode 100644 chapter7/persistable_todo_cache/_build/dev/lib/todo/consolidated/Elixir.Inspect.beam create mode 100644 chapter7/persistable_todo_cache/_build/dev/lib/todo/consolidated/Elixir.List.Chars.beam create mode 100644 chapter7/persistable_todo_cache/_build/dev/lib/todo/consolidated/Elixir.String.Chars.beam create mode 100644 chapter7/persistable_todo_cache/_build/dev/lib/todo/ebin/Elixir.Todo.Cache.beam create mode 100644 chapter7/persistable_todo_cache/_build/dev/lib/todo/ebin/Elixir.Todo.Database.beam create mode 100644 chapter7/persistable_todo_cache/_build/dev/lib/todo/ebin/Elixir.Todo.List.beam create mode 100644 chapter7/persistable_todo_cache/_build/dev/lib/todo/ebin/Elixir.Todo.Server.beam create mode 100644 chapter7/persistable_todo_cache/_build/dev/lib/todo/ebin/todo.app create mode 100644 chapter7/persistable_todo_cache/_build/test/lib/todo/.mix/.mix_test_failures create mode 100644 chapter7/persistable_todo_cache/_build/test/lib/todo/.mix/compile.elixir create mode 100644 chapter7/persistable_todo_cache/_build/test/lib/todo/.mix/compile.elixir_scm create mode 100644 chapter7/persistable_todo_cache/_build/test/lib/todo/.mix/compile.protocols create mode 100644 chapter7/persistable_todo_cache/_build/test/lib/todo/consolidated/Elixir.Collectable.beam create mode 100644 chapter7/persistable_todo_cache/_build/test/lib/todo/consolidated/Elixir.Enumerable.beam create mode 100644 chapter7/persistable_todo_cache/_build/test/lib/todo/consolidated/Elixir.IEx.Info.beam create mode 100644 chapter7/persistable_todo_cache/_build/test/lib/todo/consolidated/Elixir.Inspect.beam create mode 100644 chapter7/persistable_todo_cache/_build/test/lib/todo/consolidated/Elixir.List.Chars.beam create mode 100644 chapter7/persistable_todo_cache/_build/test/lib/todo/consolidated/Elixir.String.Chars.beam create mode 100644 chapter7/persistable_todo_cache/_build/test/lib/todo/ebin/Elixir.Todo.Cache.beam create mode 100644 chapter7/persistable_todo_cache/_build/test/lib/todo/ebin/Elixir.Todo.List.beam create mode 100644 chapter7/persistable_todo_cache/_build/test/lib/todo/ebin/Elixir.Todo.Server.beam create mode 100644 chapter7/persistable_todo_cache/_build/test/lib/todo/ebin/todo.app create mode 100644 chapter7/persistable_todo_cache/lib/todo/cache.ex create mode 100644 chapter7/persistable_todo_cache/lib/todo/database.ex create mode 100644 chapter7/persistable_todo_cache/lib/todo/list.ex create mode 100644 chapter7/persistable_todo_cache/lib/todo/server.ex create mode 100644 chapter7/persistable_todo_cache/mix.exs create mode 100644 chapter7/persistable_todo_cache/persist/marianos list create mode 100644 chapter7/persistable_todo_cache/test/test_helper.exs create mode 100644 chapter7/persistable_todo_cache/test/todo_cache_test.exs create mode 100644 chapter7/persistable_todo_cache/test/todo_list_test.exs create mode 100644 chapter7/todo/.formatter.exs create mode 100644 chapter7/todo/.gitignore create mode 100644 chapter7/todo/README.md create mode 100644 chapter7/todo/lib/todo/list.ex create mode 100644 chapter7/todo/lib/todo/server.ex create mode 100644 chapter7/todo/mix.exs create mode 100644 chapter7/todo/test/test_helper.exs create mode 100644 chapter7/todo_cache/README.md create mode 100644 chapter7/todo_cache/_build/dev/lib/todo/.mix/compile.elixir create mode 100644 chapter7/todo_cache/_build/dev/lib/todo/.mix/compile.elixir_scm create mode 100644 chapter7/todo_cache/_build/dev/lib/todo/.mix/compile.protocols create mode 100644 chapter7/todo_cache/_build/dev/lib/todo/consolidated/Elixir.Collectable.beam create mode 100644 chapter7/todo_cache/_build/dev/lib/todo/consolidated/Elixir.Enumerable.beam create mode 100644 chapter7/todo_cache/_build/dev/lib/todo/consolidated/Elixir.IEx.Info.beam create mode 100644 chapter7/todo_cache/_build/dev/lib/todo/consolidated/Elixir.Inspect.beam create mode 100644 chapter7/todo_cache/_build/dev/lib/todo/consolidated/Elixir.List.Chars.beam create mode 100644 chapter7/todo_cache/_build/dev/lib/todo/consolidated/Elixir.String.Chars.beam create mode 100644 chapter7/todo_cache/_build/dev/lib/todo/ebin/Elixir.Todo.Cache.beam create mode 100644 chapter7/todo_cache/_build/dev/lib/todo/ebin/Elixir.Todo.List.beam create mode 100644 chapter7/todo_cache/_build/dev/lib/todo/ebin/Elixir.Todo.Server.beam create mode 100644 chapter7/todo_cache/_build/dev/lib/todo/ebin/todo.app create mode 100644 chapter7/todo_cache/_build/test/lib/todo/.mix/.mix_test_failures create mode 100644 chapter7/todo_cache/_build/test/lib/todo/.mix/compile.elixir create mode 100644 chapter7/todo_cache/_build/test/lib/todo/.mix/compile.elixir_scm create mode 100644 chapter7/todo_cache/_build/test/lib/todo/.mix/compile.protocols create mode 100644 chapter7/todo_cache/_build/test/lib/todo/consolidated/Elixir.Collectable.beam create mode 100644 chapter7/todo_cache/_build/test/lib/todo/consolidated/Elixir.Enumerable.beam create mode 100644 chapter7/todo_cache/_build/test/lib/todo/consolidated/Elixir.IEx.Info.beam create mode 100644 chapter7/todo_cache/_build/test/lib/todo/consolidated/Elixir.Inspect.beam create mode 100644 chapter7/todo_cache/_build/test/lib/todo/consolidated/Elixir.List.Chars.beam create mode 100644 chapter7/todo_cache/_build/test/lib/todo/consolidated/Elixir.String.Chars.beam create mode 100644 chapter7/todo_cache/_build/test/lib/todo/ebin/Elixir.Todo.Cache.beam create mode 100644 chapter7/todo_cache/_build/test/lib/todo/ebin/Elixir.Todo.List.beam create mode 100644 chapter7/todo_cache/_build/test/lib/todo/ebin/Elixir.Todo.Server.beam create mode 100644 chapter7/todo_cache/_build/test/lib/todo/ebin/todo.app create mode 100644 chapter7/todo_cache/lib/todo/cache.ex create mode 100644 chapter7/todo_cache/lib/todo/list.ex create mode 100644 chapter7/todo_cache/lib/todo/server.ex create mode 100644 chapter7/todo_cache/mix.exs create mode 100644 chapter7/todo_cache/test/test_helper.exs create mode 100644 chapter7/todo_cache/test/todo_cache_test.exs create mode 100644 chapter7/todo_cache/test/todo_list_test.exs diff --git a/chapter7/persistable_todo_cache/README.md b/chapter7/persistable_todo_cache/README.md new file mode 100644 index 0000000..6b31c9c --- /dev/null +++ b/chapter7/persistable_todo_cache/README.md @@ -0,0 +1,21 @@ +# Todo + +**TODO: Add description** + +## Installation + +If [available in Hex](https://hex.pm/docs/publish), the package can be installed +by adding `todo` to your list of dependencies in `mix.exs`: + +```elixir +def deps do + [ + {:todo, "~> 0.1.0"} + ] +end +``` + +Documentation can be generated with [ExDoc](https://github.com/elixir-lang/ex_doc) +and published on [HexDocs](https://hexdocs.pm). Once published, the docs can +be found at [https://hexdocs.pm/todo](https://hexdocs.pm/todo). + diff --git a/chapter7/persistable_todo_cache/_build/dev/lib/todo/.mix/compile.elixir b/chapter7/persistable_todo_cache/_build/dev/lib/todo/.mix/compile.elixir new file mode 100644 index 0000000000000000000000000000000000000000..916882cd4ae72badc9160af6b1019f748e6068f3 GIT binary patch literal 450 zcmV;z0X_bMPyhf1RCt`lluJ&-Fc5}aLR-Z9wd4%p3iGCCW`HUeviKyI|=Ae5kfYTAt$3$^IQQZ#}g&y!h}=Jb@&A415CB* z)q@m2$4bo39V*W4LJ`7TauQ@hwY(0SUU$N}uG3-Vq;TE)BpVLr15UQ1$U2iV7e&2R zW12f12~G$251BIptPdr!mBdjq@{+Oyx>+1mSuihHbDYzr(-n1eMs1JTX=TO>P3fA6`Lvu#R=+$dSs05>E7IU&!?0;Y6vs;cSGn$jLVt5NC0~OxETrjGphO#$b z!@bsWP4ot`Wtrt7xiN02bR7GT9_VWrl#rkDck~igWAsTmhn30V@G_ys*0Ya!=0pk; zW4w01n0+vsfwfXDlNt2(qg>(F=^>;y{Pgi#4SN0Q9Ml^-&9v%LK51ipc0$=7!!EI1 zm^e?dR~N@#o-wG^m>SR&JHIOIJ10BEV3Or&gG;A2t5mu@jaW9m{-vq58co&v!2C^H swa7MDcAtnn)g+-=#tdB|VeWsQ>@~ literal 0 HcmV?d00001 diff --git a/chapter7/persistable_todo_cache/_build/dev/lib/todo/.mix/compile.elixir_scm b/chapter7/persistable_todo_cache/_build/dev/lib/todo/.mix/compile.elixir_scm new file mode 100644 index 0000000000000000000000000000000000000000..f129754528b5d3280720a0a194d920e9c61c7db7 GIT binary patch literal 45 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 YqU9fa_g%Pq;-tmh032NW|98dze;M1& literal 0 HcmV?d00001 diff --git a/chapter7/persistable_todo_cache/_build/dev/lib/todo/consolidated/Elixir.Enumerable.beam b/chapter7/persistable_todo_cache/_build/dev/lib/todo/consolidated/Elixir.Enumerable.beam new file mode 100644 index 0000000000000000000000000000000000000000..ac7f27deefc03f27e51af67a042f09e2f9a9215a GIT binary patch literal 7708 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 #g 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 literal 0 HcmV?d00001 diff --git a/chapter7/persistable_todo_cache/_build/dev/lib/todo/consolidated/Elixir.IEx.Info.beam b/chapter7/persistable_todo_cache/_build/dev/lib/todo/consolidated/Elixir.IEx.Info.beam new file mode 100644 index 0000000000000000000000000000000000000000..c777470b24ef4800f1cb31897544b560cde9b889 GIT binary patch literal 3888 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 Sar9nDGGRl;6Fqpm_x>Nl4`tr~ literal 0 HcmV?d00001 diff --git a/chapter7/persistable_todo_cache/_build/dev/lib/todo/consolidated/Elixir.Inspect.beam b/chapter7/persistable_todo_cache/_build/dev/lib/todo/consolidated/Elixir.Inspect.beam new file mode 100644 index 0000000000000000000000000000000000000000..63b17f2a4e87a940fde60aa98bd3b306742d9b45 GIT binary patch literal 5936 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 literal 0 HcmV?d00001 diff --git a/chapter7/persistable_todo_cache/_build/dev/lib/todo/consolidated/Elixir.List.Chars.beam b/chapter7/persistable_todo_cache/_build/dev/lib/todo/consolidated/Elixir.List.Chars.beam new file mode 100644 index 0000000000000000000000000000000000000000..d4e8fb6f80398c527797cfa9dac6e2c8370201e0 GIT binary patch literal 4092 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 literal 0 HcmV?d00001 diff --git a/chapter7/persistable_todo_cache/_build/dev/lib/todo/consolidated/Elixir.String.Chars.beam b/chapter7/persistable_todo_cache/_build/dev/lib/todo/consolidated/Elixir.String.Chars.beam new file mode 100644 index 0000000000000000000000000000000000000000..84c95b87dde72e4551d6d6222923b3f90a87c82b GIT binary patch literal 4456 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 literal 0 HcmV?d00001 diff --git a/chapter7/persistable_todo_cache/_build/dev/lib/todo/ebin/Elixir.Todo.Cache.beam b/chapter7/persistable_todo_cache/_build/dev/lib/todo/ebin/Elixir.Todo.Cache.beam new file mode 100644 index 0000000000000000000000000000000000000000..3a948773f5af4c0085e0e3a42cc28e05b2b8daf8 GIT binary patch literal 5080 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 K2JJX#UjGk8vexDR literal 0 HcmV?d00001 diff --git a/chapter7/persistable_todo_cache/_build/dev/lib/todo/ebin/Elixir.Todo.List.beam b/chapter7/persistable_todo_cache/_build/dev/lib/todo/ebin/Elixir.Todo.List.beam new file mode 100644 index 0000000000000000000000000000000000000000..d85d8ab716e5f773b58d198ffad0560ccf061478 GIT binary patch literal 5552 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 AkN^Mx literal 0 HcmV?d00001 diff --git a/chapter7/persistable_todo_cache/_build/test/lib/todo/.mix/compile.elixir_scm b/chapter7/persistable_todo_cache/_build/test/lib/todo/.mix/compile.elixir_scm new file mode 100644 index 0000000000000000000000000000000000000000..f129754528b5d3280720a0a194d920e9c61c7db7 GIT binary patch literal 45 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 YqU9fa_g%Pq;-tmh032NW|98dze;M1& literal 0 HcmV?d00001 diff --git a/chapter7/persistable_todo_cache/_build/test/lib/todo/consolidated/Elixir.Enumerable.beam b/chapter7/persistable_todo_cache/_build/test/lib/todo/consolidated/Elixir.Enumerable.beam new file mode 100644 index 0000000000000000000000000000000000000000..ac7f27deefc03f27e51af67a042f09e2f9a9215a GIT binary patch literal 7708 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 #g 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 literal 0 HcmV?d00001 diff --git a/chapter7/persistable_todo_cache/_build/test/lib/todo/consolidated/Elixir.IEx.Info.beam b/chapter7/persistable_todo_cache/_build/test/lib/todo/consolidated/Elixir.IEx.Info.beam new file mode 100644 index 0000000000000000000000000000000000000000..c777470b24ef4800f1cb31897544b560cde9b889 GIT binary patch literal 3888 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 Sar9nDGGRl;6Fqpm_x>Nl4`tr~ literal 0 HcmV?d00001 diff --git a/chapter7/persistable_todo_cache/_build/test/lib/todo/consolidated/Elixir.Inspect.beam b/chapter7/persistable_todo_cache/_build/test/lib/todo/consolidated/Elixir.Inspect.beam new file mode 100644 index 0000000000000000000000000000000000000000..63b17f2a4e87a940fde60aa98bd3b306742d9b45 GIT binary patch literal 5936 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 literal 0 HcmV?d00001 diff --git a/chapter7/persistable_todo_cache/_build/test/lib/todo/consolidated/Elixir.List.Chars.beam b/chapter7/persistable_todo_cache/_build/test/lib/todo/consolidated/Elixir.List.Chars.beam new file mode 100644 index 0000000000000000000000000000000000000000..d4e8fb6f80398c527797cfa9dac6e2c8370201e0 GIT binary patch literal 4092 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 literal 0 HcmV?d00001 diff --git a/chapter7/persistable_todo_cache/_build/test/lib/todo/consolidated/Elixir.String.Chars.beam b/chapter7/persistable_todo_cache/_build/test/lib/todo/consolidated/Elixir.String.Chars.beam new file mode 100644 index 0000000000000000000000000000000000000000..84c95b87dde72e4551d6d6222923b3f90a87c82b GIT binary patch literal 4456 zcmbVQ3pkY7|9{7j@iM%O+%Mx&LdLj-beZImbt{F4rn$Tr#tbuK3>&TFmacwOlMwoa zN~CrbwMBAiOH$F&#-g%GZLMl`{hilkYxnW|pJ)H`Jm2|#&i8h{=RIf6_xp~Ae}D}H zscvy~U*)?>6zBv&G9MraqLSRX90^B2SuYZBc#)LVQ4E2QK&Nwf5qvrwW{7~8nIJ-i z@+^LA9EXd-Y&1@QvKS(itq_sGV~IF?o^W0)gC*b#@v&@&d9i$U0vDZ!3b+hjq)H?z zqEAbvLMm`#g25G{cpir@t;2mt~9N7WD#u2xExQG-bc?#fIQ zvMiE;%>t85XtH=IIUYf9UD!;pI)WQKLe#()1JWeJ^GQ^q2FZm))YTk>HHhGX# zm_l3tTN6!j1kVG3>HR^dIKrZ7A#gYUYTxh>1WxM)>>zl>#$ntZ zkSrkVj3@$<0fe0uRX{jEm|X2EjM?DaB~!j^fC+%8GkWtG3>ahv$O;e^!vqkf!>~Re z^%<-TIB5ne0ge%7gT=)1z_5%DM}*}$0ERJ=Bj~=L{9J92%v?sPplqRz#H%h;H=MKV zwBFSdyK0UFeC+rS>%xZQ8_l{)$avzOL2c4cYZy2iqm1NvC3LOQv@1oDw!7^a&Gyt& zM&eT$MPU)w3!0a|`h*vhcjR8>kG@&jD_T)_Kv$`s^{KJbuwrjg2IRwMVe7>90$K$s z5@0{1bHO)0N`?*L#X=r7!0{01El&Jrpx3r5zLK5moE0UTqcH;lo5SEHC4-8DSz!_t z9zT&G;L&Fb*k7^!cIPmrZ2zh+)59+njDd@u4nKQKeF+b0+tejQ2UUu}OJYOQ)h;?3 zf>wL+B0v_hU-Fk1Pgj>1NY0V6gkpmwC_jC939*oJY)G32s$Co-kw>4Y!UF7SWT8SK z8&Zf6@MD2ofKIJz3IQz|$G{}Yz>|>x(f~ImUm(I_&*Sj8pss$&cBX31*3sE@%@cx4 zm4(JY!PapCju>3L)}q)rYjmn#u(GAvQmOW~4puf)XD9F-C1Bc%g|k{4iVc-wXU*j> zXCzY)OayuiYZlgHP*6#<8#9sv)@Pf(7J>}%k|V!_jO`t^NBj##^}om`cI&t4{eBN@W^J(mH}nEJ%2V893gTdx@Xht(gC5$X@g&>c#<|cN<#mMh&F5u2l*2B30hy1myYJy5G?XeRno> zRB5%xQ0~ggmc1@v7mf4Y-`ORqAz8*fzwM)`o zhWh<}X)ZPQb=V8-{UvEisVhE3c(D5d$19Io>@MrJGx?o=qQFE`-@$OZn*~!t&Hbvi zYQ6lYgu7oHuAx`?G-(b$ znLt}ji`JjExLuQfD63QV@tF4D@`}1>D$6p-UVmxg&E8(0M_V&GQ|?TdFcd>^5A1GQ z7q3j`B=2_Ub{-NpCh0jsZ_8JHwn%T@Rb9ru_4X$GYTfzzbB9Alc+wBV%k9ilwZ{W@ zRrkb=Hy?28N^D&GS^-i0ey~r5uqXDp!smv9=WLO^BBiIz z1B+}Qp54z7?A-LtHKg(oQ!Fmemb7{7@H4JI+QhecEYK*t%lr5S7eT)2y;MtI?0cdx z#Fn{r;PF1!qbEy~U;UD7!DS8RDH)8XaL-2WACLYqULh*{*W=qZIU4I%^IAGj&pQ=N zIycc3!ErxvvZElzfAk`1C!5mSs59ocdCYgL$)o46mZNUQ`;s!j<{shAFPyuv4;)b z)=%Eq3@*3VA6T!D)Y^J4Q{Tv3L#rR*Rko(Qn*2|Ye(#c>>Xs!B$3NZe6#Yv@PnvRN zewnl@c-__u2UK*=xTH2E+&q}+zs|Df(m|YW?V>(rX_x`JyWzi!6php6a_kyzHgpER zxfj#nu^0WE6rNl*cDH(4LqN$Ioh?o3V=e17?l|9nKkl@ji>q#nF4lWeqv{!H7HMX- zx6{C|sCere^AANG9p&z!6UBS{{aZ`)+PKWniOZ801bU8vMZa18_|4vb} zdgf} zaPX3SY13!r^NsLD@dL;28iNK;%SnDNC*?n2-aBqt9(<*;;9ZUUHS+Ld_tX4U^+OJ4 z4e2}UUy?JEFZH&DIfgEatG4g!p`R;|_N50q$fRd0`aQ{M=vr_$)4O!r(K^%Pk3u&7 zW;tw7nCM%b#806p4KH^SevTf?eW|>O8?i856^lY zI*%(RmQYAW1rHUk|500!&B_f@@2)slSG{M{@WJq>E(mhtvxK0IbYXWVzDRPUD9@MQ zPgTk+SPWtKn z?r!{vA2YGab<8}#UBd^eS?x_Z)E&KX|1ArF?zo93-ZlHjlguX$ZbJjzP7^L0_nmd2 zT3-3#`{S;D;g3TOz^{t~pPYzlw|Vawc`?Ym@$QzxJx@Iv+cikG+Es)UdavUv*dTiS zy`yX7vwd{l5qAAt?%%xEp*HvKmXRgg=o6d{yOoxSXNQBFIxqJt9+6t} zp6IPe$;1nq_IpbsIgI94i9wf7ReTe+t2vsjL5X!&OV-+GLqiAHT|WR?bRn&MVeCE7|4} z78y#EZ~t|1R{lrRx8HX==Wnbo>3O$pWbyOR>K4 le>s3Y%?Gqd;8|mR`s@b*V5;|4vr*81NLX|8kB$Zy{1454dHetX literal 0 HcmV?d00001 diff --git a/chapter7/persistable_todo_cache/_build/test/lib/todo/ebin/Elixir.Todo.Cache.beam b/chapter7/persistable_todo_cache/_build/test/lib/todo/ebin/Elixir.Todo.Cache.beam new file mode 100644 index 0000000000000000000000000000000000000000..7dfbe6c176c281c3b40fd612fb2b9cee16aec9d2 GIT binary patch literal 4976 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 IhYCUe0n|m^&Hw-a literal 0 HcmV?d00001 diff --git a/chapter7/persistable_todo_cache/_build/test/lib/todo/ebin/Elixir.Todo.List.beam b/chapter7/persistable_todo_cache/_build/test/lib/todo/ebin/Elixir.Todo.List.beam new file mode 100644 index 0000000000000000000000000000000000000000..6be843793a610b7636b277f565c03d23930d8767 GIT binary patch literal 5528 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 literal 0 HcmV?d00001 diff --git a/chapter7/persistable_todo_cache/_build/test/lib/todo/ebin/Elixir.Todo.Server.beam b/chapter7/persistable_todo_cache/_build/test/lib/todo/ebin/Elixir.Todo.Server.beam new file mode 100644 index 0000000000000000000000000000000000000000..8205ea2c48562e0f7df2ed394977bba450180572 GIT binary patch literal 4992 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 + {:reply, todo_server, todo_servers} + + :error -> + {:ok, new_todo_server} = Todo.Server.start(todo_list_name) + + { + :reply, + new_todo_server, + Map.put(todo_servers, todo_list_name, new_todo_server) + } + end + end +end diff --git a/chapter7/persistable_todo_cache/lib/todo/database.ex b/chapter7/persistable_todo_cache/lib/todo/database.ex new file mode 100644 index 0000000..89b30db --- /dev/null +++ b/chapter7/persistable_todo_cache/lib/todo/database.ex @@ -0,0 +1,47 @@ +defmodule Todo.Database do + use GenServer + + @db_folder "./persist" + + def start do + GenServer.start(__MODULE__, nil, name: __MODULE__) + end + + def store(key, data) do + GenServer.cast(__MODULE__, {:store, key, data}) + end + + def get(key) do + GenServer.call(__MODULE__, {:get, key}) + end + + @impl true + def init(_) do + File.mkdir_p!(@db_folder) + {:ok, nil} + end + + @impl true + def handle_cast({:store, key, data}, state) do + key + |> file_name() + |> File.write!(:erlang.term_to_binary(data)) + + {:noreply, state} + end + + @impl true + def handle_call({:get, key}, _, state) do + data = + case File.read(file_name(key)) do + {:ok, contents} -> :erlang.binary_to_term(contents) + _ -> nil + end + + {:reply, data, state} + end + + def file_name(key) do + Path.join(@db_folder, to_string(key)) + end +end diff --git a/chapter7/persistable_todo_cache/lib/todo/list.ex b/chapter7/persistable_todo_cache/lib/todo/list.ex new file mode 100644 index 0000000..9e1ed06 --- /dev/null +++ b/chapter7/persistable_todo_cache/lib/todo/list.ex @@ -0,0 +1,57 @@ +defmodule Todo.List do + defstruct auto_id: 1, entries: %{} + + def new(entries \\ []) do + Enum.reduce( + entries, + %Todo.List{}, + &add_entry(&2, &1) + ) + end + + def size(todo_list) do + map_size(todo_list.entries) + end + + def add_entry(todo_list, entry) do + entry = Map.put(entry, :id, todo_list.auto_id) + + new_entries = + Map.put( + todo_list.entries, + todo_list.auto_id, + entry + ) + + %Todo.List{todo_list | entries: new_entries, auto_id: todo_list.auto_id + 1} + end + + def entries(todo_list, date) do + todo_list.entries + |> Stream.filter(fn {_, entry} -> entry.date == date end) + |> Enum.map(fn {_, entry} -> entry end) + end + + def update_entry(todo_list, %{} = new_entry) do + update_entry(todo_list, new_entry.id, fn _ -> new_entry end) + end + + def update_entry(todo_list, entry_id, updater_fun) do + case Map.fetch(todo_list.entries, entry_id) do + :error -> + todo_list + + {:ok, old_entry} -> + old_entry_id = old_entry.id + # Make sure that the result of the updater is a map and the + # id remains unchanged. + new_entry = %{id: ^old_entry_id} = updater_fun.(old_entry) + new_entries = Map.put(todo_list.entries, new_entry.id, new_entry) + %Todo.List{todo_list | entries: new_entries} + end + end + + def delete_entry(todo_list, entry_id) do + %Todo.List{todo_list | entries: Map.delete(todo_list.entries, entry_id)} + end +end diff --git a/chapter7/persistable_todo_cache/lib/todo/server.ex b/chapter7/persistable_todo_cache/lib/todo/server.ex new file mode 100644 index 0000000..5f32c74 --- /dev/null +++ b/chapter7/persistable_todo_cache/lib/todo/server.ex @@ -0,0 +1,62 @@ +defmodule Todo.Server do + use GenServer + + def start(todo_list_name) do + GenServer.start(__MODULE__, todo_list_name) + end + + def add_entry(pid, entry) do + GenServer.cast(pid, {:add_entry, entry}) + end + + def delete_entry(pid, entry_id) do + GenServer.cast(pid, {:delete_entry, entry_id}) + end + + def update_entry(pid, entry_id, updater_fun) do + GenServer.cast(pid, {:update_entry, entry_id, updater_fun}) + end + + def entries(pid, date) do + GenServer.call(pid, {:entries, date}) + end + + @impl true + def init(todo_list_name) do + send(self(), :init_data) + {:ok, {todo_list_name, nil}} + end + + @impl true + def handle_cast({:add_entry, entry}, {name, todo_list}) do + # Get the new todo list. + new_list = Todo.List.add_entry(todo_list, entry) + # Persist the new list to disk. + Todo.Database.store(name, new_list) + {:noreply, {name, new_list}} + end + + @impl true + def handle_cast({:delete_entry, entry_id}, {name, todo_list}) do + new_list = Todo.List.delete_entry(todo_list, entry_id) + Todo.Database.store(name, new_list) + {:noreply, {name, new_list}} + end + + @impl true + def handle_cast({:update_entry, entry_id, updater_fun}, {name, todo_list}) do + new_list = Todo.List.update_entry(todo_list, entry_id, updater_fun) + Todo.Database.store(name, new_list) + {:noreply, {name, new_list}} + end + + @impl true + def handle_call({:entries, date}, _, {_, todo_list} = state) do + {:reply, Todo.List.entries(todo_list, date), state} + end + + @impl true + def handle_info(:init_data, {name, _}) do + {:noreply, {name, Todo.Database.get(name) || Todo.List.new()}} + end +end diff --git a/chapter7/persistable_todo_cache/mix.exs b/chapter7/persistable_todo_cache/mix.exs new file mode 100644 index 0000000..f7ef09c --- /dev/null +++ b/chapter7/persistable_todo_cache/mix.exs @@ -0,0 +1,28 @@ +defmodule Todo.MixProject do + use Mix.Project + + def project do + [ + app: :todo, + version: "0.1.0", + elixir: "~> 1.10", + start_permanent: Mix.env() == :prod, + deps: deps() + ] + end + + # Run "mix help compile.app" to learn about applications. + def application do + [ + extra_applications: [:logger] + ] + end + + # Run "mix help deps" to learn about dependencies. + defp deps do + [ + # {:dep_from_hexpm, "~> 0.3.0"}, + # {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"} + ] + end +end diff --git a/chapter7/persistable_todo_cache/persist/marianos list b/chapter7/persistable_todo_cache/persist/marianos list new file mode 100644 index 0000000000000000000000000000000000000000..22ac27d979640869085091eba2e3c013100a0a41 GIT binary patch literal 199 zcmZ9GK?=e!5Je}orJ^nb?~zMbK|ye#`!IF}45SGpQ?P5V>Oo8(D|e6i{5St20I(w1 z7?UK&%Ar_sJe6-}b}sw?tUWo} literal 0 HcmV?d00001 diff --git a/chapter7/persistable_todo_cache/test/test_helper.exs b/chapter7/persistable_todo_cache/test/test_helper.exs new file mode 100644 index 0000000..869559e --- /dev/null +++ b/chapter7/persistable_todo_cache/test/test_helper.exs @@ -0,0 +1 @@ +ExUnit.start() diff --git a/chapter7/persistable_todo_cache/test/todo_cache_test.exs b/chapter7/persistable_todo_cache/test/todo_cache_test.exs new file mode 100644 index 0000000..711d58d --- /dev/null +++ b/chapter7/persistable_todo_cache/test/todo_cache_test.exs @@ -0,0 +1,21 @@ +defmodule TodoCacheTest do + use ExUnit.Case + + test "server_process" do + {:ok, cache} = Todo.Cache.start() + bob_pid = Todo.Cache.server_process(cache, "bob") + + assert bob_pid != Todo.Cache.server_process(cache, "alice") + assert bob_pid == Todo.Cache.server_process(cache, "bob") + end + + test "to-do operations" do + {:ok, cache} = Todo.Cache.start() + alice = Todo.Cache.server_process(cache, "alice") + + Todo.Server.add_entry(alice, %{date: ~D[2020-12-12], title: "Hello"}) + entries = Todo.Server.entries(alice, ~D[2020-12-12]) + + assert [%{date: ~D[2020-12-12], title: "Hello"}] = entries + end +end diff --git a/chapter7/persistable_todo_cache/test/todo_list_test.exs b/chapter7/persistable_todo_cache/test/todo_list_test.exs new file mode 100644 index 0000000..0575e8c --- /dev/null +++ b/chapter7/persistable_todo_cache/test/todo_list_test.exs @@ -0,0 +1,64 @@ +defmodule TodoListTest do + use ExUnit.Case, async: true + + test "empty list" do + assert Todo.List.size(Todo.List.new()) == 0 + end + + test "entries" do + todo_list = + Todo.List.new([ + %{date: ~D[2018-12-19], title: "Dentist"}, + %{date: ~D[2018-12-20], title: "Shopping"}, + %{date: ~D[2018-12-19], title: "Movies"} + ]) + + assert Todo.List.size(todo_list) == 3 + assert todo_list |> Todo.List.entries(~D[2018-12-19]) |> length() == 2 + assert todo_list |> Todo.List.entries(~D[2018-12-20]) |> length() == 1 + assert todo_list |> Todo.List.entries(~D[2018-12-21]) |> length() == 0 + + titles = todo_list |> Todo.List.entries(~D[2018-12-19]) |> Enum.map(& &1.title) + assert ["Dentist", "Movies"] = titles + end + + test "add_entry" do + todo_list = + Todo.List.new() + |> Todo.List.add_entry(%{date: ~D[2018-12-19], title: "Dentist"}) + |> Todo.List.add_entry(%{date: ~D[2018-12-20], title: "Shopping"}) + |> Todo.List.add_entry(%{date: ~D[2018-12-19], title: "Movies"}) + + assert Todo.List.size(todo_list) == 3 + assert todo_list |> Todo.List.entries(~D[2018-12-19]) |> length() == 2 + assert todo_list |> Todo.List.entries(~D[2018-12-20]) |> length() == 1 + assert todo_list |> Todo.List.entries(~D[2018-12-21]) |> length() == 0 + + titles = todo_list |> Todo.List.entries(~D[2018-12-19]) |> Enum.map(& &1.title) + assert ["Dentist", "Movies"] = titles + end + + test "update_entry" do + todo_list = + Todo.List.new() + |> Todo.List.add_entry(%{date: ~D[2018-12-19], title: "Dentist"}) + |> Todo.List.add_entry(%{date: ~D[2018-12-20], title: "Shopping"}) + |> Todo.List.add_entry(%{date: ~D[2018-12-19], title: "Movies"}) + |> Todo.List.update_entry(2, &Map.put(&1, :title, "Updated shopping")) + + assert Todo.List.size(todo_list) == 3 + assert [%{title: "Updated shopping"}] = Todo.List.entries(todo_list, ~D[2018-12-20]) + end + + test "delete_entry" do + todo_list = + Todo.List.new() + |> Todo.List.add_entry(%{date: ~D[2018-12-19], title: "Dentist"}) + |> Todo.List.add_entry(%{date: ~D[2018-12-20], title: "Shopping"}) + |> Todo.List.add_entry(%{date: ~D[2018-12-19], title: "Movies"}) + |> Todo.List.delete_entry(2) + + assert Todo.List.size(todo_list) == 2 + assert Todo.List.entries(todo_list, ~D[2018-12-20]) == [] + end +end diff --git a/chapter7/todo/.formatter.exs b/chapter7/todo/.formatter.exs new file mode 100644 index 0000000..d2cda26 --- /dev/null +++ b/chapter7/todo/.formatter.exs @@ -0,0 +1,4 @@ +# Used by "mix format" +[ + inputs: ["{mix,.formatter}.exs", "{config,lib,test}/**/*.{ex,exs}"] +] diff --git a/chapter7/todo/.gitignore b/chapter7/todo/.gitignore new file mode 100644 index 0000000..001bac6 --- /dev/null +++ b/chapter7/todo/.gitignore @@ -0,0 +1,24 @@ +# The directory Mix will write compiled artifacts to. +/_build/ + +# If you run "mix test --cover", coverage assets end up here. +/cover/ + +# The directory Mix downloads your dependencies sources to. +/deps/ + +# Where third-party dependencies like ExDoc output generated docs. +/doc/ + +# Ignore .fetch files in case you like to edit your project deps locally. +/.fetch + +# If the VM crashes, it generates a dump, let's ignore it too. +erl_crash.dump + +# Also ignore archive artifacts (built via "mix archive.build"). +*.ez + +# Ignore package tarball (built via "mix hex.build"). +todo-*.tar + diff --git a/chapter7/todo/README.md b/chapter7/todo/README.md new file mode 100644 index 0000000..6b31c9c --- /dev/null +++ b/chapter7/todo/README.md @@ -0,0 +1,21 @@ +# Todo + +**TODO: Add description** + +## Installation + +If [available in Hex](https://hex.pm/docs/publish), the package can be installed +by adding `todo` to your list of dependencies in `mix.exs`: + +```elixir +def deps do + [ + {:todo, "~> 0.1.0"} + ] +end +``` + +Documentation can be generated with [ExDoc](https://github.com/elixir-lang/ex_doc) +and published on [HexDocs](https://hexdocs.pm). Once published, the docs can +be found at [https://hexdocs.pm/todo](https://hexdocs.pm/todo). + diff --git a/chapter7/todo/lib/todo/list.ex b/chapter7/todo/lib/todo/list.ex new file mode 100644 index 0000000..228cd8e --- /dev/null +++ b/chapter7/todo/lib/todo/list.ex @@ -0,0 +1,47 @@ +defmodule Todo.List do + defstruct auto_id: 1, entries: %{} + + def new(), do: %Todo.List{} + + def add_entry(todo_list, entry) do + entry = Map.put(entry, :id, todo_list.auto_id) + + new_entries = + Map.put( + todo_list.entries, + todo_list.auto_id, + entry + ) + + %Todo.List{todo_list | entries: new_entries, auto_id: todo_list.auto_id + 1} + end + + def entries(todo_list, date) do + todo_list.entries + |> Stream.filter(fn {_, entry} -> entry.date == date end) + |> Enum.map(fn {_, entry} -> entry end) + end + + def update_entry(todo_list, %{} = new_entry) do + update_entry(todo_list, new_entry.id, fn _ -> new_entry end) + end + + def update_entry(todo_list, entry_id, updater_fun) do + case Map.fetch(todo_list.entries, entry_id) do + :error -> + todo_list + + {:ok, old_entry} -> + old_entry_id = old_entry.id + # Make sure that the result of the updater is a map and the + # id remains unchanged. + new_entry = %{id: ^old_entry_id} = updater_fun.(old_entry) + new_entries = Map.put(todo_list.entries, new_entry.id, new_entry) + %Todo.List{todo_list | entries: new_entries} + end + end + + def delete_entry(todo_list, entry_id) do + %Todo.List{todo_list | entries: Map.delete(todo_list.entries, entry_id)} + end +end diff --git a/chapter7/todo/lib/todo/server.ex b/chapter7/todo/lib/todo/server.ex new file mode 100644 index 0000000..c42f664 --- /dev/null +++ b/chapter7/todo/lib/todo/server.ex @@ -0,0 +1,48 @@ +defmodule Todo.Server do + use GenServer + + def start do + GenServer.start(__MODULE__, nil) + end + + def add_entry(pid, entry) do + GenServer.cast(pid, {:add_entry, entry}) + end + + def delete_entry(pid, entry_id) do + GenServer.cast(pid, {:delete_entry, entry_id}) + end + + def update_entry(pid, entry_id, updater_fun) do + GenServer.cast(pid, {:update_entry, entry_id, updater_fun}) + end + + def entries(pid, date) do + GenServer.call(pid, {:entries, date}) + end + + @impl true + def init(_) do + {:ok, Todo.List.new()} + end + + @impl true + def handle_cast({:add_entry, entry}, state) do + {:noreply, Todo.List.add_entry(state, entry)} + end + + @impl true + def handle_cast({:delete_entry, entry_id}, state) do + {:noreply, Todo.List.delete_entry(state, entry_id)} + end + + @impl true + def handle_cast({:update_entry, entry_id, updater_fun}, state) do + {:noreply, Todo.List.update_entry(state, entry_id, updater_fun)} + end + + @impl true + def handle_call({:entries, date}, _, state) do + {:reply, Todo.List.entries(state, date), state} + end +end diff --git a/chapter7/todo/mix.exs b/chapter7/todo/mix.exs new file mode 100644 index 0000000..f7ef09c --- /dev/null +++ b/chapter7/todo/mix.exs @@ -0,0 +1,28 @@ +defmodule Todo.MixProject do + use Mix.Project + + def project do + [ + app: :todo, + version: "0.1.0", + elixir: "~> 1.10", + start_permanent: Mix.env() == :prod, + deps: deps() + ] + end + + # Run "mix help compile.app" to learn about applications. + def application do + [ + extra_applications: [:logger] + ] + end + + # Run "mix help deps" to learn about dependencies. + defp deps do + [ + # {:dep_from_hexpm, "~> 0.3.0"}, + # {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"} + ] + end +end diff --git a/chapter7/todo/test/test_helper.exs b/chapter7/todo/test/test_helper.exs new file mode 100644 index 0000000..869559e --- /dev/null +++ b/chapter7/todo/test/test_helper.exs @@ -0,0 +1 @@ +ExUnit.start() diff --git a/chapter7/todo_cache/README.md b/chapter7/todo_cache/README.md new file mode 100644 index 0000000..6b31c9c --- /dev/null +++ b/chapter7/todo_cache/README.md @@ -0,0 +1,21 @@ +# Todo + +**TODO: Add description** + +## Installation + +If [available in Hex](https://hex.pm/docs/publish), the package can be installed +by adding `todo` to your list of dependencies in `mix.exs`: + +```elixir +def deps do + [ + {:todo, "~> 0.1.0"} + ] +end +``` + +Documentation can be generated with [ExDoc](https://github.com/elixir-lang/ex_doc) +and published on [HexDocs](https://hexdocs.pm). Once published, the docs can +be found at [https://hexdocs.pm/todo](https://hexdocs.pm/todo). + diff --git a/chapter7/todo_cache/_build/dev/lib/todo/.mix/compile.elixir b/chapter7/todo_cache/_build/dev/lib/todo/.mix/compile.elixir new file mode 100644 index 0000000000000000000000000000000000000000..ed97bdca98e8a40b983393e4077c2bc72d78d323 GIT binary patch literal 396 zcmV;70dxL?Pyhe~pm?0clS@v+Fcd}ImbR!+=!YQ_HjuIfR8AV>59`mRnbOb87(17NxA98 zoya{Qc literal 0 HcmV?d00001 diff --git a/chapter7/todo_cache/_build/dev/lib/todo/.mix/compile.elixir_scm b/chapter7/todo_cache/_build/dev/lib/todo/.mix/compile.elixir_scm new file mode 100644 index 0000000000000000000000000000000000000000..f129754528b5d3280720a0a194d920e9c61c7db7 GIT binary patch literal 45 zcmZq9U`}MrV9I4+U|=)UGc?dM&SqdTGEQL-cFoDG$Sl(H&8*N1cJ|c^NG!mTfpnSxWQYfZvFQRPhs_rarO|mDJ~EVHCK}3Ngt0(TkjJ921Em5%0d-Nc z;8L6!%4JalI6O6x02+%ABH2uqNH~oZ1}ZOw;lbkwICKunz?;ng1DI@(LE-T@JaI6R z4szkiL_oML%w!8VsAX?xDwQwbh0z66>hf}&pjZt&1w4=zDz)T#1C1Z#$fOG-e`$My z0_;-LW%JT_%#y;5#)Z1&mRi5$$6&EX@gI8raw7i^op1n1Wqhp7)mK9=?@0c z!kL^f-r@$*X)KmMjUK|saTd0N#-jeElK5q(0S68P1OUVU^dG}Q1pg`^(uN3yz~%!& zICU&S)dnd;95x2+!L8o@6rOhym~Dn2k#R^of=qS>Am%|9g1&pmNIay?2i#Qw1UDZm zglokj_N~BT$w=XRtT6VK4YHI-?#>y>K^(<$ff6K9^^-6KDTJgrW0A;IERc^C!(#KX zC@f@Ogu~(ySMybcaA-Uh(Y)kERT#S;o&}B9APXb&Rrg}Ch==e@XaW{7T!;uMi!FQU|BX1Lxf~?SSFH3V77804h<{9)XfyNEu3j?7ZMkk?c%@?Ucx9ZI~;==|-=D>{TFpWg;1^gHc1T#;77t zstfr=sV!NkFO1X$5Gaksd}B!nl;)xmGS~WLACLe5{gJ%jjdcm-!rT-hVTjNWNkAk7 z5xn=(5FsFf^|)VTcnpFPxnRqHWE4cYOZ{3)GQ~Q8&pX5_W$EEiwI;#jsFe%U7bCsevWg^X&b+ zL|k6U)Qyz(8ZEDW*Vj$49Bq?KqccXe%tv19Ro)z(zOb!i>;6KCE=vSK=F`CoHfG_v z6D3kwt6w&`S_kV-wnoR1BOR396N+73o^6pIr=KNxgXgfucE;5i$fn6R)B5h`PZU4Q z7_v&!e&Mk3R-!ZcO_9s{U6j(m`E^+(W66!Z?Ax+;Q_jXtFyHSiQj2N65YzhMf??^# z9ajLrl|zTu0p}X9gCH7WwaF~#iwqKC0LXAY8*U)jSioE}H{8)@8|AcrdolBj4K5fS zfMPIdtf*)RqTx}nMvBdepz+w$WkmnW*METoZDH(RsJqzw8`5cr;6?Y#u=2Ni2<#V7 zgDT)qY3wKlun7Ob!2sak!VZ9i)SSUAYzLr5P2h*%hy8yLX>iY=lIA9g9i0OZ&l zDxXV>U{jZlB_51rbdb+y0OA2WPAH`3feY(ekf2_WOM^9%kR>e)3Il>T4o?947G<(o z&_VNev`c5n^69d?E>S*&f^;wh*k;J(F~cFGG!%q#4Z(%;Q{R|mOd^>Yo9P>otSq5# z5YOK)-0c7j85(Lq!Z(*7aY-qSJnz&u5+9VzL(*g z*$0a9R90lz{u$riF#1s->2#And5jXiUuOsJTEUM_MA~=(+R>5FJoDK0^6T!sg~+`2 zt?2r@nl2hEt!>M-<{<@5tJcYZi2snXvq{22N7}^?p+?f4>4;67 z81#Iw>Nw?i7S13?eOgoZvj_R$I^V5MIbY-h73)r5zILMiKx@>YBdd?BJ!0bW1owd& zJlzp*^44B!N|b%XyV)Y`#u-ZVmCc!VXZI+KxHP72pgv|!RhX`jxLtSL<#OXg{LD(t zt;$J@55T|G{=>%u({C_u`YPbJg$DoQ^mDe z%*b8&xWu|^bwKt=%tWHbhvuaFUV$@WuMT$U#p_I+R%%SN{_2$J^jb0`*NKeW?%SO# z=$;+oJb$~(X|?coW3vY$l$nbCI%nQLps%(k^mO)-Q{+4 za`&wt*K=#v_DeLM?UJZ}dCwwz*T&lG2-@@S?5W23i(;Y2hQ=qxX!$MiYC==Pl`kx` zcVc^G$G37f-;!CIpA>)r8o+ey*7qkjl`*4bLEw^?r!6aMEdHZItBmb(${Y^)37YSa^%xM{7}QRVF6v;|oe1i(;dT zVm91pL?-G~YpRDT#+^J6p*fj!{w<&;-JbW2rW9Xj)YGZt_qle@+s%VX>;mljgtwoo zhKd53f}46sFPrPnCEiK7lS!*Q@}}&$ez4cTso8Us+mV=ef)m?r9dGYAB{+BUkkif9 zu=khvIi{T7`$YAlbe^S^cAvi@^37;8vn{RhNoC^!io(I7^zyFL^8Lvwf25-(&(E(9 z_x$bA*DF{2xRTq^gITRVgf5&`(|owRjsgOADthPo9G!34DK*gXuhh|x#C4*R3YtCk088YqV4k3 zmA1XsKUPS5Q+2aC*>O|wb=Y7Nt+rxlwKM1N*Uv_}->qvnMaBbf9EroGmKsx!d{VqD z5l`~1_tw}ch_t-7vj4fQ7u3w@$?Y>@)NCw#j1JC_-D&X7POm~wUd&!(!|tHAdh#AB zmaHujJqBWdIhWYF#C6|)p7Lq+M!nVAIWO1xpuK$m_2_SwjS1+aY5rG@7q>UNkq*y~ zq5`YwwtLiLQ%ot)m`YCS+y%F&21ahuizPM}GLvfw9o6;iQT1OSDHI>jW^o_HferBAHcOW{S>zTh>f2`OiO;g-vc;HfM z;i|8QGG^yVY*y>@*s7JSk7Yg^xLTp3zM1r3*CjZg8nsT@{&Y+Kk1W4}Y6 zWBuh@CFeq_q%}|3ztu-2kk;L`_TW#?Mf(fP@4otd%z2IZRaVVG+Rrr%^eHgNY)$$x5AKG7CA`#smdL2cH5A{`(-RchtM|H?+gSH_Fh1+P(u~v*rKc6#ixdCxAU^EQ#Ngs-aRXQ^CQJwbgkZ$cJ8s!nLc)7#Z=oT zxylFiszRA(D8!7;i9|(rnn_!BQo|2Yd75&m+iLW;K9ae5BtElRCo282vu#*Q%<*fS zlVYIYWX;t)7r!bqVxb?BYLZ#8=0%o&!cNIgW#myKBDX#GOG!-}^0Lxbn~px=R>wES z8Rs%mz$b%=GcT?Fh{$Z9Z7}JNXbb<@V|HU|$8JLA=YofsJ2DtH-EW<@#1mf4>)yv- zzjE}?hLB@Kld6({m|~r|*~-I;l`2Y?Ud&;RuxqBFikK4V5CYZEQOR&QE4^5dQt3e; zJp|-Y!;J*c5V(d0BjJ*Fv4##3g2(<(dA~GJ`tLU$D)fND=dhtm1@uzG0E9!BYzEYT zo@N#u{Lk|M4e{??{Boc8_r|~8KK{M+!Yk6hi#ZrdFm#1jxGjY(KT$!~7{C>}LO@Ip YqU9fa_g%Pq;-tmh032NW|98dze;M1& literal 0 HcmV?d00001 diff --git a/chapter7/todo_cache/_build/dev/lib/todo/consolidated/Elixir.Enumerable.beam b/chapter7/todo_cache/_build/dev/lib/todo/consolidated/Elixir.Enumerable.beam new file mode 100644 index 0000000000000000000000000000000000000000..ac7f27deefc03f27e51af67a042f09e2f9a9215a GIT binary patch literal 7708 zcmbVxc|4SD_xOw%jA0o2&e(UxPNcDAP4>_-#uyA^hMBRYM2J*U$x@cclCq>MWl2<$ z3dx#;vKQG>TKL{0z0dP|pZA~VH=oa$bFQ;o*E!dH?)zMybM4*ltO){1@R?bf?lYyk z8Gt|#Q4k2E%WX*_MiQy&mgKNt0u|>&BEYa%BH53E#lmrPI+f@XMkml%@s!{YB8dR^ zC4^83cpRPJ%jOqG#?y%uGL0n|ho@3#kYHb3mSBo+7>U3_pptN8e=dIl9s8TJJtZ@q z5=N%85racWSU(C?irEiGq7fiuB8fR1M+zfI?D*nHrO+vO3Q66K>`U+?k_o<+R4Rqa zMu@}{LKsUj6BuLGU_!7Dfx3r3$P&K>70KXyAbHeouSSC9eu)`n{gej_9wA-Co=Btf|I-GD?teJBcPH&Qu-K5DJi%fScpwic zB%&`PGxsnva)1T}o<4!ohY)}ZCsM+w+Zo7)$B{@rID8O|hq9eXI1=_hEcU;pD#)DT zO8|kGE&=Zd5&*`p3;;9$>|kUzh>1rU2}T(~_yxzc2xbIlHy=x?+eyMjT`(HM1K|Z@ zFjgP{IbxWAe{T$g7vN@t98e%|NH&s*rws{?G1PDkvxt!Dj?{B8YikyHX3jjSK-5K?G57B-9eZ1hKS2LLkXVP&SGciOfd9 zkia4jd62x|o@_J|51bDL9_K)zFuYIrYX7Qw(37+4eo zS7cx@3|xtU#W8SY2A0rANJ21h6$UMtgFpeaDuYJtLr4L%8iSU?tT2%Dw(shI?=nUZ zgtTBRTmzxtgOG=#5pow1vS66(_Oph`VXROLeR+%(nt>HCa7_kQWaJ543$RxL>=glz zwGk?C9fUF%ro5dPFcpjy@a(}b)oo2(5E!QRJ5i8mFiib76EN5KTLM8qzz4*Yk&rgQ zAq=bo02BZ?0PFxT0l*Ca4**~Q7<}Hp(F`51W#qPPGC(uNx;t`>9U4F&H2|~#V9cQe zfcg$C17N`&nh(GNJ2YcGegGf00;p7_`ENr z8<}&?vC#pdiKO$GMIM4V7IE&u*w|hAAjK?of$O%|*eTNF(`Pe});1htn19rqN=Wgm z)xMJJiNKROgyM5kXf<<5Cs*HiQi|Pj&K&VQ)mzsd@sVxbYq>T|eAmm_l6V=!QRc-X zYcdAmjr--6S7vLrXWY zKOG5miHTj_2>&U1#iXI@{tc9!`swHxIr;vO!7s<@LyIl&w~eyv=f6FaYoxS*FLdUz z*;DYqUTi;8kSS1u0lF@p1pGq+n0!Hya2lC00F#j*jLUeq#&P%~OU<5@j--N_K!yU$ zmxv=p9R+GILyN)TB2yx8R5JEY$^Oq=|IbGhx2^l10{VOSSGC501AkBd=d=6Q^gtco z{;Fc>6fBM$#OUjYcd>U{rxqjF{Whp z1qqWWSXu}!f{ficcTgGMdOU$f^98Z_Q7ORyA1L~axV9-kN(jL*IGg|n7Y4WilmH5q z&X}8pNG1Vih`+quITrjmDEx_wg$7g!JRu0QUn7J{3BygruCqxEX`1lh+Al6&)j=&4W6`8Z( zb&&Gbf^U6smkmuujfYPW^(F4<^nf(jZO$(942a*!$&2mTm0E?y@Me6F@jH3TpYfBs zH^9%j1Lid1vzH@D-DmYv^~-E88@qmaVK`$Hk-z-u#*F7J39%ycr&dN6w1-#9<%GUB znuMb`t?1EC#twDK1W!A2Y6DIVoSQ^TDndG?r{ zz4=tnT}+{!`}A8yx>(P|*-Zn^++3Ld`7;|I_VuuRi|Klp5OT3r9C->dZbGx31l7!V z(&%z=rWo+s0I?rZ^ujFPPNy*TRiPhE=glNr%?_D`%=47?#It#=kEfnLR|ud$fM@);PP+{oQvChB!5CgiaPq)qlByn!8Tt&=g9z zUD5Nz*wF@6bDcyZr%Ov)oSldSEgyeK=*G_$t3!>8Xg0I2w_bbKLb1hsHhkYDP(6*^ z9CwKruMw@M@2wZcUn!sQ`=OHeC2#x(SoXSA8r+MUy#=h3pmXr?2Mv@u<^k_!L6nqx z%sOvpqjH`EH%IF|*fR(`i~W!a*ktK&=a&MH4T-`{sI>I(0d`X5n;(Y8F9U4oZmOH# z995kT1{YuSnwdIeRDW0R)sOd8Ed(dFcNle5!_*tvN!$_P=g_>#yz|qoEo&O+*r|X+ zj~lqpO(_H)>ig=Nmv0bj@!{IuDq%icQ{aq2MEZJb0Gq*+X41W||~934Iqhb1+uDHdi8jF1GAj^&+x*M4(736rKEW7j!IWx3gP2 #g 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 literal 0 HcmV?d00001 diff --git a/chapter7/todo_cache/_build/dev/lib/todo/consolidated/Elixir.IEx.Info.beam b/chapter7/todo_cache/_build/dev/lib/todo/consolidated/Elixir.IEx.Info.beam new file mode 100644 index 0000000000000000000000000000000000000000..c777470b24ef4800f1cb31897544b560cde9b889 GIT binary patch literal 3888 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 Sar9nDGGRl;6Fqpm_x>Nl4`tr~ literal 0 HcmV?d00001 diff --git a/chapter7/todo_cache/_build/dev/lib/todo/consolidated/Elixir.Inspect.beam b/chapter7/todo_cache/_build/dev/lib/todo/consolidated/Elixir.Inspect.beam new file mode 100644 index 0000000000000000000000000000000000000000..63b17f2a4e87a940fde60aa98bd3b306742d9b45 GIT binary patch literal 5936 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 literal 0 HcmV?d00001 diff --git a/chapter7/todo_cache/_build/dev/lib/todo/consolidated/Elixir.List.Chars.beam b/chapter7/todo_cache/_build/dev/lib/todo/consolidated/Elixir.List.Chars.beam new file mode 100644 index 0000000000000000000000000000000000000000..d4e8fb6f80398c527797cfa9dac6e2c8370201e0 GIT binary patch literal 4092 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 literal 0 HcmV?d00001 diff --git a/chapter7/todo_cache/_build/dev/lib/todo/consolidated/Elixir.String.Chars.beam b/chapter7/todo_cache/_build/dev/lib/todo/consolidated/Elixir.String.Chars.beam new file mode 100644 index 0000000000000000000000000000000000000000..84c95b87dde72e4551d6d6222923b3f90a87c82b GIT binary patch literal 4456 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 literal 0 HcmV?d00001 diff --git a/chapter7/todo_cache/_build/dev/lib/todo/ebin/Elixir.Todo.Cache.beam b/chapter7/todo_cache/_build/dev/lib/todo/ebin/Elixir.Todo.Cache.beam new file mode 100644 index 0000000000000000000000000000000000000000..7dfbe6c176c281c3b40fd612fb2b9cee16aec9d2 GIT binary patch literal 4976 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 IhYCUe0n|m^&Hw-a literal 0 HcmV?d00001 diff --git a/chapter7/todo_cache/_build/dev/lib/todo/ebin/Elixir.Todo.List.beam b/chapter7/todo_cache/_build/dev/lib/todo/ebin/Elixir.Todo.List.beam new file mode 100644 index 0000000000000000000000000000000000000000..8f9845ce7fa93c61c75c699b5e0d6e50e08bde73 GIT binary patch literal 4940 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 Yu=}$6vpv{i_CWR^whx2&-)+i&03B50^8f$< literal 0 HcmV?d00001 diff --git a/chapter7/todo_cache/_build/dev/lib/todo/ebin/Elixir.Todo.Server.beam b/chapter7/todo_cache/_build/dev/lib/todo/ebin/Elixir.Todo.Server.beam new file mode 100644 index 0000000000000000000000000000000000000000..c926ce421f12be8be5cfa631673a36f80ac6286a GIT binary patch literal 4976 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 literal 0 HcmV?d00001 diff --git a/chapter7/todo_cache/_build/dev/lib/todo/ebin/todo.app b/chapter7/todo_cache/_build/dev/lib/todo/ebin/todo.app new file mode 100644 index 0000000..5e22f56 --- /dev/null +++ b/chapter7/todo_cache/_build/dev/lib/todo/ebin/todo.app @@ -0,0 +1,7 @@ +{application,todo, + [{applications,[kernel,stdlib,elixir,logger]}, + {description,"todo"}, + {modules,['Elixir.Todo.Cache','Elixir.Todo.List', + 'Elixir.Todo.Server']}, + {registered,[]}, + {vsn,"0.1.0"}]}. diff --git a/chapter7/todo_cache/_build/test/lib/todo/.mix/.mix_test_failures b/chapter7/todo_cache/_build/test/lib/todo/.mix/.mix_test_failures new file mode 100644 index 0000000000000000000000000000000000000000..002e9d79caf0621ef4cb8f933fa9a484a64e60fc GIT binary patch literal 10 PcmZq9U`k{xVE_UE4bcI_ literal 0 HcmV?d00001 diff --git a/chapter7/todo_cache/_build/test/lib/todo/.mix/compile.elixir b/chapter7/todo_cache/_build/test/lib/todo/.mix/compile.elixir new file mode 100644 index 0000000000000000000000000000000000000000..a9665eb555773d5be95e4245b94a6ae3f6f6df90 GIT binary patch literal 458 zcmV;*0X6=EPyhe~^?01cRLgGLFc75e*eRU4wVfOjKwluYpHKuw4@rQcPR;^DE+n!P zX)LM2=$G}JFAHfsEZNGTK!IEYad&4pJG)XgqGLq}8D(QmCb{8-0#4>@C3XViN5f5g zFRW{Fp>~k_$6Sf$mGk+P^7$BcG8?);#K|;Ctiyu2B) zh-DkO0sIYkDr4Emu=|Q2gp-jLs>8KtbKO#w!70_Ep<4eckr}1q@(Q@*+ivB?33^R(8SrvJx^wzjLKn*H>azc6BbvJqs zJHe=WM9O{zZ)Tk|Cs)<^8>U6>eO@CPlw~)EYA+3F?x$8upj%EZs>50rxhx@rY)EH& zY-oS#%VI13!0PMXjY!yt!xn*22Rx2K@aD-vRB6rWHYv*^p{)bTE7qP3kw;da4#s;u zdP)hvoG&r+oWY%&mZAGo7VEFXGT)K0<$2JR+Z}C AkN^Mx literal 0 HcmV?d00001 diff --git a/chapter7/todo_cache/_build/test/lib/todo/.mix/compile.elixir_scm b/chapter7/todo_cache/_build/test/lib/todo/.mix/compile.elixir_scm new file mode 100644 index 0000000000000000000000000000000000000000..f129754528b5d3280720a0a194d920e9c61c7db7 GIT binary patch literal 45 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 YqU9fa_g%Pq;-tmh032NW|98dze;M1& literal 0 HcmV?d00001 diff --git a/chapter7/todo_cache/_build/test/lib/todo/consolidated/Elixir.Enumerable.beam b/chapter7/todo_cache/_build/test/lib/todo/consolidated/Elixir.Enumerable.beam new file mode 100644 index 0000000000000000000000000000000000000000..ac7f27deefc03f27e51af67a042f09e2f9a9215a GIT binary patch literal 7708 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 #g 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 literal 0 HcmV?d00001 diff --git a/chapter7/todo_cache/_build/test/lib/todo/consolidated/Elixir.IEx.Info.beam b/chapter7/todo_cache/_build/test/lib/todo/consolidated/Elixir.IEx.Info.beam new file mode 100644 index 0000000000000000000000000000000000000000..c777470b24ef4800f1cb31897544b560cde9b889 GIT binary patch literal 3888 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 Sar9nDGGRl;6Fqpm_x>Nl4`tr~ literal 0 HcmV?d00001 diff --git a/chapter7/todo_cache/_build/test/lib/todo/consolidated/Elixir.Inspect.beam b/chapter7/todo_cache/_build/test/lib/todo/consolidated/Elixir.Inspect.beam new file mode 100644 index 0000000000000000000000000000000000000000..63b17f2a4e87a940fde60aa98bd3b306742d9b45 GIT binary patch literal 5936 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 literal 0 HcmV?d00001 diff --git a/chapter7/todo_cache/_build/test/lib/todo/consolidated/Elixir.List.Chars.beam b/chapter7/todo_cache/_build/test/lib/todo/consolidated/Elixir.List.Chars.beam new file mode 100644 index 0000000000000000000000000000000000000000..d4e8fb6f80398c527797cfa9dac6e2c8370201e0 GIT binary patch literal 4092 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 literal 0 HcmV?d00001 diff --git a/chapter7/todo_cache/_build/test/lib/todo/consolidated/Elixir.String.Chars.beam b/chapter7/todo_cache/_build/test/lib/todo/consolidated/Elixir.String.Chars.beam new file mode 100644 index 0000000000000000000000000000000000000000..84c95b87dde72e4551d6d6222923b3f90a87c82b GIT binary patch literal 4456 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 literal 0 HcmV?d00001 diff --git a/chapter7/todo_cache/_build/test/lib/todo/ebin/Elixir.Todo.Cache.beam b/chapter7/todo_cache/_build/test/lib/todo/ebin/Elixir.Todo.Cache.beam new file mode 100644 index 0000000000000000000000000000000000000000..7dfbe6c176c281c3b40fd612fb2b9cee16aec9d2 GIT binary patch literal 4976 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 IhYCUe0n|m^&Hw-a literal 0 HcmV?d00001 diff --git a/chapter7/todo_cache/_build/test/lib/todo/ebin/Elixir.Todo.List.beam b/chapter7/todo_cache/_build/test/lib/todo/ebin/Elixir.Todo.List.beam new file mode 100644 index 0000000000000000000000000000000000000000..6be843793a610b7636b277f565c03d23930d8767 GIT binary patch literal 5528 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 literal 0 HcmV?d00001 diff --git a/chapter7/todo_cache/_build/test/lib/todo/ebin/Elixir.Todo.Server.beam b/chapter7/todo_cache/_build/test/lib/todo/ebin/Elixir.Todo.Server.beam new file mode 100644 index 0000000000000000000000000000000000000000..8205ea2c48562e0f7df2ed394977bba450180572 GIT binary patch literal 4992 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 + {:reply, todo_server, todo_servers} + + :error -> + {:ok, new_todo_server} = Todo.Server.start() + + { + :reply, + new_todo_server, + Map.put(todo_servers, todo_list_name, new_todo_server) + } + end + end +end diff --git a/chapter7/todo_cache/lib/todo/list.ex b/chapter7/todo_cache/lib/todo/list.ex new file mode 100644 index 0000000..af13fbe --- /dev/null +++ b/chapter7/todo_cache/lib/todo/list.ex @@ -0,0 +1,57 @@ +defmodule Todo.List do + defstruct auto_id: 1, entries: %{} + + def new(entries \\ []) do + Enum.reduce( + entries, + %Todo.List{}, + &add_entry(&2, &1) + ) + end + + def size(todo_list) do + Map.size(todo_list.entries) + end + + def add_entry(todo_list, entry) do + entry = Map.put(entry, :id, todo_list.auto_id) + + new_entries = + Map.put( + todo_list.entries, + todo_list.auto_id, + entry + ) + + %Todo.List{todo_list | entries: new_entries, auto_id: todo_list.auto_id + 1} + end + + def entries(todo_list, date) do + todo_list.entries + |> Stream.filter(fn {_, entry} -> entry.date == date end) + |> Enum.map(fn {_, entry} -> entry end) + end + + def update_entry(todo_list, %{} = new_entry) do + update_entry(todo_list, new_entry.id, fn _ -> new_entry end) + end + + def update_entry(todo_list, entry_id, updater_fun) do + case Map.fetch(todo_list.entries, entry_id) do + :error -> + todo_list + + {:ok, old_entry} -> + old_entry_id = old_entry.id + # Make sure that the result of the updater is a map and the + # id remains unchanged. + new_entry = %{id: ^old_entry_id} = updater_fun.(old_entry) + new_entries = Map.put(todo_list.entries, new_entry.id, new_entry) + %Todo.List{todo_list | entries: new_entries} + end + end + + def delete_entry(todo_list, entry_id) do + %Todo.List{todo_list | entries: Map.delete(todo_list.entries, entry_id)} + end +end diff --git a/chapter7/todo_cache/lib/todo/server.ex b/chapter7/todo_cache/lib/todo/server.ex new file mode 100644 index 0000000..c42f664 --- /dev/null +++ b/chapter7/todo_cache/lib/todo/server.ex @@ -0,0 +1,48 @@ +defmodule Todo.Server do + use GenServer + + def start do + GenServer.start(__MODULE__, nil) + end + + def add_entry(pid, entry) do + GenServer.cast(pid, {:add_entry, entry}) + end + + def delete_entry(pid, entry_id) do + GenServer.cast(pid, {:delete_entry, entry_id}) + end + + def update_entry(pid, entry_id, updater_fun) do + GenServer.cast(pid, {:update_entry, entry_id, updater_fun}) + end + + def entries(pid, date) do + GenServer.call(pid, {:entries, date}) + end + + @impl true + def init(_) do + {:ok, Todo.List.new()} + end + + @impl true + def handle_cast({:add_entry, entry}, state) do + {:noreply, Todo.List.add_entry(state, entry)} + end + + @impl true + def handle_cast({:delete_entry, entry_id}, state) do + {:noreply, Todo.List.delete_entry(state, entry_id)} + end + + @impl true + def handle_cast({:update_entry, entry_id, updater_fun}, state) do + {:noreply, Todo.List.update_entry(state, entry_id, updater_fun)} + end + + @impl true + def handle_call({:entries, date}, _, state) do + {:reply, Todo.List.entries(state, date), state} + end +end diff --git a/chapter7/todo_cache/mix.exs b/chapter7/todo_cache/mix.exs new file mode 100644 index 0000000..f7ef09c --- /dev/null +++ b/chapter7/todo_cache/mix.exs @@ -0,0 +1,28 @@ +defmodule Todo.MixProject do + use Mix.Project + + def project do + [ + app: :todo, + version: "0.1.0", + elixir: "~> 1.10", + start_permanent: Mix.env() == :prod, + deps: deps() + ] + end + + # Run "mix help compile.app" to learn about applications. + def application do + [ + extra_applications: [:logger] + ] + end + + # Run "mix help deps" to learn about dependencies. + defp deps do + [ + # {:dep_from_hexpm, "~> 0.3.0"}, + # {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"} + ] + end +end diff --git a/chapter7/todo_cache/test/test_helper.exs b/chapter7/todo_cache/test/test_helper.exs new file mode 100644 index 0000000..869559e --- /dev/null +++ b/chapter7/todo_cache/test/test_helper.exs @@ -0,0 +1 @@ +ExUnit.start() diff --git a/chapter7/todo_cache/test/todo_cache_test.exs b/chapter7/todo_cache/test/todo_cache_test.exs new file mode 100644 index 0000000..711d58d --- /dev/null +++ b/chapter7/todo_cache/test/todo_cache_test.exs @@ -0,0 +1,21 @@ +defmodule TodoCacheTest do + use ExUnit.Case + + test "server_process" do + {:ok, cache} = Todo.Cache.start() + bob_pid = Todo.Cache.server_process(cache, "bob") + + assert bob_pid != Todo.Cache.server_process(cache, "alice") + assert bob_pid == Todo.Cache.server_process(cache, "bob") + end + + test "to-do operations" do + {:ok, cache} = Todo.Cache.start() + alice = Todo.Cache.server_process(cache, "alice") + + Todo.Server.add_entry(alice, %{date: ~D[2020-12-12], title: "Hello"}) + entries = Todo.Server.entries(alice, ~D[2020-12-12]) + + assert [%{date: ~D[2020-12-12], title: "Hello"}] = entries + end +end diff --git a/chapter7/todo_cache/test/todo_list_test.exs b/chapter7/todo_cache/test/todo_list_test.exs new file mode 100644 index 0000000..0575e8c --- /dev/null +++ b/chapter7/todo_cache/test/todo_list_test.exs @@ -0,0 +1,64 @@ +defmodule TodoListTest do + use ExUnit.Case, async: true + + test "empty list" do + assert Todo.List.size(Todo.List.new()) == 0 + end + + test "entries" do + todo_list = + Todo.List.new([ + %{date: ~D[2018-12-19], title: "Dentist"}, + %{date: ~D[2018-12-20], title: "Shopping"}, + %{date: ~D[2018-12-19], title: "Movies"} + ]) + + assert Todo.List.size(todo_list) == 3 + assert todo_list |> Todo.List.entries(~D[2018-12-19]) |> length() == 2 + assert todo_list |> Todo.List.entries(~D[2018-12-20]) |> length() == 1 + assert todo_list |> Todo.List.entries(~D[2018-12-21]) |> length() == 0 + + titles = todo_list |> Todo.List.entries(~D[2018-12-19]) |> Enum.map(& &1.title) + assert ["Dentist", "Movies"] = titles + end + + test "add_entry" do + todo_list = + Todo.List.new() + |> Todo.List.add_entry(%{date: ~D[2018-12-19], title: "Dentist"}) + |> Todo.List.add_entry(%{date: ~D[2018-12-20], title: "Shopping"}) + |> Todo.List.add_entry(%{date: ~D[2018-12-19], title: "Movies"}) + + assert Todo.List.size(todo_list) == 3 + assert todo_list |> Todo.List.entries(~D[2018-12-19]) |> length() == 2 + assert todo_list |> Todo.List.entries(~D[2018-12-20]) |> length() == 1 + assert todo_list |> Todo.List.entries(~D[2018-12-21]) |> length() == 0 + + titles = todo_list |> Todo.List.entries(~D[2018-12-19]) |> Enum.map(& &1.title) + assert ["Dentist", "Movies"] = titles + end + + test "update_entry" do + todo_list = + Todo.List.new() + |> Todo.List.add_entry(%{date: ~D[2018-12-19], title: "Dentist"}) + |> Todo.List.add_entry(%{date: ~D[2018-12-20], title: "Shopping"}) + |> Todo.List.add_entry(%{date: ~D[2018-12-19], title: "Movies"}) + |> Todo.List.update_entry(2, &Map.put(&1, :title, "Updated shopping")) + + assert Todo.List.size(todo_list) == 3 + assert [%{title: "Updated shopping"}] = Todo.List.entries(todo_list, ~D[2018-12-20]) + end + + test "delete_entry" do + todo_list = + Todo.List.new() + |> Todo.List.add_entry(%{date: ~D[2018-12-19], title: "Dentist"}) + |> Todo.List.add_entry(%{date: ~D[2018-12-20], title: "Shopping"}) + |> Todo.List.add_entry(%{date: ~D[2018-12-19], title: "Movies"}) + |> Todo.List.delete_entry(2) + + assert Todo.List.size(todo_list) == 2 + assert Todo.List.entries(todo_list, ~D[2018-12-20]) == [] + end +end