|
30 | 30 | still left mysterious, please <a href="https://gitter.im/calmm-js/chat">let me know</a> and
|
31 | 31 | I'll try to add some additional notes.</p>
|
32 | 32 | </aside></script></section><section data-markdown><script type="text/template">
|
33 |
| -## Outline |
34 |
| - |
35 |
| -* Part I - Motivation ❓ |
36 |
| -* Part II - Basics 💡 |
37 |
| -* Part III - Examples 😮 |
38 |
| -* Part IV - Exercises 💪 |
39 |
| -* Part V - Wrap up 🎓 |
40 |
| -</script></section><section data-markdown><script type="text/template"> |
41 | 33 | ## Part I - Motivation
|
42 | 34 | </script></section><section data-markdown><script type="text/template">
|
43 | 35 | > My mental model of lenses is that of a path into a data structure. — A
|
|
96 | 88 | <!-- .element: class="fragment" -->Optics are a *game changer*
|
97 | 89 |
|
98 | 90 | <aside class="notes"><p>We'll actually not be going too much into theory in the presentation, but
|
99 |
| -the other claims will definitely be addressed.</p> |
100 |
| -</aside></script></section><section data-markdown><script type="text/template"> |
101 |
| -## Disclaimer |
102 |
| - |
103 |
| -* This will not be a theory lesson |
104 |
| -* This isn't a complete treatment |
105 |
| -* You will not know everything after this training |
106 |
| - |
107 |
| -<aside class="notes"><p>When presenting a topic, I have a tendency to try to mention a lot of |
108 |
| -related details for completeness. I have decided leave such things out of this |
109 |
| -presentation. So, if you find that e.g. I didn't mention some related |
110 |
| -generalization or list full set of related concepts, then most likely that is |
111 |
| -because I made a decision to leave that out due to desire to keep the |
112 |
| -presentation shorter.</p> |
| 91 | +the other claims will definitely be addressed. When presenting a topic, I have |
| 92 | +a tendency to try to mention a lot of related details for completeness. I have |
| 93 | +decided leave such things out of this presentation. So, if you find that e.g. I |
| 94 | +didn't mention some related generalization or list full set of related concepts, |
| 95 | +then most likely that is because I made a decision to leave that out due to |
| 96 | +desire to keep the presentation shorter.</p> |
113 | 97 | </aside></script></section><section data-markdown><script type="text/template">
|
114 | 98 | ## Part II - Basics
|
115 | 99 | </script></section><section data-markdown><script type="text/template">
|
|
119 | 103 | > structure in some particular way and then put it back together.
|
120 | 104 |
|
121 | 105 | *<span class="fragment">Traversals,</span> <span class="fragment">Lenses,</span> <span class="fragment">Isomorphisms,</span> <span class="fragment">..., Getters</span>*
|
122 |
| - |
123 |
| -<!-- .element: class="fragment" -->[Taking apart an |
| 106 | +</script></section><section data-markdown><script type="text/template"> |
| 107 | +[Taking apart an |
124 | 108 | object](https://calmm-js.github.io/partial.lenses/playground.html#PTAEBUEMGsEsDsDmpIAdICcAuL6gPYBGAVgKYDGOCoAtgK4A2WsqDpoAJrAGbekal4OAO6QAngGcAUFPL54EnB0hZIoALygA3gA8AXKADkkQwBpQYg4cJnQALyvlDAXxkgAMgDpEpLAApDHVtlVQBKKQ9PCV8AoPNDAEEk4JVIcMiBGnwAN1JYlLCI4C8ffy9oUjFSDnMQtKKvaP8AbXLK6vMABi6AXXiAMQB5QYL6yLkGNko-L0EsDFhSCVrU9OLvGK80VjEEss85haXzLwFcjGjQlcLIpr9Wz22GXf3DxeXQU9Jzy-iTPqMAHVIBIALRxTirBqeCZTfYVSTXMbrGgIWD0GgzTwIj51NZeYj4BABUG2NqIyE3FH4LjcMRYnHmABKMPk5BUAX6+HwpKulORXlhFH22UgDDox35+M8WVp9K8ovFkpZcng7P8hgAQpheUjpaUsVwJISEP4ERoAHygc3qW1GIKgAD8RkImEMoCs3G5hj5eOhBq8qAw+FQEny8TEPr1-s2niDIYkAFEdORSKgNRDDJHfVDIgGZdsEIg-H4dOYxOY7KFLaBmrpy5XnOZmmXtBX7M4ej0c1TPH2gA)
|
125 | 109 | — [with
|
126 | 110 | narrative](https://calmm-js.github.io/partial.lenses/playground.html#PTAEBUEMGsEsDsDmpIAdICcAuL6gPYBGAVgKYDGOCoAtgK4A2WsqDpoAJrAGbekal4OAO6QAngGcAUFPL54EnB0hZIoALygA3gA8AXKADkkQwBpQYg4cJnQALyvlDAXxkgAMgDpEpLAApDHVtlVQBKUAjIqOiY2OiQUABBcnJSCQlQVAx8VH4sMVAsAAtsukQilFA2BSkPTwlfAKDzQ0S24JVIcLieuISAZV9M7NzsAuLS8srq6TqBGnwAN1ImjrDejZ6EgCVSBeXhnLzxkvwyirUZ2uAvH38vaFIxUg5zEK7Nz6iEgDVYUmEBBIFBwkAymAw4gI3EykFgGAyEzOU0geFgEnw1y8DX8AG0Hk8XuYAAwkgC6LQAYgB5alrD6fBIAWXwXG4BSIZEohVO5yqggychoqHwElgzHkWM8cgYbEofi8giwGH+EjenW6X1iv3+gKyR2wqpQGXQ8MRvJRhUhywRkAYUruCs8aFYYkS908SpVaXMXgENoaoXV62+YAAkvAbThOSCeZMKuj8KAhSKxRL4FKcX58c7UK73U6varfZ5-fxAy0TBSjAB1MEAWmanA1EQSqI4tFZPBO8dA4qlMrlHsekmDDK1WzAAGF8LLYyPzb21MrIAG7VKaAhYPQaE6F2PNRPtWB8Bhk-hhXQsOxN-Bt3QaNDQAupcR8AgAvXbATR82Q0f4hPM832oBdjUqRQVSQDcu3ZPcnjVUBtmleRyBUAJKXwfAvyDP9xxiBJT07NkChfOpBxBJ1FjtOgfTww8ANbadZyHUBqIYWjF2RC4rVXct1zqBYSKomi6OQuR4DQ-xDAAIUwHCD2PAgzyE7seT2B1Gi8LgJBAoQ-BHDQAD5nyeDR1E0QJDFAAB+IxCEwayrG4LDDFw95wgGVhxUOUZmDSQokx0vScAkOhCBxWYbm8LTPH1VAJFWFoxDcxSAJ1AECHgBgCjUCRcnIHhYHIUAwoioZ8BhVEgS5LBNI9eKJAAUR0VJUGkptDBS9yW02DLAVIG0xGKBBkFIVrSHaiCCqKkqypxeqnRoF1Rr8PwdHMMRzDscJ1BM3FdE27bnHMXENu0Lb7GcMkyR6kNmTQGrYywIKeD4AQhFK5U6EoOgBGuTxAbcMAayKFQeXRTIGHERBSngDsOD2eRIJUALIeKFRzEGwRQBcs8wvIHixWFNgnsoUxrnUgQUGp+AH34M4MlESRArY3VSovdh0GwZTYWwDJKr7HAkT5HJmHICRPEpyk-uKfgFgELHIEJp9ilFdhmYySHCFgLgBEoWB5Dtcw7QYfBhFGrL2Be0B4HwaNsrESmUyvdgMRoXwikt7hskfOW2YBcxCCvFAGAxVnVPZdTlNgRAEDtMm6oSEWpnFTwgA)
|
|
199 | 183 | R.chain(R.values, data)
|
200 | 184 |
|
201 | 185 | L.collect([L.elems, L.values], data)
|
| 186 | +// ^^^^^^^^^^^^^^^^^^^ |
202 | 187 | ```
|
203 | 188 |
|
204 | 189 | ```js
|
205 | 190 | R.map(R.map(R.toUpper), data)
|
206 | 191 |
|
207 | 192 | L.modify([L.elems, L.values], R.toUpper, data)
|
| 193 | +// ^^^^^^^^^^^^^^^^^^^ |
208 | 194 | ```
|
209 | 195 |
|
210 | 196 | Optic composition is constant when the selection of elements is constant.
|
|
222 | 208 | R.join('-', R.chain(R.values, data))
|
223 | 209 |
|
224 | 210 | L.join('-', [L.elems, L.values], data)
|
| 211 | +// ^^^^^^^^^^^^^^^^^^^ |
225 | 212 | ```
|
226 | 213 |
|
227 | 214 | ```js
|
228 | 215 | R.sum(R.chain(R.values, data))
|
229 | 216 |
|
230 | 217 | L.sum([L.elems, L.values], data)
|
| 218 | +// ^^^^^^^^^^^^^^^^^^^ |
231 | 219 | ```
|
232 | 220 |
|
233 | 221 | No intermediate collection is computed by traversals.
|
|
250 | 238 |
|
251 | 239 | The above is incomplete!
|
252 | 240 | </script></section><section data-markdown><script type="text/template">
|
| 241 | +## To manipulate data |
| 242 | + |
| 243 | +1. <!-- .element: class="fragment" -->Compose an optic to select the desired elements |
| 244 | + * <!-- .element: class="fragment" -->Write some draft optic |
| 245 | + * <!-- .element: class="fragment" -->Test by querying with it |
| 246 | + ```js |
| 247 | + L.collect L.get |
| 248 | + ``` |
| 249 | + * <!-- .element: class="fragment" -->Iterate |
| 250 | +2. <!-- .element: class="fragment" --> Apply the operation you wanted |
| 251 | + ``` |
| 252 | + L.modify L.set L.remove L.sum L.foldl L.sum ... |
| 253 | + ``` |
| 254 | +3. <!-- .element: class="fragment" -->Go home and spend time with family |
| 255 | +</script></section><section data-markdown><script type="text/template"> |
253 | 256 | ### express so much with so little
|
254 | 257 |
|
255 | 258 | <img src="rivero.png">
|
|
480 | 483 | keys](https://calmm-js.github.io/partial.lenses/playground.html#MYewdgzgLgBAJgQygmBeGBvAUAUwB4IC2AlmEseAMIhw4BcMA5AMoBMADAIwAcjANLgKFqtBowASASX5ZEATxH0YYAK4AbNQIjAAFiBBqAcisIAjHACcGndlwEqADoig4AKsUJLGHHgFp2AJz+ATIAjio40BSQDADaAESc8Xww8azJqQDM8QC6WlAqtGBQEHFYGABmxBbQhkSRYpIQIDJqCLX1DPEACupQUMTJWBAQYGJcE5z+Npwy0IU4xcZmltYC4ZED4KUwsRhwxBAObXLL5lapSSnaIBY4AGoIahEMmQC+KfuHxwinJuddbLXUB3R7PJQAFjeeWGIJwzBMDAA7B9ylUalA6p4dowALIqaAIVrtTGdVK4hAAa0pCAsCCGIzGTHYHFZ-lZcwKRUx-1WMFY6wiUW2cS+RxOZz5aQyN1BTxeMChnwO4t+kou8SBMFlD3lSlY0K0cIRhAYADZUTksG8sFhQJBYFA6ZA2i40DAADIAOkICAcDlIAHMIAAKWJYWKMfBEUjkKg0HD8JgFKCU0hQECUyzIRgwyPR4QJpOMSkgRN5xjyRTFkAQIkV7R6Azq4ul9QqVSeCwtCuOZxuDyJlKMWkAN1rLmeYG6ABPiKOZ4QZzOLDPcwJIxthZBW3IIHJCHJKRAcFB1xHGPNuRBW5mcG0kOfI+iOtji6eO4OzxW2q+h0wIBUSlPxIJ9Ly5RYeRWCxbyzX9O0sHsN0rb4JV5GDh0pPcDz3MCdTBCJiwDaAcFPPDjRMIjDhcYgihNX1cywHIAEogA)
|
481 | 484 | — [with
|
482 | 485 | narrative](https://calmm-js.github.io/partial.lenses/playground.html#PTAECEFMBsHsHdQEsDOoWwLaVJghgCY4CuADqAXgC56gBGeKkBosAdqLQGawBO+VUFQAW1ZGmJMWSNlUi82eaNACeyDnjYAoEJwDGVYks6lS0JHupJ2AOlCgA6qMHxIAchbmA1jiqwK-qhC-lS8mig8-ELCOJQ0wfSQOmCQAB6kfHIEdqAAKv4EIc6griWagn5CYWwo0NS+MaA+KmiwXNE4sHQAVpAGaJUAYjJsqMLJnGwsShgUvLDkIjgABigobMugpPOk8lRIkCgANImWkg04aRm8WaCRAriSgmywVBMyetDERNFipHg3CzEOq8LYHPSddpxPA2LRaPTsFCCaGgAC8oAA3lo0nhMDIrOwAMKwIgALlAbgAygAmAAMAEYABxuI7Y1K44lkikACQAkiytJQVJzIOS2MDoKyUHphLBYNAAHLETB0eTk+m0hmsshxSC5JDYcluOlMgC0tIAnOaLQKAI7EQ77RHkgDaACJ6W6Tm7qV7QG6AMxugC6UsMRFkKFdWgxXCQvCRCtxhyNvIwArqieT5LdAAVgVR9l6tGs2EaGRX6eaNfSBUjvpBZEqVWrQPTWfbHdYaq6MQRUGY8Cpm6reDnPSdpXxIAA1JQO8kBgC+Jz7A7qw+Vo5zQcnCN4s-notAABYl6GS-vIJTleSAOwrmNxhNUJPYKMUgCyTzwGcYr+zf1PzwLwvABPBi1Lcs6Rg80YLrcNG1fLdW2pDsHSRbsPxdNcUEHTcWzHf1fT3ac5y+Y8z1Xfs8I3EdW0DP0pwPciF1AalzylK8b0wckADZH2DLQlzhXRuXkHAgk0cQsD4UhhFQTBfgqapanqNAuHmJSlnUOQFGMRR33UUAAFE2AAc3MFBhGCCY0j0xRoFAQzDmM4Y2FGazYXhREVPCOo5DRUAABkbHwUwZHMlAAAoXS0F03BxPFFCdNgRRZClDCoLwZD8Hwbl-C8EqS9KTjcLxYHcIqPCHUqKVgFBCtZBLpVleV6N4DLytgYFiHFbB5jcaqdXqfVsC6gEADcGrkL42FzAATpBJoWzAFoW3gFqG5q3E7TDES6rwWhUTAVC8JgqG2+K3HrCMqBQQ7YB8OpqCuhLnyzd8usgQxRmwS7qszADxrKlBiC8PqDSQN6bsQpsUM6sqKuexh+vkWAYZo-COsO47Toe6rmMPCiutIVA5B+mGiZ40nycgJAIx4-Ahq0YMAEpRLAQY+FAJKzFFOFQvMn7otCfz6lB7jlTcDmJgVV4GjEJYD3EZyQlUgLuzuHnVnWZYcgAQQ0QtIEwUgKnV8XAt1jYJminnNDUV4YlBPqrNuSajzZrZ5gIYgITQZY+qIOM2GYZZSU5oWRbFmoAsgUH1hlznQEpWATllRBChKXwNfqDomkgFoAH57GCym0ARM2GpwWgxcm+RGqckQxHMyrWgb3gJiUZvGmaNAZE4ZzHWYChqFoJFeH9wwVbaTheDCFpJhYLpen6SOfJqQR+5MzuVHgF2cHRUK6gALxUaKDz0NEAD4QpsBEpmi+KACUbFQaKDYXoc2ZOF1QpgKbY4oAr7BiKm-D+AB5HofQqC-1AP-GwSFeAHGAQA6AQCTihSQFwEy0AmDRWigAfROEgb2qI75IDRKidEtI-6hhAX0NmYCtBs1lroNOJxuhPASJ3HBKgTgYMugMXgahlihQRMoWBmxKhMAuIXFoG8QASPlBggw0Ud57wPhJE40J2FgHyKAPQB587SVQLJXg8lFLKSqFbVyPcC79xOKUSwHAXiIG4UiEwZgVATB0ssWOak5CbHMZgOSCkUBKTEA4nSPA9DnFaO0fxmj5D70PssPxYRO5Nw3o-Lx9l5COTTP4Y+Ng8CmFUAbKgGii4oF3qk7RB4TiBPjvo0AyxhZUACZFaI8xiDmRsv4gp+loDFM2KUOgztbFx3zjpfuy85gLD8bKJgPsFh7FQdrUEB8LCDMPqrF40ygndiUcAaO1ThlFIwLo8ebTIHtARMQBMCcC7LEuUoMZnB8H+HgHwc6xkZDZIFskc5vI2BAuiu80Z1z76dMhakByHyYV6LaQ4HAriThz0ec8k45xXkpNEY0yAMismN2MJEVgysthPIyEwFAsJdDc1BHzDBzj0U9WgCwR+ndBCqioK4RsRjkxOU0CwHwDA6BCtWf3U55zoqhXKT4qpNSWj1MJYfLB78MDEJsOKvAdBCSMBeUQh+wrDVMDYTcmgdyw5bFgLlBINAfCcHgEOO4WlohBBZZJAYxQXFmLNhg7AsgSiygwWPGgExJ7TyeTgPCmhRgWRkmEyxETMBoHgEgEQPVBB4AMEYZQagqAqB6TpUJ4TFLvEDabJCBIOD7AGVQVQjrGjWXKZCAuKJo35oPDke5Rieo4uQIIVA3dvl2rWEgOg4bKhV1pT6ixVjIkDw0Lgac6BQgxrCE5LgjAFLsE4GgayCBtC6EHjpMOCLebsmrTYIAA)
|
483 |
| - — |
484 |
| - [structurally](https://calmm-js.github.io/partial.lenses/playground.html#MYewdgzgLgBAJgQygmBeGBvAUAUwB4IC2AlmEseAMIhw4BcMA5AMoBMADAIwAcjANLgKFqtBowASASX5ZEATxH0YYAK4AbNQIjAAFiBBqAcisIAjHACcGndlwEqADoig4AKsUJLGHHgFp2AJz+ATIAjio40BSQDADaAESc8Xww8azJqQDM8QC6WlAqtGBQEHFYGABmxBbQhkSRYpIQIDJqCLX1DPEACupQUMTJWBAQYGJcE5z+Npwy0IU4xcZmltYC4ZED4KUwsRhwxBAObXLL5lapSSnaIBY4AGoIahEMmQC+KfuHxwinJuddbLXUB3R7PJQAFjeeWGIJwzBMDAA7B9ylUalA6p4dowALIqaAIVrtTGdVK4hAAa0pCAsCCGIzGTHYHFZ-lZcwKRUx-1WMFY6wiUW2cS+RxOZz5aQyN1BTxeMChnwO4t+kou8SBMFlD3lSlY0K0cIRhAYADZUTksG8sFhQJBYA47gBzOkHMDOpogNAwAAyADoHMRgJSABTYApQSmkKAgSmWZBifBEUjkKg0HAySkgLzJ4QZmQgCAIMTyRRZkDqFSqTwWEBibR6AzqmS0gBuRZczzA3QAJ8Q273CL3exZe2JHM43B5MwJKXIIHJCHJKRAcFAxBthZAK-G2kgyox5tyIDIA7S6XJQ1gA0GQ+HcAUwDON0x0R1sXMVJTqx5iGI2g-WcsGzPd2hrSx6yYY9Fh5FYLBkNsnhIQkkIAQQsDtoBwZ44kYLcth3FJzwsS9Q1vYMwwwGB50XZccRVH4-ng-gYCDbD1wbOEwQiRgYDeABKASYXYlxiCKE1CBLaDjRMRhrQErBFKtQTbQDZ111DJ0cFdBB3U9ZoUmcBABKAA) |
| 486 | + — [structurally](https://calmm-js.github.io/partial.lenses/playground.html#MYewdgzgLgBAJgQygmBeGBvAUAUwB4IC2AlmEseAMIhw4BcMA5AMoBMADAIwAcjANLgKFqtBowASASX5ZEATxH0YYAK4AbNQIjAAFiBBqAcisIAjHACcGndlwEqADoig4AKsUJLGHHgFp2AJz+ATIAjio40BSQDADaAESc8Xww8azJqQDM8QC6WlAqtGBQEHFYGABmxBbQhkSRYpIQIDJqCLX1DPEACupQUMTJWBAQYGJcE5z+Npwy0IU4xcZmltYC4ZED4KUwsRhwxBAObXLL5lapSSnaIBY4AGoIahEMmQC+KfuHxwinJuddbLXUB3R7PJQAFjeeWGIJwzBMDAA7B9ylUalA6p4dowALIqaAIVrtTGdVK4hAAa0pCAsCCGIzGTHYHFZ-lZcwKRUx-1WMFY6wiUW2cS+RxOZz5aQyN1BTxeMChnwO4t+kou8SBMFlD3lSlY0K0cIRhAYADZUTksG8sFhQJBYA47gBzOkHMDOpogNAwAAyADoHMRgJSABTYApQSmkKAgSmWZBifBEUjkKg0HAySkgLzJ4QZmQgCAIMTyRRZkDqFSqTwWEBibR6AzqmS0gBuRZczzA3QAJ8Q273CL3exZe2JHM43B5MwJKXIIHJCHJKRAcFAxBthZAK-G2kgyox5tyIDIA7S6XJQ1gA0GQ+HcAUwDON0x0R1sXMVJTqx5iGI2g-WcsGzPd2hrSx6yYY9Fh5FYLBkNsnhIQkkIAQQsDtoBwZ44kYLcth3FJzwsS9Q1vYMwwwGB50XZccRVH4-ng-gYCDbD1wbOEwQiRgYDeABKASYXYlxiCKE1CBLaDjRMRhrQErBFKtQTbQDZ111DJ0cFdBB3U9ZoUmcBABKAA) |
485 | 487 |
|
486 |
| -* [Parsing and pretty-printing |
487 |
| - combinators](https://calmm-js.github.io/partial.lenses/playground.html#PTAEAsBdIBwLhAd2QOgJYDsBmB7ATgLYCGkaA1igK4ZoC0xeARpXgOYoAmApsAH55cM3ADbBqMIngDOPAFCyQoAJIZIXPDAFq8oXDsDdwLQDGRYUcrDKU0LVt37Dx0+cuH8ozgxTIoTNs1cPgC8oAAUggBuADSgXAAemgCUoEEAfKAA3rJSiGiQRuBh8ZookACeMFzJWSYyoADkwkQE9XCyWiwYoBGmlFwp6X7qAZChADIoMqPFeCgSeM0xPZZcMZGJawmzjDgcZYmytf31RDAwre2Bnb6qw1rhGNGxWyhY1ImhQxr3kZslkqxEgcjg0BFgLh08F1IgBtGYoDDNLgAXVAAF9ZBiFGAAMI4AiMTAkfDWPSgAAKkikmFYoCIQgpWnKtHJeD8NNAuUghXmpFMvik+PwMHAaCkBGsTncnm8oEFLCMXAA8lgUqAAEroLAAUWEMlCsk1YtCAGVIGyMICooaUAIYE1FaFgDCAD4AHTdGTRoUSMLdyIAegASADUACoAPwoZHAVgxeoeoMAMnqG1kE1YgVC9XleEVqdkB0OMp8ACscJg1aFhOApDE8LXkmlMrI0Krq7WUMJBKxuaAk0nQA2pF2e9zqsWvD5gqAa1IYXPR5a+7RQABGVEhoe1mEABmRrfbwDdiBPLphAdCyLdoRdgCTCYClLjeUKQIFDq5Q2e10Bb+oNX9tykTFLkga450A4cQMnWVIBwMhBDVCRoHULpmxqEsPzVdUuFYbUElCAADS8gwyXNFRVUJkO0DBEjRRIPSkMNQlCCM4BQd1aLDRIg0Ig5IS6CYxRwA1rGbUIjSkU1zRpGIpGSAcwjEj8UHiLgjFCeTkgjUAYXnAAmZE5JhDdUTgUBqG4LBMC4Dg0xgAYwkk0IAEE8AWMoYhgbTQHLTAqJMozQBgPdkWSczLK4ayMFsg4DixDwp1AHBVRCZY+kciZiDOGlPgwGBKGCdIYUwArIBiEr8sKpZehRMLpSS4TsuwlBzHcsoWOEryzibYqzhgGIJiMPAcCkKSYRhILhLC+qYJ8LgCBgco1RS0JJqLRLZVOSoGRCGBhMcmF01akaxrW-bBQq5EwutLLtty0I4jrUBPLlXrdIm56yiCp6gr0iqUEBp6Ym+66DgPOa5S4ABHPoMEVKtAbmYT5MOhaltei7RpQbLQm2wQ7IhzafGIDAyjVCZqFwYQOAarbhBokg0AiZ8KZQUxGdIFngMhmSCCQg7myOiYBAEIgOAk20uHtIhHWAAM3SY4B41TeyuuO7L9stUIdCFmF6nqesgrweqicw8k1QyDnUKZ7mYia04YlJ16ZFhwRFRiOCEIwT22QILFFEMEwzAsKwKSpdR+0ZQJmVZL4bFcROk+cOmfB6NkiEYbs1XJUp4MEJ0TxDYANsw4kCDQIx8ICMa0E8NmmgALw6n1HNz62oVt58DVzh2YHGHH7u1xECH6IWR9WTJykqcz6jBQ3QAntEbu6SQ0Ez7s017wVcY1ofWHCQ79ezNZ40SeogpRLfJhhuHHVzr2C-qbMNlADxFpwSzq4EWvPBiB-84YBfqrQshZS5JXfjAT+Qhv7PmpPXEIEwm4t3eu3BmNsubd1kNvfEpwDR3RytrKikhFigB2Hsd6R19b6AXvMUh9Q7wL3Id9a0GRp5cFnk0FoXkSEEBiMwjEN1sE3zdvDLgoQAHe2zDQ1+6d15Z0npIp+jDX6QOgRwWBv9aKFmtDg3ewtB6EIPuELYfxpCULhKY0ASMZhSD+jMMxdihETGphLAhWtjFvB9nSNgFivExABEFNhFQOENG2gvfxPjWDLyBLIIywjnZ4zghXKuWw4F120XFcBsouGMA4EQHOpQ-ahDUV-NJWiiwgHkBmLMuT8nxn0HEUAd5QD6HJi0ppj0Xrn0SEAA) |
| 488 | +* [Parsing and pretty-printing combinators](https://calmm-js.github.io/partial.lenses/playground.html#PTAEAsBdIBwLhAd2QOgJYDsBmB7ATgLYCGkaA1igK4ZoC0xeARpXgOYoAmApsAH55cM3ADbBqMIngDOPAFCyQoAJIZIXPDAFq8oXDsDdwLQDGRYUcrDKU0LVt37Dx0+cuH8ozgxTIoTNs1cPgC8oAAUggBuADSgXAAemgCUoEEAfKAA3rJSiGiQRuBh8ZookACeMFzJWSYyoADkwkQE9XCyWiwYoBGmlFwp6X7qAZChADIoMqPFeCgSeM0xPZZcMZGJawmzjDgcZYmytf31RDAwre2Bnb6qw1rhGNGxWyhY1ImhQxr3kZslkqxEgcjg0BFgLh08F1IgBtGYoDDNLgAXVAAF9ZBiFGAAMI4AiMTAkfDWPSgAAKkikmFYoCIQgpWnKtHJeD8NNAuUghXmpFMvik+PwMHAaCkBGsTncnm8oEFLCMXAA8lgUqAAEroLAAUWEMlCsk1YtCAGVIGyMICooaUAIYE1FaFgDCAD4AHTdGTRoUSMLdyIAegASADUACoAPwoZHAVgxeoeoMAMnqG1kE1YgVC9XleEVqdkB0OMp8ACscJg1aFhOApDE8LXkmlMrI0Krq7WUMJBKxuaAk0nQA2pF2e9zqsWvD5gqAa1IYXPR5a+7RQABGVEhoe1mEABmRrfbwDdiBPLphAdCyLdoRdgCTCYClLjeUKQIFDq5Q2e10Bb+oNX9tykTFLkga450A4cQMnWVIBwMhBDVCRoHULpmxqEsPzVdUuFYbUElCAADS8gwyXNFRVUJkO0DBEjRRIPSkMNQlCCM4BQd1aLDRIg0Ig5IS6CYxRwA1rGbUIjSkU1zRpGIpGSAcwjEj8UHiLgjFCeTkgjUAYXnAAmZE5JhDdUTgUBqG4LBMC4Dg0xgAYwkk0IAEE8AWMoYhgbTQHLTAqJMozQBgPdkWSczLK4ayMFsg4DixDwp1AHBVRCZY+kciZiDOGlPgwGBKGCdIYUwArIBiEr8sKpZehRMLpSS4TsuwlBzHcsoWOEryzibYqzhgGIJiMPAcCkKSYRhILhLC+qYJ8LgCBgco1RS0JJqLRLZVOSoGRCGBhMcmF01akaxrW-bBQq5EwutLLtty0I4jrUBPLlXrdIm56yiCp6gr0iqUEBp6Ym+66DgPOa5S4ABHPoMEVKtAbmYT5MOhaltei7RpQbLQm2wQ7IhzafGIDAyjVCZqFwYQOAarbhBokg0AiZ8KZQUxGdIFngMhmSCCQg7myOiYBAEIgOAk20uHtIhHWAAM3SY4B41TeyuuO7L9stUIdCFmF6nqesgrweqicw8k1QyDnUKZ7mYia04YlJ16ZFhwRFRiOCEIwT22QILFFEMEwzAsKwKSpdR+0ZQJmVZL4bFcROk+cOmfB6NkiEYbs1XJUp4MEJ0TxDYANsw4kCDQIx8ICMa0E8NmmgALw6n1HNz62oVt58DVzh2YHGHH7u1xECH6IWR9WTJykqcz6jBQ3QAntEbu6SQ0Ez7s017wVcY1ofWHCQ79ezNZ40SeogpRLfJhhuHHVzr2C-qbMNlADxFpwSzq4EWvPBiB-84YBfqrQshZS5JXfjAT+Qhv7PmpPXEIEwm4t3eu3BmNsubd1kNvfEpwDR3RytrKikhFigB2Hsd6R19b6AXvMUh9Q7wL3Id9a0GRp5cFnk0FoXkSEEBiMwjEN1sE3zdvDLgoQAHe2zDQ1+6d15Z0npIp+jDX6QOgRwWBv9aKFmtDg3ewtB6EIPuELYfxpCULhKY0ASMZhSD+jMMxdihETGphLAhWtjFvB9nSNgFivExABEFNhFQOENG2gvfxPjWDLyBLIIywjnZ4zghXKuWw4F120XFcBsouGMA4EQHOpQ-ahDUV-NJWiiwgHkBmLMuT8nxn0HEUAd5QD6HJi0ppj0Xrn0SEAA) |
488 | 489 |
|
489 | 490 | * [Flattening a
|
490 | 491 | tree](https://calmm-js.github.io/partial.lenses/playground.html#MYewdgzgLgBAJgQygmBeGBtAUAbyyASzgC4YBGAGi2AAsCAbOAJwFMxTsdCSYAmCmLQbM2HLkVIBmAUMat2mALoBfFVXE8ALDLpzRS5VkVZl6-BJgBWKrJELO3UgDYdw+RzW5HMAOyu99hqkABz+dh6qhsZRWNTg0DAAZvRIUGwEYADmAEoArvQsEGgwADIAdAj0aUxgSAQAboUAFFjlALYIAA6dGZlNIGgAfJg4ZWMgYe4GAhij4wKdEBGKigCUVNjtXT1ZTU3AEAIgq0MjY2UTgrrhghCmmJcHK+utZQBeBJ0A6gRQNGQtLbdXp7ToyBYQE6oYbYDBgmBzMrABYIeRQJYwRaqdTnZGYjFwgTnRYqIyrLDkxQbV65LJMEC5ToAIQAnk1yrRCMBmhgAOSLXkCAAMAl53F5VJgYqIvNWL3KqKYCBZEHZZQ6wN2-QhUJhiMuWIE+pRaIxWLWlIpsXKmRYUBamwqUDSbU6UAAoo0mCyAKqdJrJVLpLJ5AqQqhUrCIZAUoA)
|
|
521 | 522 | </script></section><section data-markdown><script type="text/template">
|
522 | 523 | ## Limitation: Single data structure
|
523 | 524 |
|
524 |
| -* <!-- .element: class="fragment" -->But perhaps there are ways... |
525 |
| -* <!-- .element: class="fragment" -->Laziness? (Works in read direction.) |
526 |
| -* <!-- .element: class="fragment" -->Some sort of cross product or join |
527 |
| - combinator? |
528 |
| -* <!-- .element: class="fragment" -->Or use isomorphism combinators to massage |
529 |
| - data? |
530 |
| -* <!-- .element: class="fragment" -->Extend optics to address multiple data |
531 |
| - structures at once? |
| 525 | +* But perhaps there are ways... |
| 526 | +* Laziness? (Works in read direction.) |
| 527 | +* Some sort of cross product or join combinator? |
| 528 | +* Or use isomorphism combinators to massage data? |
| 529 | +* Extend optics to address multiple data structures at once? |
532 | 530 | * <!-- .element: class="fragment" -->Somewhat open question (to me)
|
533 | 531 | </script></section><section data-markdown><script type="text/template">
|
534 | 532 | ## When might I recommend to use optics?
|
|
595 | 593 |
|
596 | 594 | <!-- .element: class="fragment" -->Ask questions and request feedback.
|
597 | 595 | </script></section><section data-markdown><script type="text/template">
|
598 |
| -## What about Partial Lenses? |
| 596 | +## What about [Partial Lenses](https://github.com/calmm-js/partial.lenses/)? |
| 597 | + |
| 598 | +<small>(The lib used in these slides.)</small> |
| 599 | + |
| 600 | +* Fairly comprehensive API |
| 601 | +* Lots of interactive documentation |
| 602 | +* High test coverage |
| 603 | +* Been in production use since beginning |
| 604 | +* Optimized to some degree |
| 605 | +* Engineered for DCE |
599 | 606 |
|
600 | 607 | <!-- .element: class="fragment" -->I **_can't_** recommend it, because...
|
601 | 608 |
|
|
0 commit comments