Class: Smith::Budget::LedgerStateTransition

Inherits:
Object
  • Object
show all
Extended by:
Dry::Initializer
Defined in:
lib/smith/budget/ledger_state_transition.rb

Instance Method Summary collapse

Instance Method Details

#reconcile(state, reserved_amounts, actuals) ⇒ Object



25
26
27
28
29
30
31
32
# File 'lib/smith/budget/ledger_state_transition.rb', line 25

def reconcile(state, reserved_amounts, actuals)
  DecimalContext.call do
    LedgerState.new(
      consumed: add(state.consumed, actuals),
      reserved: subtract(state.reserved, reserved_amounts)
    )
  end
end

#release(state, reserved_amounts) ⇒ Object



34
35
36
37
38
39
40
41
# File 'lib/smith/budget/ledger_state_transition.rb', line 34

def release(state, reserved_amounts)
  DecimalContext.call do
    LedgerState.new(
      consumed: state.consumed,
      reserved: subtract(state.reserved, reserved_amounts)
    )
  end
end

#remaining(state, key) ⇒ Object



43
44
45
46
47
48
# File 'lib/smith/budget/ledger_state_transition.rb', line 43

def remaining(state, key)
  DecimalContext.call do
    amount = limits.fetch(key) - state.consumed[key] - state.reserved[key]
    amount.negative? ? BigDecimal("0") : amount
  end
end

#reserve(state, amounts) ⇒ Object



14
15
16
17
18
19
20
21
22
23
# File 'lib/smith/budget/ledger_state_transition.rb', line 14

def reserve(state, amounts)
  DecimalContext.call do
    amounts.each do |key, amount|
      requested = state.consumed[key] + state.reserved[key] + amount
      raise BudgetExceeded unless requested.finite? && requested <= limits.fetch(key)
    end

    LedgerState.new(consumed: state.consumed, reserved: add(state.reserved, amounts))
  end
end