|
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