[Functional Programming] Lens & Prism

Muhammad Alfiansyah
3 min readSep 23, 2022

--

Photo by Jukan Tateisi on Unsplash

Its OKAY to NOT be OKAY

Functional Programming atau biasa kita sebut Declarative programming yaitu bagaimana kita mendeskripsikan suatu program dengan apa yang dilakukan (WHAT) sedangkan sebaliknya Imperative Programming mendeskripsikan sebuah program dengan bagaimana program berjalan (HOW).

Imperative mendeskripsikan secara spesifik instruksi-instruksi (step by step) yang perlu dilakukan oleh program. Sedangkan Deklaratif programming merupakan layer abstraksi diatas imperative programming karena kita tidak perlu tau atau khawatir bagaimana program melakukanya.

Saya jadi ingat perumpamaan yang diberikan oleh Guru sekolah saya di SMK dulu. Dia bertanya kepada siswa

Bagaimana cara memasukan gajah ke lemari es ?

Awalnya semua siswa nggak ada yang bisa menjawab karena logika mereka jalan, hewan sebesar gajah bagaimana bisa dimasukan ke lemari es ?

Hingga muncul siswa kreatif bilang

  • Gajah dipotong-potong
  • Masukan ke lemari es

Nggak salah tapi saya nggak peduli dengan caramu mengolah Gajah sehingga muat ke lemari es, yang saya tanyakan apa yang perlu dilakukan untuk memasukan Gajah ke lemari es ? Jawabanya simpel

  • Buka lemari es
  • Masukan Gajah ke lemari es

Sekilas kedua langkah diatas sama, hanya saja ketika masuk ke deklaratif kita tidak perlu tau bagaimana sebuah program memproses sesuatu, kita hanya perlu tau apa yang perlu dilakukan untuk mencapai sesuatu, sedang kan prosesnya terserah pada kalian 😛.

Okay <- The right way to spell oke in english wk wk, sometimes just too comfortable use oke than okay.

Okay …next masuk ke Lens dan Prism, kembali lagi ke pertanyaan apa sih itu lens ?

Lens

Lenses or Lens -> Composable Getters and Setters for Functional Programming.

Untuk lebih jelasnya bisa temen-temen baca di artikel milik Eric Elliot ini

Disana juga dijelaskan kenapa menggunakan lens, intinya lens itu immutable, jadi ketika kita mengubah value dari suatu object maka object yang direturn != old_object.

Yang menarik dari deskripsi Eric adalah kata Compose, yang dimaksud Compose adalah ketika kita memiliki 2 function dan function pertama menghasilkan output yang menjadi input pada function kedua.

func pertama(A) -> B
func kedua(B) -> C
func pertama + func kedua = (A) -> C
let titleLens = LoginPage.lens.titlelet usernameTextLens = LoginPage.lens.credentials..CredentialBox.lens.usernameField..TextField.lens.textlet buttonStateLens = LoginPage.lens.buttonState

Advance Implementation

let passwordLens = (\LoginPage.credendials.passwordField.text).lenslet loginPage = LoginPage(title: "", credendials: CredentialBox(usernameField: TextField(text: "username", placeholder: "username", secureText: false), passwordField: TextField(text: "password", placeholder: "password", secureText: true)), buttonState: .empty)let text = passwordLens.get(passwordLens.set("ok")(loginPage))print(text) // Result = ok

Unfortunately, this is not going to work if the Value property onto which the lens is focusing is let, thus immutable - we won’t get a WritableKeyPath for it - and also KeyPath is not available for enums, so code generation is still our friend here.

Kesimpulan

Sebenarnya Lens hanya Setter Getter biasa hanya saja object yang dihasilkan setelah melakukan modify berbeda dengan object sebelumnya.

Not mutating but Copying

What Next ?

Mungkin untuk selanjutnya kita akan masuk ke sorting dengan menggunakan Lens atau Prism. Sebenarnya masih banyak yang bisa dikembangkan dari Lens atau Prism.

Untuk lebih jauh bisa coba temen-temen baca pada artikel-artikel yang berhubungan dibawah.

Semoga membantu 🙏

Usefull Sources

--

--

No responses yet