Created
September 9, 2014 03:37
-
-
Save rjchatfield/18df0dc4dd94a370534c to your computer and use it in GitHub Desktop.
Chaining functions, handling successes and fails through returning structs. Note line111 and line134 are compositions.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
MARK: All starts here... | |
*/ | |
func test <T> (isTrue:BooleanType, success: ()->T, fail: ()->T) -> T { | |
return isTrue ? success() : fail() | |
} | |
/** | |
MARK: - Callback Data Structures | |
*/ | |
struct CallbackData <T> { | |
let success: Bool = false | |
let msg: String = "" | |
let data: T? = nil | |
} | |
func msgOf <T> (data: CallbackData <T>) -> String { | |
return data.msg | |
} | |
func dataOf <T> (data: CallbackData <T>) -> T { | |
return data.data! | |
} | |
func convertCallbackData <T, U> (task: (T?)->U?) -> (CallbackData <T>)->CallbackData <U> { | |
return { (data: CallbackData <T>) -> CallbackData <U> in | |
let dict_data = task(data.data) | |
return CallbackData(success: data.success, msg: data.msg, data: dict_data) | |
} | |
} | |
/** | |
MARK: - Location | |
*/ | |
func currentLocation () -> CallbackData <String> { | |
func success () -> CallbackData <String> { | |
return CallbackData <String> ( | |
success: true | |
, msg: "Got location" | |
, data: "Rob's House" | |
) | |
} | |
func fail () -> CallbackData <String> { | |
return CallbackData <String> ( | |
success: false | |
, msg: "No location" | |
, data: nil | |
) | |
} | |
// Write logic here | |
let cond = true | |
return test(cond, success, fail) | |
} | |
/** | |
MARK: Send | |
*/ | |
func send (data: CallbackData<[String: Any]>) -> CallbackData <[String: Any]> { | |
func success () -> CallbackData <[String: Any]> { | |
return CallbackData <[String: Any]> ( | |
success: true | |
, msg: "send() recieved: '\(data.msg)'" | |
, data: ["json_data": "\(data.data!)"] | |
) | |
} | |
func fail () -> CallbackData <[String: Any]> { | |
return CallbackData <[String: Any]> ( | |
success: false | |
, msg: "send() nothing recieved" | |
, data: nil | |
) | |
} | |
// Write logic here | |
let cond = data.data != nil | |
return test(cond, success, fail) | |
} | |
/** | |
MARK: - Scheduler | |
*/ | |
func scheduler () -> CallbackData <String> { | |
func wrapStringInDictionary (str: String?) -> Dictionary <String, Any>? { | |
if let u_str = str { return ["data": u_str] } | |
return nil | |
} | |
let dictionaryVersionOf = convertCallbackData(wrapStringInDictionary) | |
func success <T> (data: CallbackData <T>) -> ()->CallbackData <String> { | |
return { | |
CallbackData <String> ( | |
success: true | |
, msg: data.msg | |
, data: "\(data.data!)" | |
) | |
} | |
} | |
func fail <T> (data: CallbackData <T>) -> ()->CallbackData <String> { | |
return { | |
CallbackData <String> ( | |
success: false | |
, msg: data.msg | |
, data: "\(data.data!)" | |
) | |
} | |
} | |
let data = send(dictionaryVersionOf(currentLocation())) | |
let cond = data.success == true | |
return test(cond, success(data), fail(data)) | |
} | |
/** | |
MARK: Notify | |
*/ | |
func printOut (str: String) { | |
println("Print out:") | |
println(" '\(str)'.") | |
} | |
func printOut (str: Printable) { | |
printOut("\(str)") | |
} | |
func printOut <T> (data: CallbackData <T>) { | |
printOut(msgOf(data)) | |
} | |
/** | |
MARK: ViewController | |
*/ | |
let viewController = { printOut(dataOf(scheduler())) } | |
viewController() | |
//-> Notify: | |
// '[json_data: [data: Rob's House]]'. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment