Slide 1

Slide 1 text

Lens Shinjuku.LT#17 @to4iki 1

Slide 2

Slide 2 text

Me • Takezawa •  • ! • ☕ • ♨ 2

Slide 3

Slide 3 text

what Lens? 3

Slide 4

Slide 4 text

Def. / Feature • getter/setterͷந৅Խɾম͖௚͠(൚༻Խ) • ༷ʑͳσʔλΛڞ௨ͷI/FͰૢ࡞Ͱ͖Δ • ಛఆͷݴޠʹґଘ͠ͳ͍֓೦/ܕ • functional • ෆมߏ଄ / ߹੒Մೳ • Lens Laws 4

Slide 5

Slide 5 text

ekmett/lens 5

Slide 6

Slide 6 text

• Monocle.Lens - elm-monocle • julien-truffaut/Monocle 6

Slide 7

Slide 7 text

https://github.com/julien-truffaut/Monocle/blob/master/image/class- diagram.png 7

Slide 8

Slide 8 text

getter setter 8

Slide 9

Slide 9 text

getter • ΦϒδΣΫτS͔ΒAΛऔΓग़͢ • get: (S) -> A setter • ΦϒδΣΫτSͷ೚ҙͷ஋ΛAʹมߋ͢Δ • set: (S, A) -> S == set: (S) -> A -> S 9

Slide 10

Slide 10 text

͜ΕΒͷ͍͢͝ getter/setter1Λ ೚ҙͷΦϒδΣΫτͷ ೚ҙͷϝϯόʹద༻͢Δͷ͕ Lens 1 https://qiita.com/to4iki/items/f0cc28e1102cf53be85d 10

Slide 11

Slide 11 text

࣮૷ͯ͠ΈΔ 11

Slide 12

Slide 12 text

struct Lens { private let _get: (S) -> T private let _set: (S, T) -> S init(get: @escaping (S) -> T, set: @escaping (S, T) -> S) func get(_ source: S) -> T func set(_ source: S, value: T) -> S } 12

Slide 13

Slide 13 text

͜Μ͚ͩ 13

Slide 14

Slide 14 text

struct User { let name: String } let user = User(name: "hoge") let nameLens = Lens( get: { $0.name }, set: { User(name: $1) } ) nameLens.get(user) // "hoge" nameLens.set("fuga") // User(name:"fuga)" 14

Slide 15

Slide 15 text

Usecase? 15

Slide 16

Slide 16 text

ωετͨ͠σʔλͷ͋ΔҰ෦ ͚ͩΛมߋ͍ͨ͠ struct Street { let name: String } struct Address { let street: Street } struct Company { let address: Address } struct Employee { let company: Company } let employee = Employee(company: Company(address: Address(street: Street(name: "street")))) 16

Slide 17

Slide 17 text

! let updatedEmployee = Employee(company: Company(address: Address(street: Street(name: employee.company.address.street.name.capitalizedString) ) ) ) 17

Slide 18

Slide 18 text

Lens͸߹੒Λ࢖͍ɺ ෆมߏ଄Λอͪͳ͕Β ΞΫηεग़དྷΔ 18

Slide 19

Slide 19 text

struct Lens { ... func compose(_ other: Lens) -> Lens { return Lens( get: { (source: S) -> U in other.get(self.get((source))) }, set: { (source: S, value: U) -> S in self.set(source, value: other.set(self.get(source), value: value)) } ) } } 19

Slide 20

Slide 20 text

(operator΋ఆٛ͠ͱ͘) /// Left-to-Right Composition infix operator >>> : MultiplicationPrecedence func >>> (lhs: Lens, rhs: Lens) -> Lens { return lhs.compose(rhs) } 20

Slide 21

Slide 21 text

Demo 21

Slide 22

Slide 22 text

! let nameLens = Lens(get: { $0.name }, set: { Street(name: $1) } ) let streetLens = Lens
... let addressLens = Lens ... let companyLens = Lens ... let lens: Lens = companyLens >>> addressLens >>> streetLens >>> nameLens let employee = Employee(company: Company(address: Address(street: Street(name: "street")))) let updatedEmployee = lens.modify(employee) { $0.capitalized } // Employee(Company(Address(Street(name: "Street") 22

Slide 23

Slide 23 text

https://github.com/ to4iki/LensKit 23

Slide 24

Slide 24 text

Conclusion • Lens ͸ ͍͢͝getter/setter • ෆมߏ଄Λอͪͳ͕Β • ਂ͍ߏ଄Ͱ΋ • ஋ʹΞΫηεग़དྷΔ • Ϣʔεέʔε͸ਖ਼௚೉͍͠ • ςετ࣌ͷαϙʔτͱͯ͠࢖͏? 24

Slide 25

Slide 25 text

See also • ࠓ͔Β࢝ΊΔ Lens/Prism 25