diff --git a/lib/paxos.ex b/lib/paxos.ex index b098a22..b0fba5d 100644 --- a/lib/paxos.ex +++ b/lib/paxos.ex @@ -455,25 +455,13 @@ defmodule Paxos do def propose_loop(inInst) do receive do {:timeout, inst} -> - if inInst == inst do - {:timeout} - else - propose_loop(inInst) - end + check_and_apply({:timeout}, inst, inInst, &propose_loop/1) {:abort, inst} -> - if inInst == inst do - {:abort} - else - propose_loop(inInst) - end + check_and_apply({:abort}, inst, inInst, &propose_loop/1) {:decision, inst, d} -> - if inInst == inst do - {:decision, d} - else - propose_loop(inInst) - end + check_and_apply({:decision, d}, inst, inInst, &propose_loop/1) x -> Process.send_after(self(), x, 500) @@ -489,22 +477,22 @@ defmodule Paxos do def get_decision_loop(inInst) do receive do {:get_value_res, inst} -> - if inst == inInst do - nil - else - get_decision_loop(inInst) - end + check_and_apply(nil, inst, inInst, &get_decision_loop/1) {:get_value_res_actual, inst, v} -> - if inst == inInst do - v - else - get_decision_loop(inInst) - end + check_and_apply(v, inst, inInst, &get_decision_loop/1) x -> Process.send_after(self(), x, 500) get_decision_loop(inInst) end end + + def check_and_apply(v, inst, inInst, fun) do + if inst == inInst do + v + else + fun.(inInst) + end + end end