Skip to content

Instantly share code, notes, and snippets.

@omochi
Created August 6, 2021 03:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save omochi/594d43a7e2559145ad961673aedd5ce3 to your computer and use it in GitHub Desktop.
Save omochi/594d43a7e2559145ad961673aedd5ce3 to your computer and use it in GitHub Desktop.
import NIO
extension EventLoop {
func chain<V0>(
_ v0: @escaping () throws -> EventLoopFuture<V0>
) -> EventLoopFuture<V0> {
self.tryFlatSubmit { try v0() }
}
func chain<V0, V1>(
_ v0: @escaping () throws -> EventLoopFuture<V0>,
_ v1: @escaping (V0) throws -> EventLoopFuture<V1>
) -> EventLoopFuture<(V0, V1)> {
self.tryFlatSubmit { try v0() }.flatMap { (v0) in
self.tryFlatSubmit { try v1(v0) }.map { (v1) in
(v0, v1)
}
}
}
func chain<V0, V1, V2>(
_ v0: @escaping () throws -> EventLoopFuture<V0>,
_ v1: @escaping (V0) throws -> EventLoopFuture<V1>,
_ v2: @escaping (V0, V1) throws -> EventLoopFuture<V2>
) -> EventLoopFuture<(V0, V1, V2)> {
self.tryFlatSubmit { try v0() }.flatMap { (v0) in
self.tryFlatSubmit { try v1(v0) }.flatMap { (v1) in
self.tryFlatSubmit { try v2(v0, v1) }.map { (v2) in
(v0, v1, v2)
}
}
}
}
func chain<V0, V1, V2, V3>(
_ v0: @escaping () throws -> EventLoopFuture<V0>,
_ v1: @escaping (V0) throws -> EventLoopFuture<V1>,
_ v2: @escaping (V0, V1) throws -> EventLoopFuture<V2>,
_ v3: @escaping (V0, V1, V2) throws -> EventLoopFuture<V3>
) -> EventLoopFuture<(V0, V1, V2, V3)> {
self.tryFlatSubmit { try v0() }.flatMap { (v0) in
self.tryFlatSubmit { try v1(v0) }.flatMap { (v1) in
self.tryFlatSubmit { try v2(v0, v1) }.flatMap { (v2) in
self.tryFlatSubmit { try v3(v0, v1, v2) }.map { (v3) in
(v0, v1, v2, v3)
}
}
}
}
}
func chain<V0, V1, V2, V3, V4>(
_ v0: @escaping () throws -> EventLoopFuture<V0>,
_ v1: @escaping (V0) throws -> EventLoopFuture<V1>,
_ v2: @escaping (V0, V1) throws -> EventLoopFuture<V2>,
_ v3: @escaping (V0, V1, V2) throws -> EventLoopFuture<V3>,
_ v4: @escaping (V0, V1, V2, V3) throws -> EventLoopFuture<V4>
) -> EventLoopFuture<(V0, V1, V2, V3, V4)> {
self.tryFlatSubmit { try v0() }.flatMap { (v0) in
self.tryFlatSubmit { try v1(v0) }.flatMap { (v1) in
self.tryFlatSubmit { try v2(v0, v1) }.flatMap { (v2) in
self.tryFlatSubmit { try v3(v0, v1, v2) }.flatMap { (v3) in
self.tryFlatSubmit { try v4(v0, v1, v2, v3) }.map { (v4) in
(v0, v1, v2, v3, v4)
}
}
}
}
}
}
func chain<V0, V1, V2, V3, V4, V5>(
_ v0: @escaping () throws -> EventLoopFuture<V0>,
_ v1: @escaping (V0) throws -> EventLoopFuture<V1>,
_ v2: @escaping (V0, V1) throws -> EventLoopFuture<V2>,
_ v3: @escaping (V0, V1, V2) throws -> EventLoopFuture<V3>,
_ v4: @escaping (V0, V1, V2, V3) throws -> EventLoopFuture<V4>,
_ v5: @escaping (V0, V1, V2, V3, V4) throws -> EventLoopFuture<V5>
) -> EventLoopFuture<(V0, V1, V2, V3, V4, V5)> {
self.tryFlatSubmit { try v0() }.flatMap { (v0) in
self.tryFlatSubmit { try v1(v0) }.flatMap { (v1) in
self.tryFlatSubmit { try v2(v0, v1) }.flatMap { (v2) in
self.tryFlatSubmit { try v3(v0, v1, v2) }.flatMap { (v3) in
self.tryFlatSubmit { try v4(v0, v1, v2, v3) }.flatMap { (v4) in
self.tryFlatSubmit { try v5(v0, v1, v2, v3, v4) }.map { (v5) in
(v0, v1, v2, v3, v4, v5)
}
}
}
}
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment