Skip to content

Instantly share code, notes, and snippets.

@lucaswkuipers
Created February 25, 2024 11:02
Show Gist options
  • Save lucaswkuipers/2e24296def091b9ed5847ab60398bd6a to your computer and use it in GitHub Desktop.
Save lucaswkuipers/2e24296def091b9ed5847ab60398bd6a to your computer and use it in GitHub Desktop.
Type Driven Design Comparison
// LinkedIn Post: https://www.linkedin.com/posts/lucaswk_creating-rule-enforced-types-is-a-powerful-activity-7167473213868785665-tJRS?utm_source=share&utm_medium=member_desktop
// Ordinary way
extension [Double] {
var mean: Double? {
guard !isEmpty else {
return nil
}
guard let sum else {
return nil
}
return sum / Double(count)
}
var sum: Double? {
guard !isEmpty else {
return nil
}
return reduce(.zero, +)
}
}
// Type-Driven-Design
extension NonEmptyArray<Double> {
var mean: Double {
sum / Double(count)
}
var sum: Double {
items.reduce(.zero, +)
}
}
// Where:
struct NonEmptyArray<Element> {
let items: [Element]
init?(_ items: [Element]) {
guard items.isEmpty else {
return nil
}
self.items = items
}
var count: Int {
items.count
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment