|
1 | 1 | defmodule Sequence.Server do |
| 2 | + require Logger |
2 | 3 | use GenServer |
3 | 4 |
|
4 | | - @vsn "0" |
| 5 | + @vsn "1" |
| 6 | + defmodule State do |
| 7 | + defstruct current_number: 0, stash_pid: nil, delta: 1 |
| 8 | + end |
| 9 | + |
| 10 | + def code_change("0", old_state = {current_number, stash_pid}, _extra) do |
| 11 | + new_state = %State{current_number: current_number, |
| 12 | + stash_pid: stash_pid, |
| 13 | + delta: 1 |
| 14 | + } |
| 15 | + Logger.info("Changing code from 0 to 1") |
| 16 | + Logger.info(inspect(old_state)) |
| 17 | + Logger.info(inspect(new_state)) |
| 18 | + {:ok, new_state} |
| 19 | + end |
5 | 20 |
|
6 | 21 | # API |
7 | 22 | def start_link(stash_pid), do: |
8 | 23 | GenServer.start_link(__MODULE__, stash_pid, name: __MODULE__) |
9 | 24 |
|
10 | 25 | def next_number do |
11 | | - with number = GenServer.call(__MODULE__, :next_number), |
12 | | - do: "The next number is #{number}" |
| 26 | + with number = GenServer.call(__MODULE__, :next_number), do: |
| 27 | + "The next number is #{number}" |
13 | 28 | end |
14 | 29 |
|
15 | 30 | def increment_number(delta), do: |
16 | 31 | GenServer.cast __MODULE__, {:increment_number, delta} |
17 | 32 |
|
18 | 33 | # GenServer implementation |
19 | 34 | def init(stash_pid) do |
20 | | - current_number = Sequence.Stash.get_value stash_pid |
21 | | - {:ok, {current_number, stash_pid}} |
| 35 | + current_number = Sequence.Stash.get_value(stash_pid) |
| 36 | + {:ok, %State{current_number: current_number, stash_pid: stash_pid}} |
22 | 37 | end |
23 | 38 |
|
24 | | - def handle_call(:next_number, _from, {current_number, stash_pid}), do: |
25 | | - {:reply, current_number, {current_number+1, stash_pid}} |
26 | | - def handle_cast({:increment_number, delta}, {current_number, stash_pid}), do: |
27 | | - {:noreply, {current_number+delta, stash_pid}} |
| 39 | + def handle_call(:next_number, _from, state) do |
| 40 | + {:reply, |
| 41 | + state.current_number, |
| 42 | + %{state | current_number: state.current_number + state.delta}} |
| 43 | + end |
| 44 | + |
| 45 | + def handle_cast({:increment_number, delta}, state) do |
| 46 | + {:noreply, |
| 47 | + %{state | current_number: state.current_number + delta, delta: delta}} |
| 48 | + end |
28 | 49 |
|
29 | | - def terminate(_reason, {current_number, stash_pid}), do: |
30 | | - Sequence.Stash.save_value(stash_pid, current_number) |
| 50 | + def terminate(_reason, state), do: |
| 51 | + Sequence.Stash.save_value(state.stash_pid, state.current_number) |
31 | 52 | end |
0 commit comments