Skip to content

Instantly share code, notes, and snippets.

@yoching
Last active April 12, 2018 06:07
Show Gist options
  • Save yoching/b33d5d1289169552a7003cc6a2c3740b to your computer and use it in GitHub Desktop.
Save yoching/b33d5d1289169552a7003cc6a2c3740b to your computer and use it in GitHub Desktop.
Data container which express single or multiple ojects
enum SingleOrMultiple<Value> {
case single(Value)
case multiple([Value])
func map<T>(_ transform: (Value) throws -> T) rethrows -> SingleOrMultiple<T> {
switch self {
case let .single(value): return .single(try transform(value))
case let .multiple(values): return .multiple(try values.map(transform))
}
}
func flatMap<T>(_ transform: (Value) throws -> SingleOrMultiple<T>) rethrows -> SingleOrMultiple<T> {
switch self {
case let .single(value):
return try transform(value)
case let .multiple(values):
return .multiple(try values // [Value]
.map(transform) // [SingleOrMultiple<T>]
.flatMap { $0.array } // [T]
)
}
}
var array: [Value] {
switch self {
case let .single(value): return [value]
case let .multiple(values): return values
}
}
var first: Value? {
return array.first
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment