Advertisement
Guest User

Untitled

a guest
Jul 31st, 2015
209
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.27 KB | None | 0 0
  1. defmodule TodoEntry do
  2. defstruct id: 0, date: {}, title: ""
  3. end
  4.  
  5. defmodule TodoList do
  6. defstruct next_auto_id: 1, entries: HashDict.new
  7.  
  8. def new, do: %TodoList{}
  9. def add_entry(
  10. %TodoList{next_auto_id: new_entry_id, entries: entries} = todo_list,
  11. %TodoEntry{} = entry
  12. ) do
  13. entry = Map.put(entry, :id, new_entry_id)
  14. new_entries = HashDict.put(entries, new_entry_id, entry)
  15. %TodoList{todo_list | entries: new_entries, next_auto_id: new_entry_id + 1}
  16. end
  17.  
  18. def entries(%TodoList{entries: entries}, date) do
  19. entries
  20. |> Stream.filter(fn({_, entry}) -> entry.date == date end)
  21. |> Enum.map(fn({_, entry}) -> entry end)
  22. end
  23.  
  24. def update_entry(%TodoList{entries: entries} = todo_list, entry_id, update_fn) do
  25. case entries[entry_id] do
  26. nil -> todo_list
  27. old_entry ->
  28. old_entry_id = old_entry.id
  29. new_entry = %TodoEntry{id: ^old_entry_id} = update_fn.(old_entry)
  30. new_entries = HashDict.put(entries, new_entry.id, new_entry)
  31. %TodoList{todo_list | entries: new_entries}
  32. end
  33. end
  34. def update_entry(todo_list, entry_id, %TodoEntry{} = new_entry) do
  35. update_entry(todo_list, entry_id, fn(_) -> new_entry end)
  36. end
  37. end
  38.  
  39. todo_list = TodoList.new |> TodoList.add_entry(%TodoEntry{id: 0, date: {2013, 12, 19}, title: "Dentist"})
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement