Skip to content

Instantly share code, notes, and snippets.

@RPallas92
Created November 22, 2017 22:34
Show Gist options
  • Save RPallas92/aa0de821a0eb0d0f14d7bbe1f4f57042 to your computer and use it in GitHub Desktop.
Save RPallas92/aa0de821a0eb0d0f14d7bbe1f4f57042 to your computer and use it in GitHub Desktop.
facile-it/Monads test
import Monads
func test() {
typealias DeferredResult<T> = Deferred<Result<T, String>>
typealias AsyncResult<T> = Effect<DeferredResult<T>>
struct User {
var name: String
var dateOfBirth: String
}
struct UserRepository {
let user1 = User(name: "Ricardo", dateOfBirth: "01/05/1992")
func getUserByName(name: String) -> AsyncResult<User> {
return AsyncResult<User>.init { () -> Deferred<Result<User, String>> in
return DeferredResult.init(completion: { (completion) in
print("Inside async result")
if(name == "Ricardo"){
//Async: Simulates retrieving the user from DB
DispatchQueue.main.async {
completion(Result.success(self.user1))
}
} else {
//Async: Simulates trying to retrieve the user from DB
DispatchQueue.main.async {
print("inside async result's async queue")
completion(Result.failure("User not exists"))
}
}
})
}
}
}
let userRepository = UserRepository()
print("BEFORE CREATING async result")
let userAsyncResult = userRepository.getUserByName(name: "Ricardo")
print("AFTER CREATING async result")
let upperCasedAsyncResult = userAsyncResult.mapTT { (user) -> User in
let resultUser = User(name: user.name.uppercased(), dateOfBirth: user.dateOfBirth)
return resultUser
}
//Impure part: Execute side effects
let deferredResult = upperCasedAsyncResult.run()
deferredResult.run { (userResult) in
userResult.run(
ifSuccess: {printUser($0)},
ifFailure: {print($0)},
ifCancel: {print("cancelled")})
}
func printUser(_ user: User) -> () {
print(user.name)
}
}
@broomburgo
Copy link

broomburgo commented Nov 23, 2017

Wrapping in Effect is actually a very interesting strategy to add lazyness to basically everything :D

In FunctionalKit we're making Future (ex-Deferred) lazy by default.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment