Skip to content

Instantly share code, notes, and snippets.

@rjchatfield
Created September 9, 2014 03:37
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 rjchatfield/18df0dc4dd94a370534c to your computer and use it in GitHub Desktop.
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.
/**
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