currying in swift

16
Currying in Swift A tale of state encapsulation Maxim Zaks @iceX33

Upload: maxim-zaks

Post on 16-Nov-2014

151 views

Category:

Software


1 download

DESCRIPTION

Lightning talk from iOSDevUK 2014

TRANSCRIPT

Page 1: Currying in Swift

Currying in SwiftA tale of state encapsulation

Maxim Zaks @iceX33

Page 2: Currying in Swift

Every presentation needs a theme

Page 3: Currying in Swift

func amountWithVat(vat:Float, amount: Float) -> Float { return roundf((1 + vat) * amount)}

let amount1 = amountWithVat(0.19, 100)let amount2 = amountWithVat(0.19, 200)let amount3 = amountWithVat(0.2, 300)

Page 4: Currying in Swift

func amountWithVat(vat:Float)(amount: Float) -> Float { return roundf((1 + vat) * amount)}

let addGermanVatTo = amountWithVat(0.19)let addUKVatTo = amountWithVat(0.2)

let amount1 = addGermanVatTo(amount: 100)let amount2 = addGermanVatTo(amount: 200)let amount3 = addUKVatTo(amount: 300)

Page 5: Currying in Swift

func amountWithVat( vat : Float, roundFunction : (Float)->Float = roundf) (amount: Float) -> Float { return roundFunction((1 + vat) * amount)}

let addGermanVatTo = amountWithVat(0.19){ roundf($0 * 100) / 100}

let addUKVatTo = amountWithVat(0.2)

let amount1 = addGermanVatTo(amount: 101)let amount2 = addGermanVatTo(amount: 200)let amount3 = addUKVatTo(amount: 300)

Page 6: Currying in Swift

Should we consider currying as a revelation?

Page 7: Currying in Swift

func amountWithVat(vat:Float)(amount: Float) -> Float { return roundf((1 + vat) * amount)}

let addGermanVatTo = amountWithVat(0.19)let addUKVatTo = amountWithVat(0.2)

let amount1 = addGermanVatTo(amount: 100)let amount2 = addGermanVatTo(amount: 200)let amount3 = addUKVatTo(amount: 300)

Page 8: Currying in Swift

func amountWithVat(vat:Float) -> Float -> Float { return { (amount:Float) -> Float in return roundf((1 + vat) * amount) }}

let addGermanVatTo = amountWithVat(0.19)let addUKVatTo = amountWithVat(0.2)

let amount1 = addGermanVatTo(100)let amount2 = addGermanVatTo(200)let amount3 = addUKVatTo(300)

Page 9: Currying in Swift

typedef float (^FloatToFloat)(float);

FloatToFloat (^amountWithVat)(float) = ^FloatToFloat (float vat) { return ^(float amount){ return roundf((1 + vat) * amount); }; };

FloatToFloat addGermanVatTo = amountWithVat(.19);FloatToFloat addUKVatTo = amountWithVat(0.2);

float amount1 = addGermanVatTo(100);float amount2 = addGermanVatTo(200);float amount3 = addUKVatTo(300);

Page 10: Currying in Swift

Interesting application of function currying found out by Ole Begemann(http://oleb.net/blog/2014/07/swift-instance-methods-curried-functions/)

Page 11: Currying in Swift

class BankAccount { var balance: Double = 0.0

func deposit(amount: Double) { balance += amount }}

let account = BankAccount()account.deposit(100) // balance is now 100

let depositor = BankAccount.depositdepositor(account)(100) // balance is now 200

Page 12: Currying in Swift

So every method is implemented internaly through function currying

Page 13: Currying in Swift

One More Thing

Page 14: Currying in Swift

Who knows the name of the show I used for

the theme

Page 15: Currying in Swift
Page 16: Currying in Swift

Thank youMaxim Zaks @iceX33