package pool const Infinite = -1 const Empty = 0 type Pool struct { OverflowsTo *Pool `json:"-"` SubtractsTo *Pool `json:"-"` Max int Value int } func (p *Pool) Add(amount int) { p.Value += amount if p.Max == Infinite { return } if p.Value > p.Max { overflow := p.Value - p.Max p.Value = p.Max if p.OverflowsTo != nil { p.OverflowsTo.Add(overflow) } } } func (p *Pool) Subtract(amount int) { if p.SubtractsTo != nil { forward := amount if forward > p.Value { forward = p.Value } p.SubtractsTo.Add(forward) } if p.Value == Infinite { return } p.Value -= amount if p.Value < 0 { p.Value = 0 } } func (p *Pool) Fits(amount int) bool { return p.Value+amount <= p.Max } func (p *Pool) Has(amount int) bool { return p.Value >= amount } func New(start, max int) *Pool { return &Pool{ Max: max, Value: start, } }