class RequestResponse_Rewrite include Bud state do table :did_resp, [:client, :id] scratch :need_resp, [:client, :id] => [:key] table :read_req, [:addr, :client, :id] => [:key] table :read_resp, [:addr, :id] => [:key, :val] channel :req_chn, [:@addr, :client, :id] => [:key] channel :req_chn_ack, [:@rce_sender, :addr, :client, :id] range :req_chn_approx, [:addr, :client, :id] table :req_log, [:client, :id] => [:key] range :req_log_keys, [:client, :id] channel :resp_chn, [:@addr, :id] => [:key, :val] channel :resp_chn_ack, [:@rce_sender, :addr, :id] range :resp_chn_approx, [:addr, :id] table :resp_log, [:client, :id] => [:key, :val] table :state, [:key] => [:val] end bloom do (did_resp < -(did_resp * req_log_keys).lefts(:client => :client, :id => :id).notin(req_log, :client => :client, :id => :id)) (read_req < -(read_req * req_chn_approx).lefts(0 => :addr, 1 => :client, 2 => :id)) (req_chn < read_req.notin(req_chn_approx, 0 => :addr, 1 => :client, 2 => :id).~) (req_log < -(req_log * did_resp).lefts(:client => :client, :id => :id)) (req_log <= req_chn.payloads.notin(req_log_keys, 0 => :client, 1 => :id)) (resp_chn < resp_log.notin(resp_chn_approx, 0 => :addr, 1 => :id).~) (resp_log < -(resp_log * resp_chn_approx).lefts(0 => :addr, 1 => :id)) did_resp < (+resp_log { |r| [r.client, r.id] }) need_resp <= (req_log.notin(did_resp, :client => :client, :id => :id)) read_resp <= (resp_chn) req_chn_ack <~ req_chn {|c| [c.source_addr, c.addr, c.client, c.id]} req_chn_approx <= (req_chn_ack.payloads) req_log_keys <+ req_log {|r| [r.client, r.id]} resp_chn_ack <~ resp_chn {|c| [c.source_addr, c.addr, c.id]} resp_chn_approx <= (resp_chn_ack.payloads) resp_log <= ((need_resp * state).outer(:key => :key) do |r, s| (r + [(s.val or "MISSING")]) end) end end