functional-swift
functional-swift copied to clipboard
Thinking Functionally - Example: the complicated canSafelyEngageShip(_:friendly:) function
extension Ship {
func canSafelyEngageShip(target: Ship, friendly: Ship) -> Bool {
let rangeRegion = difference(circle(firingRange),
minus: circle(unsafeRange))
let firingRegion = shift(rangeRegion, offset: position)
let friendlyRegion = shift(circle(unsafeRange),
offset: friendly.position)
let resultRegion = difference(firingRegion, minus: friendlyRegion)
return resultRegion(target.position)
}
}
This line: let friendlyRegion = shift(circle(unsafeRange), offset: friendly.position) should be: let friendlyRegion = shift(circle(friendly.unsafeRange), offset: friendly.position) friendlyRegion should be represented the friendly ship's unsafe region
Figure 4 Avoiding engaging targets too close to friendly ships
extension Ship {
func canSafelyEngageShip1(target: Ship, friendly: Ship) -> Bool {
let dx = target.position.x - position.x
let dy = target.position.y - position.y
let targetDistance = sqrt(dx * dx + dy * dy)
let friendlyDx = friendly.position.x - target.position.x
let friendlyDy = friendly.position.y - target.position.y
let friendlyDistance = sqrt(friendlyDx * friendlyDx +
friendlyDy * friendlyDy)
return targetDistance <= firingRange
&& targetDistance > unsafeRange
&& (friendlyDistance > unsafeRange)
}
}
This line: return targetDistance <= firingRange && targetDistance > unsafeRange && (friendlyDistance > unsafeRange) should be: return targetDistance <= firingRange && targetDistance > unsafeRange && (friendlyDistance > friendly.unsafeRange)