Skip to content

Instantly share code, notes, and snippets.

@riteshhgupta
Created February 6, 2017 18:33
Show Gist options
  • Star 47 You must be signed in to star a gist
  • Fork 9 You must be signed in to fork a gist
  • Save riteshhgupta/358db2ed3b6968ef18880cb28bdb6963 to your computer and use it in GitHub Desktop.
Save riteshhgupta/358db2ed3b6968ef18880cb28bdb6963 to your computer and use it in GitHub Desktop.
extension Optional {
// `then` function executes the closure if there is some value
func then(_ handler: (Wrapped) -> Void) {
switch self {
case .some(let wrapped): return handler(wrapped)
case .none: break
}
}
}
@Jeehut
Copy link

Jeehut commented Feb 13, 2017

Why is the method named then? When using it like the following it doesn't seem very readable to me:

let age: Int? = 25
age.then { print($0) }

I'd rather name it something like notNil of ifSome.

@NinoScript
Copy link

NinoScript commented Feb 13, 2017

Isn't this just a map that doesn't return, and also doesn't work with handlers that return?

func then(_ handler: (Wrapped) -> Void) {
    map(handler)
}

You could easily make it work with functions that return other types:

func then<T>(_ handler: (Wrapped) -> T) {
    let _ = map(handler)
}

But even then the only reason for this to exist would be to improve semantics, but then isn't better than map as it incorrectly implies time.
Maybe apply?

@haashem
Copy link

haashem commented Feb 14, 2017

how can I add another block for failure? I'm looking for something like this:

image.ifSome {

}.else {

}

@dungi
Copy link

dungi commented Feb 14, 2017

for the else part, just implement fun else() with ".none"-case i think

@orxelm
Copy link

orxelm commented Feb 14, 2017

nice!

@asehgal123
Copy link

asehgal123 commented Feb 14, 2017

how about

let age: Int? = 25
age.ifItHaz { print($0) }

@DivineDominion
Copy link

+1 for apply, @NinoScript !

@janodev
Copy link

janodev commented Feb 18, 2017

@hashemp206

import Foundation

extension Optional 
{
    @discardableResult
    func ifSome(_ handler: (Wrapped) -> Void) -> Optional {
        switch self {
            case .some(let wrapped): handler(wrapped); return self
            case .none: return self
        }
    }
    @discardableResult
    func ifNone(_ handler: () -> Void) -> Optional {
        switch self {
            case .some: return self
            case .none(): handler(); return self
        }
    }
}

struct Person {
    let name: String
}

var p: Person? = Person(name: "Joe")
p.ifSome { print($0) }.ifNone { print("none") } // prints Person

p = nil
p.ifSome { print($0) }.ifNone { print("none") } // prints none

@MKGitHub
Copy link

MKGitHub commented Apr 9, 2017

+1 for above

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