Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- defmodule TodoEntry do
- defstruct id: 0, date: {}, title: ""
- end
- defmodule TodoList do
- defstruct next_auto_id: 1, entries: HashDict.new
- def new, do: %TodoList{}
- def add_entry(
- %TodoList{next_auto_id: new_entry_id, entries: entries} = todo_list,
- %TodoEntry{} = entry
- ) do
- entry = Map.put(entry, :id, new_entry_id)
- new_entries = HashDict.put(entries, new_entry_id, entry)
- %TodoList{todo_list | entries: new_entries, next_auto_id: new_entry_id + 1}
- end
- def entries(%TodoList{entries: entries}, date) do
- entries
- |> Stream.filter(fn({_, entry}) -> entry.date == date end)
- |> Enum.map(fn({_, entry}) -> entry end)
- end
- def update_entry(%TodoList{entries: entries} = todo_list, entry_id, update_fn) do
- case entries[entry_id] do
- nil -> todo_list
- old_entry ->
- old_entry_id = old_entry.id
- new_entry = %TodoEntry{id: ^old_entry_id} = update_fn.(old_entry)
- new_entries = HashDict.put(entries, new_entry.id, new_entry)
- %TodoList{todo_list | entries: new_entries}
- end
- end
- def update_entry(todo_list, entry_id, %TodoEntry{} = new_entry) do
- update_entry(todo_list, entry_id, fn(_) -> new_entry end)
- end
- end
- 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