Skip to content

Instantly share code, notes, and snippets.

@petercowan
Created August 11, 2020 21:57
Show Gist options
  • Save petercowan/d80c0ac9c3cd9679f77ffe67fde5ef91 to your computer and use it in GitHub Desktop.
Save petercowan/d80c0ac9c3cd9679f77ffe67fde5ef91 to your computer and use it in GitHub Desktop.
require 'date'
points_ledger = [
{ amount: 5, expires_at: DateTime.new(2020,8,1)},
{ amount: 10, expires_at: DateTime.new(2020,8,2)},
{ amount: 2, expires_at: DateTime.new(2020,8,3)},
]
def add_points(ledger, amount, exp_date)
puts "Adding #{amount} points"
ledger.push({ amount: amount, expires_at: exp_date})
end
def debit_points(ledger, amount)
puts "Debiting #{amount} points"
ledger.push({ amount: -amount, exp_date: nil})
end
def ledger_balance(ledger)
ledger.map { |item| item[:amount] }.sum
end
def expired_credits_amount(ledger, exp_date)
ledger.filter { |item| item[:amount] > 0 && item[:expires_at] < exp_date }.map { |item| item[:amount] }.sum
end
def expire_points(ledger, exp_date)
balance = ledger_balance(ledger)
expired_credits = expired_credits_amount(ledger, exp_date)
debit_amount = [balance, expired_credits].min
puts
puts "Expires At: #{exp_date}"
puts "Ledger Balance: #{balance}"
puts "Expired Credits: #{expired_credits}"
puts "Debiting #{debit_amount}"
if debit_amount > 0
debit_points(ledger, debit_amount)
end
end
def display_balance(ledger)
puts
puts "Ledger Balance: #{ledger_balance(ledger)}"
end
display_balance(points_ledger)
debit_points(points_ledger, 7)
display_balance(points_ledger)
add_points(points_ledger, 8, DateTime.new(2020,8,5))
display_balance(points_ledger)
expire_points(points_ledger, DateTime.new(2020,8,2))
display_balance(points_ledger)
debit_points(points_ledger, 4)
display_balance(points_ledger)
debit_points(points_ledger, 3)
display_balance(points_ledger)
expire_points(points_ledger, DateTime.new(2020,8,5))
display_balance(points_ledger)
add_points(points_ledger, 5, DateTime.new(2020,8,8))
display_balance(points_ledger)
add_points(points_ledger, 2, DateTime.new(2020,8,9))
display_balance(points_ledger)
expire_points(points_ledger, DateTime.new(2020,8,9))
display_balance(points_ledger)
add_points(points_ledger, 12, DateTime.new(2020,8,10))
display_balance(points_ledger)
debit_points(points_ledger, 8)
display_balance(points_ledger)
add_points(points_ledger, 5, DateTime.new(2020,8,12))
display_balance(points_ledger)
add_points(points_ledger, 5, DateTime.new(2020,8,13))
display_balance(points_ledger)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment