Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Map extension #68

Closed
zontag opened this issue Sep 10, 2018 · 4 comments
Closed

Map extension #68

zontag opened this issue Sep 10, 2018 · 4 comments

Comments

@zontag
Copy link

zontag commented Sep 10, 2018

There is any intention to provide a Map extension?

@shoumikhin
Copy link
Contributor

Hi Tiago,

What kind of a Map extension would you like to see? Any examples? Perhaps we already have what you need?

Thanks.

@zontag
Copy link
Author

zontag commented Sep 11, 2018

Hi Tiago,

What kind of a Map extension would you like to see? Any examples? Perhaps we already have what you need?

Thanks.

I'm converting my project from PromiseKit to Promises and in some places where I used PromiseKit extensions like map, mapValues, compactMap and compactMapValues was needed some more imperative code. Maybe I'm missing something but here are a code comparation. Note that I opted for explicit closure typed because compiler was pain on guess it.

return userDBManager
                .getAll(.promise)
                .compactMap(on: bgq) { $0.first }
                .compactMap(on: bgq) { $0.selectedMachines }
                .compactMapValues(on: bgq) { $0 as? MachineMO } // Casting
                .mapValues(on: bgq, toMachine)
                .recover { _ in Guarantee.value([]) }

agains

return userDBManager
                .getAllPromise()
                .then(on: bgq) { $0.first }
                .validate(on: bgq) { $0 != nil }
                .then(on: bgq) { (user: UserMO?) -> NSSet? in
                    user!.selectedMachines
                }
                .validate(on: bgq) { $0 != nil }
                .then(on: bgq) { (set: NSSet?) -> [MachineMO] in
                    set!.compactMap { $0 as? MachineMO }
                }.then(on: bgq) { (entities: [MachineMO]) -> [Machine] in
                    entities.compactMap(toMachine)
                }.recover { _ in [Machine]() }

Same without explicit types:

return userDBManager
                .getAllPromise()
                .then(on: bgq) { $0.first }
                .validate(on: bgq) { $0 != nil }
                .then(on: bgq) { user!.selectedMachines }
                .validate(on: bgq) { $0 != nil }
                .then(on: bgq) { set!.compactMap { $0 as? MachineMO } }
                .then(on: bgq) { entities.compactMap(toMachine) }
                .recover { _ in [Machine]() }

@shoumikhin
Copy link
Contributor

Many thanks for the example! Wonder if you could leverage nil-coalescing for all of that instead?

return userDBManager.getAllPromise().then(on: bgq) {
  $0?.first?.selectedMachines?.compactMap { $0 as? MachineMO }?.compactMap(toMachine) ?? []
}

@zontag
Copy link
Author

zontag commented Sep 11, 2018

Really better, great solution! It solved the problem and keeps the code elegant and simple. Thanks!

@zontag zontag closed this as completed Sep 12, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants