Class: Smith::Budget::Ledger

Inherits:
Object
  • Object
show all
Defined in:
lib/smith/budget/ledger.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(limits: {}, consumed: {}) ⇒ Ledger

Returns a new instance of Ledger.



8
9
10
11
12
13
# File 'lib/smith/budget/ledger.rb', line 8

def initialize(limits: {}, consumed: {})
  @mutex = Mutex.new
  @limits = limits
  @consumed = Hash.new(0).merge(consumed)
  @reserved = Hash.new(0)
end

Instance Attribute Details

#consumedObject (readonly)

Returns the value of attribute consumed.



6
7
8
# File 'lib/smith/budget/ledger.rb', line 6

def consumed
  @consumed
end

#limitsObject (readonly)

Returns the value of attribute limits.



6
7
8
# File 'lib/smith/budget/ledger.rb', line 6

def limits
  @limits
end

Instance Method Details

#reconcile!(key, reserved_amount, actual_amount) ⇒ Object



24
25
26
27
28
29
# File 'lib/smith/budget/ledger.rb', line 24

def reconcile!(key, reserved_amount, actual_amount)
  @mutex.synchronize do
    @reserved[key] = [0, @reserved[key] - reserved_amount].max
    @consumed[key] += actual_amount
  end
end

#release!(key, amount) ⇒ Object



31
32
33
34
35
# File 'lib/smith/budget/ledger.rb', line 31

def release!(key, amount)
  @mutex.synchronize do
    @reserved[key] = [0, @reserved[key] - amount].max
  end
end

#remaining(key) ⇒ Object



37
38
39
# File 'lib/smith/budget/ledger.rb', line 37

def remaining(key)
  @mutex.synchronize { [@limits[key] - @consumed[key] - @reserved[key], 0].max }
end

#reserve!(key, amount) ⇒ Object



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

def reserve!(key, amount)
  @mutex.synchronize do
    committed = @consumed[key] + @reserved[key]
    raise BudgetExceeded if committed + amount > @limits[key]

    @reserved[key] += amount
  end
end