Guest User

Untitled

a guest
Dec 9th, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.64 KB | None | 0 0
  1. defmodule Marbles do
  2. def new do
  3. %{size: 0, current: 0, counter: 0}
  4. end
  5.  
  6. def to_list(state) do
  7. []
  8. |> do_to_list(state, state.current, state.current)
  9. |> Enum.reverse
  10. end
  11.  
  12. defp do_to_list(list, state, current, current) when length(list) > 0 do
  13. list
  14. end
  15.  
  16. defp do_to_list(list, state, current, last) do
  17. {_, value, next} = state[current]
  18. do_to_list([value | list], state, next, last)
  19. end
  20.  
  21. def size(state) do
  22. state.size
  23. end
  24.  
  25. def move_next(state) do
  26. {_, _, next} = state[state.current]
  27.  
  28. state
  29. |> Map.put(:current, next)
  30. end
  31.  
  32. def insert_next(%{size: 0} = state, value) do
  33. id = state.counter + 1
  34.  
  35. do_insert_next(state, id, {id, value, id})
  36. end
  37.  
  38. def insert_next(state, value) do
  39. id = state.counter + 1
  40.  
  41. prev = state.current
  42. {_, _, next} = state[state.current]
  43.  
  44. do_insert_next(state, id, {prev, value, next})
  45. end
  46.  
  47. defp do_insert_next(state, id, {prev, value, next} = item) do
  48. state
  49. |> Map.put(id, item)
  50. |> Map.put(:current, id)
  51. |> Map.update(prev, item, &put_elem(&1, 2, id))
  52. |> Map.update(next, item, &put_elem(&1, 0, id))
  53. |> Map.update(:size, 0, &(&1 + 1))
  54. |> Map.update(:counter, 0, &(&1 + 1))
  55. end
  56.  
  57. def remove_current(%{size: 0} = state), do: state
  58. def remove_current(state) do
  59. {prev, _, next} = state[state.current]
  60.  
  61. state
  62. |> Map.update(prev, nil, &put_elem(&1, 2, next))
  63. |> Map.update(next, nil, &put_elem(&1, 0, prev))
  64. |> Map.put(:current, next)
  65. |> Map.update(:size, 0, &(&1 - 1))
  66. |> Map.delete(state.current)
  67. end
  68. end
Add Comment
Please, Sign In to add comment