Skip to content

Instantly share code, notes, and snippets.

@dfinke
Created April 25, 2024 14:32
Show Gist options
  • Save dfinke/12c6342ecdeedac18b94f975b1fe706b to your computer and use it in GitHub Desktop.
Save dfinke/12c6342ecdeedac18b94f975b1fe706b to your computer and use it in GitHub Desktop.
function Invoke-ATMCashDispenser {
param([int]$AmountRequested)
class UnitOfWork {
hidden [int]$Amt
[int]$Request
[int]$NumberOf50
[int]$NumberOf20
[int]$NumberOf10
[int]$NumberOf5
UnitOfWork($amt) { $this.Request = $this.Amt = $amt }
}
class ATMHandler {
[ATMHandler] $successor
ATMHandler() {}
ATMHandler($successor) { $this.successor = $successor }
handleRequest([UnitOfWork]$request) {}
}
class ATM50Handler : ATMHandler {
ATM50Handler() : base() {}
ATM50Handler($successor) : base($successor) {}
handleRequest([UnitOfWork]$request) {
while ($request.Amt -ge 50) {
$request.Amt -= 50
$request.NumberOf50 += 1
}
if ([ATMHandler]$this.successor) {
[ATMHandler]$this.successor.handleRequest($request)
}
}
}
class ATM20Handler : ATMHandler {
ATM20Handler() : base() {}
ATM20Handler($successor) : base($successor) {}
handleRequest([UnitOfWork]$request) {
while ($request.Amt -ge 20) {
$request.Amt -= 20
$request.NumberOf20 += 1
}
if ([ATMHandler]$this.successor) {
[ATMHandler]$this.successor.handleRequest($request)
}
}
}
class ATM10Handler : ATMHandler {
ATM10Handler() : base() {}
ATM10Handler($successor) : base($successor) {}
handleRequest([UnitOfWork]$request) {
while ($request.Amt -ge 10) {
$request.Amt -= 10
$request.NumberOf10 += 1
}
if ([ATMHandler]$this.successor) {
[ATMHandler]$this.successor.handleRequest($request)
}
}
}
class ATM5Handler : ATMHandler {
ATM5Handler() : base() {}
ATM5Handler($successor) : base($successor) {}
handleRequest([UnitOfWork]$request) {
while ($request.Amt -ge 5) {
$request.Amt -= 5
$request.NumberOf5 += 1
}
if ([ATMHandler]$this.successor) {
[ATMHandler]$this.successor.handleRequest($request)
}
}
}
function Invoke-Withdrawal {
param(
[Parameter(Mandatory)]
$Amt
)
$ATM5 = [ATM5Handler]::new()
$ATM10 = [ATM10Handler]::new($ATM5)
$ATM20 = [ATM20Handler]::new($ATM10)
$ATM50 = [ATM50Handler]::new($ATM20)
$request = [UnitOfWork]::new($amt)
$ATM50.handleRequest($request)
$request
}
Invoke-Withdrawal $AmountRequested
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment