<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Kotlin – IMG.LY Blog</title><description>Posts tagged Kotlin on the IMG.LY blog.</description><link>https://img.ly/blog/tag/kotlin/</link><language>en-us</language><image><url>https://img.ly/apple-touch-icon.png</url><title>Kotlin – IMG.LY Blog</title><link>https://img.ly/blog/tag/kotlin/</link></image><atom:link href="https://img.ly/blog/tag/kotlin/rss.xml" rel="self" type="application/rss+xml"/><generator>Astro</generator><lastBuildDate>Mon, 15 Jun 2026 15:48:38 GMT</lastBuildDate><ttl>60</ttl><item><title>Elegant Event Handling in Kotlin - A Refactoring Walkthrough</title><link>https://img.ly/blog/kotlin-code-refactoring-for-peak-performance/</link><guid isPermaLink="true">https://img.ly/blog/kotlin-code-refactoring-for-peak-performance/</guid><description>Unlock peak performance in Kotlin code with these expert refactoring tips.</description><pubDate>Fri, 29 Sep 2023 07:00:53 GMT</pubDate><content:encoded>&lt;p&gt;In the world of software development, code refactoring is the hero that rescues us from tangled and inefficient code. In this article, we’ll embark on an adventure to revamp Kotlin code handling diverse events. Our mission? To enhance performance and style, making the code sleeker, more maintainable, and a joy to work with.&lt;/p&gt;
&lt;h2 id=&quot;what-we-aim-to-achieve&quot;&gt;What We Aim to Achieve&lt;/h2&gt;
&lt;p&gt;On this journey to transform Kotlin event handling, our goal is to refine our code to be more efficient, readable, and maintainable. We’re introducing a variety of improvements, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Replacing a convoluted &lt;code&gt;when&lt;/code&gt; statement with a &lt;code&gt;HashMap&lt;/code&gt; for lightning-fast (O(1)) performance.&lt;/li&gt;
&lt;li&gt;Infusing syntactic sweetness with inline functions and &lt;a href=&quot;https://kotlinlang.org/docs/inline-functions.html#reified-type-parameters&quot;&gt;reified&lt;/a&gt; type parameters.&lt;/li&gt;
&lt;li&gt;Employing delegated properties for cleaner dependency injection.&lt;/li&gt;
&lt;li&gt;Adhering to the Single Responsibility Principle by enabling multiple specialized event handler functions.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;step-1-the-starting-line&quot;&gt;Step 1: The Starting Line&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&quot;sven2244_a_playful_abstract_artwork_that_represents_the_complex_6e9491ff-8203-4ae2-9a5e-52025e4010be.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 1856px) 1856px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;1856&quot; height=&quot;656&quot; src=&quot;https://img.ly/_astro/2_1H0FvJ.webp&quot; srcset=&quot;/_astro/2_Z2e3gQ7.webp 640w, /_astro/2_2dHdPv.webp 750w, /_astro/2_ZB5tWb.webp 828w, /_astro/2_Z1Ro7yX.webp 1080w, /_astro/2_Qgvw5.webp 1280w, /_astro/2_NDMYj.webp 1668w, /_astro/2_1H0FvJ.webp 1856w&quot;&gt;&lt;/p&gt;
&lt;p&gt;Our adventure begins with a glance at the original code. This codebase manages a variety of block events through a function named &lt;code&gt;handleBlockEvent&lt;/code&gt; and an event handler function called &lt;code&gt;onEvent&lt;/code&gt;. Let’s unveil the original code:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;kotlin&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;open&lt;/span&gt;&lt;span&gt; fun&lt;/span&gt;&lt;span&gt; onEvent&lt;/span&gt;&lt;span&gt;(event: &lt;/span&gt;&lt;span&gt;Event&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    // ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    handleBlockEvent&lt;/span&gt;&lt;span&gt;(engine, &lt;/span&gt;&lt;span&gt;getBlockForEvents&lt;/span&gt;&lt;span&gt;(), &lt;/span&gt;&lt;span&gt;checkNotNull&lt;/span&gt;&lt;span&gt;(assetsRepo.fontFamilies.&lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;getOrThrow&lt;/span&gt;&lt;span&gt;())&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;fun&lt;/span&gt;&lt;span&gt; handleBlockEvent&lt;/span&gt;&lt;span&gt;(engine: &lt;/span&gt;&lt;span&gt;Engine&lt;/span&gt;&lt;span&gt;, block: &lt;/span&gt;&lt;span&gt;DesignBlock&lt;/span&gt;&lt;span&gt;, fontFamilyMap: &lt;/span&gt;&lt;span&gt;Map&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;FontFamilyData&lt;/span&gt;&lt;span&gt;&gt;, event: &lt;/span&gt;&lt;span&gt;BlockEvent&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    when&lt;/span&gt;&lt;span&gt; (event) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        BlockEvent.OnDelete &lt;/span&gt;&lt;span&gt;-&gt;&lt;/span&gt;&lt;span&gt; engine.&lt;/span&gt;&lt;span&gt;delete&lt;/span&gt;&lt;span&gt;(block)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        BlockEvent.OnBackward &lt;/span&gt;&lt;span&gt;-&gt;&lt;/span&gt;&lt;span&gt; engine.&lt;/span&gt;&lt;span&gt;sendBackward&lt;/span&gt;&lt;span&gt;(block)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        BlockEvent.OnDuplicate &lt;/span&gt;&lt;span&gt;-&gt;&lt;/span&gt;&lt;span&gt; engine.&lt;/span&gt;&lt;span&gt;duplicate&lt;/span&gt;&lt;span&gt;(block)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        BlockEvent.OnForward &lt;/span&gt;&lt;span&gt;-&gt;&lt;/span&gt;&lt;span&gt; engine.&lt;/span&gt;&lt;span&gt;bringForward&lt;/span&gt;&lt;span&gt;(block)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        BlockEvent.ToBack &lt;/span&gt;&lt;span&gt;-&gt;&lt;/span&gt;&lt;span&gt; engine.&lt;/span&gt;&lt;span&gt;sendToBack&lt;/span&gt;&lt;span&gt;(block)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        BlockEvent.ToFront &lt;/span&gt;&lt;span&gt;-&gt;&lt;/span&gt;&lt;span&gt; engine.&lt;/span&gt;&lt;span&gt;bringToFront&lt;/span&gt;&lt;span&gt;(block)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        BlockEvent.OnChangeFinish &lt;/span&gt;&lt;span&gt;-&gt;&lt;/span&gt;&lt;span&gt; engine.editor.&lt;/span&gt;&lt;span&gt;addUndoStep&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        is&lt;/span&gt;&lt;span&gt; BlockEvent.OnChangeBlendMode &lt;/span&gt;&lt;span&gt;-&gt;&lt;/span&gt;&lt;span&gt; onChangeBlendMode&lt;/span&gt;&lt;span&gt;(engine, block, event.blendMode)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        is&lt;/span&gt;&lt;span&gt; BlockEvent.OnChangeOpacity &lt;/span&gt;&lt;span&gt;-&gt;&lt;/span&gt;&lt;span&gt; engine.block.&lt;/span&gt;&lt;span&gt;setOpacity&lt;/span&gt;&lt;span&gt;(block, event.opacity)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        is&lt;/span&gt;&lt;span&gt; BlockEvent.OnChangeFillColor &lt;/span&gt;&lt;span&gt;-&gt;&lt;/span&gt;&lt;span&gt; onChangeFillColor&lt;/span&gt;&lt;span&gt;(engine, block, event.color)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        // and so on...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;sealed&lt;/span&gt;&lt;span&gt; class&lt;/span&gt;&lt;span&gt; BlockEvent&lt;/span&gt;&lt;span&gt; : &lt;/span&gt;&lt;span&gt;Event&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    object&lt;/span&gt;&lt;span&gt; OnChangeFinish&lt;/span&gt;&lt;span&gt; : &lt;/span&gt;&lt;span&gt;BlockEvent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    object&lt;/span&gt;&lt;span&gt; OnForward&lt;/span&gt;&lt;span&gt; : &lt;/span&gt;&lt;span&gt;BlockEvent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    object&lt;/span&gt;&lt;span&gt; OnBackward&lt;/span&gt;&lt;span&gt; : &lt;/span&gt;&lt;span&gt;BlockEvent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    object&lt;/span&gt;&lt;span&gt; OnDuplicate&lt;/span&gt;&lt;span&gt; : &lt;/span&gt;&lt;span&gt;BlockEvent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    object&lt;/span&gt;&lt;span&gt; OnDelete&lt;/span&gt;&lt;span&gt; : &lt;/span&gt;&lt;span&gt;BlockEvent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    object&lt;/span&gt;&lt;span&gt; ToFront&lt;/span&gt;&lt;span&gt; : &lt;/span&gt;&lt;span&gt;BlockEvent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    object&lt;/span&gt;&lt;span&gt; ToBack&lt;/span&gt;&lt;span&gt; : &lt;/span&gt;&lt;span&gt;BlockEvent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    data&lt;/span&gt;&lt;span&gt; class&lt;/span&gt;&lt;span&gt; OnChangeBlendMode&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt; blendMode: &lt;/span&gt;&lt;span&gt;BlendMode&lt;/span&gt;&lt;span&gt;) : &lt;/span&gt;&lt;span&gt;BlockEvent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    data&lt;/span&gt;&lt;span&gt; class&lt;/span&gt;&lt;span&gt; OnChangeOpacity&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt; opacity: &lt;/span&gt;&lt;span&gt;Float&lt;/span&gt;&lt;span&gt;) : &lt;/span&gt;&lt;span&gt;BlockEvent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    data&lt;/span&gt;&lt;span&gt; class&lt;/span&gt;&lt;span&gt; OnChangeFillColor&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt; color: &lt;/span&gt;&lt;span&gt;Color&lt;/span&gt;&lt;span&gt;) : &lt;/span&gt;&lt;span&gt;BlockEvent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    // and so on...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To use the original code, you’d typically call the &lt;code&gt;onEvent&lt;/code&gt; function with a specific event:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;kotlin&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;onEvent&lt;/span&gt;&lt;span&gt;(BlockEvent.&lt;/span&gt;&lt;span&gt;OnChangeFillColor&lt;/span&gt;&lt;span&gt;(Color.RED))&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This would then trigger the &lt;code&gt;handleBlockEvent&lt;/code&gt; function to deal with the event at hand. Now, let’s embark on our first refactoring adventure.&lt;/p&gt;
&lt;h2 id=&quot;step-2-unveiling-hashmaps-and-payloads-for-peak-performance&quot;&gt;Step 2: Unveiling HashMaps and Payloads for Peak Performance&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&quot;sven2244_an_abstract_image_ofa_futuristic_cityscape_with_neon-l_fbda2c5b-b80f-430b-9f00-609ceecc1292.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 1856px) 1856px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;1856&quot; height=&quot;656&quot; src=&quot;https://img.ly/_astro/3_ZK0M1r.webp&quot; srcset=&quot;/_astro/3_Z2iStzt.webp 640w, /_astro/3_28R179.webp 750w, /_astro/3_ZFUGFx.webp 828w, /_astro/3_JLxGM.webp 1080w, /_astro/3_Z1AJW16.webp 1280w, /_astro/3_Z1DmExR.webp 1668w, /_astro/3_ZK0M1r.webp 1856w&quot;&gt;&lt;/p&gt;
&lt;p&gt;In our first act of refactoring, we introduce a trusty &lt;code&gt;HashMap&lt;/code&gt; to map each event type to its corresponding action. This heroic move eliminates the need for the convoluted &lt;code&gt;when&lt;/code&gt; statement, making our code more efficient. We also unveil a payload mechanism to convey essential data to the event handlers.&lt;/p&gt;
&lt;p&gt;Behold the refactored code:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;kotlin&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;abstract&lt;/span&gt;&lt;span&gt; class&lt;/span&gt;&lt;span&gt; EventsHandler&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Payloads&lt;/span&gt;&lt;span&gt;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    val&lt;/span&gt;&lt;span&gt; fillPayload: (&lt;/span&gt;&lt;span&gt;cache&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Payloads&lt;/span&gt;&lt;span&gt;) -&gt; &lt;/span&gt;&lt;span&gt;Unit&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    abstract&lt;/span&gt;&lt;span&gt; val&lt;/span&gt;&lt;span&gt; payloadCache: &lt;/span&gt;&lt;span&gt;Payloads&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    private&lt;/span&gt;&lt;span&gt; val&lt;/span&gt;&lt;span&gt; eventMap &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; mutableMapOf&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;KClass&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;out Event&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;, Payloads.(event: &lt;/span&gt;&lt;span&gt;Event&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-&gt;&lt;/span&gt;&lt;span&gt; Unit&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    fun&lt;/span&gt;&lt;span&gt; handleEvent&lt;/span&gt;&lt;span&gt;(event: &lt;/span&gt;&lt;span&gt;Event&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        eventMap[event::&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;]?.&lt;/span&gt;&lt;span&gt;let&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            it.&lt;/span&gt;&lt;span&gt;invoke&lt;/span&gt;&lt;span&gt;(payloadCache.&lt;/span&gt;&lt;span&gt;also&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;fillPayload&lt;/span&gt;&lt;span&gt;(it) }, event)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    operator&lt;/span&gt;&lt;span&gt; fun&lt;/span&gt;&lt;span&gt; &amp;#x3C;&lt;/span&gt;&lt;span&gt;EventType&lt;/span&gt;&lt;span&gt; : &lt;/span&gt;&lt;span&gt;Event&lt;/span&gt;&lt;span&gt;&gt; &lt;/span&gt;&lt;span&gt;set&lt;/span&gt;&lt;span&gt;(event: &lt;/span&gt;&lt;span&gt;KClass&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;out&lt;/span&gt;&lt;span&gt; EventType&lt;/span&gt;&lt;span&gt;&gt;, lambda: &lt;/span&gt;&lt;span&gt;Payloads&lt;/span&gt;&lt;span&gt;.(event: &lt;/span&gt;&lt;span&gt;EventType&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-&gt;&lt;/span&gt;&lt;span&gt; Unit) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        eventMap[event] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; lambda &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; Payloads.(event: &lt;/span&gt;&lt;span&gt;Event&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-&gt;&lt;/span&gt;&lt;span&gt; Unit&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; BlockEventsHandler&lt;/span&gt;&lt;span&gt;(fillPayload: (&lt;/span&gt;&lt;span&gt;cache&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;BlockEventsHandler&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Payloads&lt;/span&gt;&lt;span&gt;) -&gt; &lt;/span&gt;&lt;span&gt;Unit&lt;/span&gt;&lt;span&gt;) : &lt;/span&gt;&lt;span&gt;EventsHandler&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;BlockEventsHandler&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Payloads&lt;/span&gt;&lt;span&gt;&gt;(&lt;/span&gt;&lt;span&gt;fillPayload&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    class&lt;/span&gt;&lt;span&gt; Payloads&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        lateinit&lt;/span&gt;&lt;span&gt; var&lt;/span&gt;&lt;span&gt; engine: &lt;/span&gt;&lt;span&gt;Engine&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        lateinit&lt;/span&gt;&lt;span&gt; var&lt;/span&gt;&lt;span&gt; block: &lt;/span&gt;&lt;span&gt;DesignBlock&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        lateinit&lt;/span&gt;&lt;span&gt; var&lt;/span&gt;&lt;span&gt; fontFamilyMap: &lt;/span&gt;&lt;span&gt;Map&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;FontFamilyData&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    override&lt;/span&gt;&lt;span&gt; val&lt;/span&gt;&lt;span&gt; payloadCache: &lt;/span&gt;&lt;span&gt;Payloads&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; Payloads&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    init&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        it[BlockEvent.OnDelete::&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; { engine.&lt;/span&gt;&lt;span&gt;delete&lt;/span&gt;&lt;span&gt;(block) }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        it[BlockEvent.OnBackward::&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; { engine.&lt;/span&gt;&lt;span&gt;sendBackward&lt;/span&gt;&lt;span&gt;(block) }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        it[BlockEvent.OnDuplicate::&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; { engine.&lt;/span&gt;&lt;span&gt;duplicate&lt;/span&gt;&lt;span&gt;(block) }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        it[BlockEvent.OnForward::&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; { engine.&lt;/span&gt;&lt;span&gt;bringForward&lt;/span&gt;&lt;span&gt;(block) }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        it[BlockEvent.ToBack::&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; { engine.&lt;/span&gt;&lt;span&gt;sendToBack&lt;/span&gt;&lt;span&gt;(block) }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        it[BlockEvent.ToFront::&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; { engine.&lt;/span&gt;&lt;span&gt;bringToFront&lt;/span&gt;&lt;span&gt;(block) }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        it[BlockEvent.OnChangeFinish::&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; { engine.editor.&lt;/span&gt;&lt;span&gt;addUndoStep&lt;/span&gt;&lt;span&gt;() }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        it[BlockEvent.OnChangeBlendMode::&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;onChangeBlendMode&lt;/span&gt;&lt;span&gt;(engine, block, it.blendMode) }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        it[BlockEvent.OnChangeOpacity::&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; { engine.block.&lt;/span&gt;&lt;span&gt;setOpacity&lt;/span&gt;&lt;span&gt;(block, it.opacity) }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        it[BlockEvent.OnChangeFillColor::&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;onChangeFillColor&lt;/span&gt;&lt;span&gt;(engine, block, it.color) }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        // and so on...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; val&lt;/span&gt;&lt;span&gt; blockEventHandler &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; BlockEventsHandler&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    it.engine &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; engine&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    it.block &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; getBlockForEvents&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    it.fontFamilyMap &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; checkNotNull&lt;/span&gt;&lt;span&gt;(assetsRepo.fontFamilies.&lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;getOrThrow&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;open&lt;/span&gt;&lt;span&gt; fun&lt;/span&gt;&lt;span&gt; onEvent&lt;/span&gt;&lt;span&gt;(event: &lt;/span&gt;&lt;span&gt;Event&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    // ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    blockEventHandler.&lt;/span&gt;&lt;span&gt;handleEvent&lt;/span&gt;&lt;span&gt;(event)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;a-performance-boost&quot;&gt;A Performance Boost&lt;/h3&gt;
&lt;p&gt;By harnessing the power of a &lt;code&gt;HashMap&lt;/code&gt;, we’ve turbocharged our event handling. The time complexity for handling an event is now a lightning-fast (O(1)), a monumental improvement over the (O(n)) time complexity of the ponderous &lt;code&gt;when&lt;/code&gt; statement. While our payload mechanism adds a dollop of syntactic sugar. It enables us to bundle all the necessary data into a single object, making our code more legible and maintainable.&lt;/p&gt;
&lt;p&gt;? Note: Using a HashMap instead of a large when() statement provides a significant performance improvement. It can be up to 40 to 150 times faster. However, explaining the details would exceed the scope of this blog post. Therefore, I will cover it, along with other Kotlin performance puzzles, in a future blog post.&lt;/p&gt;
&lt;p&gt;While the refactored code remains as simple as before:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;kotlin&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;onEvent&lt;/span&gt;&lt;span&gt;(BlockEvent.&lt;/span&gt;&lt;span&gt;OnChangeFillColor&lt;/span&gt;&lt;span&gt;(Color.RED))&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This still triggers the &lt;code&gt;handleEvent&lt;/code&gt; method in &lt;code&gt;BlockEventsHandler&lt;/code&gt;, which in turn performs the appropriate action based on the event type. The &lt;code&gt;BlockEvent&lt;/code&gt; itself is a data object containing all event details, and it serves as the lambda parameter.&lt;/p&gt;
&lt;h3 id=&quot;a-note-on-payloads&quot;&gt;A Note on Payloads&lt;/h3&gt;
&lt;p&gt;The payload creation is a dynamic lambda function that’s executed each time an event is handled. This ensures that all variables not part of the event are consistently up-to-date. Given that we’re dealing with a single thread per event handler, caching the payload is entirely secure.&lt;/p&gt;
&lt;h2 id=&quot;step-3-adding-syntactic-sweetness-with-infix-functions&quot;&gt;Step 3: Adding Syntactic Sweetness with Infix Functions&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&quot;sven2244_an_abstract_composition_resembling_a_candy_store_fille_894e8c68-0a37-4ad0-adc8-c313db1c29da.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 1856px) 1856px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;1856&quot; height=&quot;656&quot; src=&quot;https://img.ly/_astro/4_1R9Sfj.webp&quot; srcset=&quot;/_astro/4_Z2nIGiP.webp 640w, /_astro/4_241NnM.webp 750w, /_astro/4_ZKKToT.webp 828w, /_astro/4_Z1HeTPo.webp 1080w, /_astro/4_11pIfE.webp 1280w, /_astro/4_XN0HS.webp 1668w, /_astro/4_1R9Sfj.webp 1856w&quot;&gt;&lt;/p&gt;
&lt;p&gt;In our next act, we elevate our syntax to a new level of expressiveness and readability. We introduce an infix function called &lt;code&gt;to&lt;/code&gt;, allowing us to map an event class to its corresponding action elegantly.&lt;/p&gt;
&lt;p&gt;Witness the updated code:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;kotlin&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;abstract&lt;/span&gt;&lt;span&gt; class&lt;/span&gt;&lt;span&gt; EventsHandler&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Payloads&lt;/span&gt;&lt;span&gt;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    val&lt;/span&gt;&lt;span&gt; fillPayload: (&lt;/span&gt;&lt;span&gt;cache&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Payloads&lt;/span&gt;&lt;span&gt;) -&gt; &lt;/span&gt;&lt;span&gt;Unit&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    infix&lt;/span&gt;&lt;span&gt; fun&lt;/span&gt;&lt;span&gt; &amp;#x3C;&lt;/span&gt;&lt;span&gt;Payloads&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;EventType&lt;/span&gt;&lt;span&gt; : &lt;/span&gt;&lt;span&gt;Event&lt;/span&gt;&lt;span&gt;&gt; &lt;/span&gt;&lt;span&gt;KClass&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;out EventType&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;to&lt;/span&gt;&lt;span&gt;(lambda: &lt;/span&gt;&lt;span&gt;Payloads&lt;/span&gt;&lt;span&gt;.(event: &lt;/span&gt;&lt;span&gt;EventType&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-&gt;&lt;/span&gt;&lt;span&gt; Unit) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        eventMap[event] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; lambda &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; Payloads.(event: &lt;/span&gt;&lt;span&gt;Event&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-&gt;&lt;/span&gt;&lt;span&gt; Unit&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    // ... (rest of the code remains the same)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; BlockEventsHandler&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    manager: &lt;/span&gt;&lt;span&gt;EventsManager&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    override&lt;/span&gt;&lt;span&gt; val&lt;/span&gt;&lt;span&gt; fillPayload: (&lt;/span&gt;&lt;span&gt;cache&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;TextBlockEventsHandler&lt;/span&gt;&lt;span&gt;) -&gt; &lt;/span&gt;&lt;span&gt;Unit&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;) : &lt;/span&gt;&lt;span&gt;EventsHandler&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;TextBlockEventsHandler&lt;/span&gt;&lt;span&gt;&gt;(&lt;/span&gt;&lt;span&gt;manager&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    lateinit&lt;/span&gt;&lt;span&gt; var&lt;/span&gt;&lt;span&gt; engine: &lt;/span&gt;&lt;span&gt;Engine&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    lateinit&lt;/span&gt;&lt;span&gt; var&lt;/span&gt;&lt;span&gt; block: &lt;/span&gt;&lt;span&gt;DesignBlock&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    lateinit&lt;/span&gt;&lt;span&gt; var&lt;/span&gt;&lt;span&gt; fontFamilyMap: &lt;/span&gt;&lt;span&gt;Map&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;FontFamilyData&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    init&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        BlockEvent.OnDelete::&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; to&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            engine.&lt;/span&gt;&lt;span&gt;delete&lt;/span&gt;&lt;span&gt;(block)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        BlockEvent.OnBackward::&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; to&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            engine.&lt;/span&gt;&lt;span&gt;sendBackward&lt;/span&gt;&lt;span&gt;(block)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        BlockEvent.OnDuplicate::&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; to&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            engine.&lt;/span&gt;&lt;span&gt;duplicate&lt;/span&gt;&lt;span&gt;(block)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        BlockEvent.OnForward::&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; to&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            engine.&lt;/span&gt;&lt;span&gt;bringForward&lt;/span&gt;&lt;span&gt;(block)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        BlockEvent.ToBack::&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; to&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            engine.&lt;/span&gt;&lt;span&gt;sendToBack&lt;/span&gt;&lt;span&gt;(block)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        BlockEvent.ToFront::&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; to&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            engine.&lt;/span&gt;&lt;span&gt;bringToFront&lt;/span&gt;&lt;span&gt;(block)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        BlockEvent.OnChangeFinish::&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; to&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            engine.editor.&lt;/span&gt;&lt;span&gt;addUndoStep&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        BlockEvent.OnChangeBlendMode::&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; to&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            onChangeBlendMode&lt;/span&gt;&lt;span&gt;(engine, block, it.blendMode)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        BlockEvent.OnChangeOpacity::&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; to&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            engine.block.&lt;/span&gt;&lt;span&gt;setOpacity&lt;/span&gt;&lt;span&gt;(block, it.opacity)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        BlockEvent.OnChangeFillColor::&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; to&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            onChangeFillColor&lt;/span&gt;&lt;span&gt;(engine, block, it.color)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        // ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;syntactic-sweetness-and-performance&quot;&gt;Syntactic Sweetness and Performance&lt;/h3&gt;
&lt;p&gt;The introduction of the &lt;code&gt;to&lt;/code&gt; infix function adds a sprinkle of syntactic sweetness that enhances code expressiveness and enables a more natural usage. This makes it crystal clear what each event is all about. And fear not, the performance remains at a blazing-fast (O(1)), thanks to our trusty HashMap.&lt;/p&gt;
&lt;h3 id=&quot;flexibility-in-syntax&quot;&gt;Flexibility in Syntax&lt;/h3&gt;
&lt;p&gt;While the &lt;code&gt;to&lt;/code&gt; keyword is used here, feel free to substitute it with other terms like &lt;code&gt;handle&lt;/code&gt;, &lt;code&gt;trigger&lt;/code&gt;, or anything that best suits your context. Flexibility is the name of the game.&lt;/p&gt;
&lt;h2 id=&quot;step-4-embracing-inline-functions-for-elegance&quot;&gt;Step 4: Embracing Inline Functions for Elegance&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&quot;sven2244_a_mesmerizing_image_of_a_kaleidoscope_with_vibrant_pat_b53a7e30-820a-4308-a7aa-11222be8a7a1.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 1856px) 1856px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;1856&quot; height=&quot;656&quot; src=&quot;https://img.ly/_astro/5_ZzQzhR.webp&quot; srcset=&quot;/_astro/5_Z2syT2c.webp 640w, /_astro/5_1YbAEq.webp 750w, /_astro/5_ZPB78g.webp 828w, /_astro/5_TUKqm.webp 1080w, /_astro/5_Z1qAJhw.webp 1280w, /_astro/5_Z1tdrOi.webp 1668w, /_astro/5_ZzQzhR.webp 1856w&quot;&gt;&lt;/p&gt;
&lt;p&gt;However, this is still not perfect because the &lt;code&gt;::class&lt;/code&gt; breaks smooth reading.&lt;/p&gt;
&lt;p&gt;So let’s do it differently. Let us try to introduce a more elegant way to register an event. Let us eliminate the need to specify &lt;code&gt;::class&lt;/code&gt; every time we register an event handler will make our code more concise and readable.&lt;/p&gt;
&lt;p&gt;This is made possible by an inline function with a verified type parameter that maintains the class reference at runtime.&lt;/p&gt;
&lt;p&gt;To do this, we extend the &lt;code&gt;EventsHandler&lt;/code&gt; class with this new &lt;code&gt;register&lt;/code&gt; function:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;kotlin&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; EventsHandler&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    register: &lt;/span&gt;&lt;span&gt;EventsHandler&lt;/span&gt;&lt;span&gt;.() &lt;/span&gt;&lt;span&gt;-&gt;&lt;/span&gt;&lt;span&gt; Unit,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    inline&lt;/span&gt;&lt;span&gt; fun&lt;/span&gt;&lt;span&gt; &amp;#x3C;&lt;/span&gt;&lt;span&gt;reified&lt;/span&gt;&lt;span&gt; EventType&lt;/span&gt;&lt;span&gt; : &lt;/span&gt;&lt;span&gt;BaseEvent&lt;/span&gt;&lt;span&gt;&gt; &lt;/span&gt;&lt;span&gt;register&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;noinline&lt;/span&gt;&lt;span&gt; lambda: (&lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;EventType&lt;/span&gt;&lt;span&gt;) -&gt; &lt;/span&gt;&lt;span&gt;Unit&lt;/span&gt;&lt;span&gt;) : &lt;/span&gt;&lt;span&gt;Any&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        this&lt;/span&gt;&lt;span&gt;[EventType::&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; lambda&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        return&lt;/span&gt;&lt;span&gt; lambda&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   // ... (rest of the code remains the same)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;the-new-syntax&quot;&gt;The New Syntax&lt;/h3&gt;
&lt;p&gt;This is what registering an event handler looks like with the new syntax:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;kotlin&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;register&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;BlockEvent&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;OnChangeLineWidth&lt;/span&gt;&lt;span&gt;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    engine.block.&lt;/span&gt;&lt;span&gt;setWidth&lt;/span&gt;&lt;span&gt;(block, engine.block.&lt;/span&gt;&lt;span&gt;getFrameWidth&lt;/span&gt;&lt;span&gt;(block))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    engine.block.&lt;/span&gt;&lt;span&gt;setHeight&lt;/span&gt;&lt;span&gt;(block, it.width)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Much better, right? The new syntax is more concise, eliminates redundancy, and is type-safe because the reified type parameters ensure that the event type is known at compile-time and runtime, eliminating the need for unsafe casting.&lt;/p&gt;
&lt;h2 id=&quot;step-5-elevating-register-to-an-extension-function-for-highlighting&quot;&gt;Step 5: Elevating &lt;code&gt;register&lt;/code&gt; to an Extension Function for Highlighting&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&quot;highlighting.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 2000px) 2000px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;2000&quot; height=&quot;700&quot; src=&quot;https://img.ly/_astro/6-1_ZpUYI8.webp&quot; srcset=&quot;/_astro/6-1_1WCnM8.webp 640w, /_astro/6-1_Z2lJRV7.webp 750w, /_astro/6-1_1HMAQd.webp 828w, /_astro/6-1_ZlU4Yo.webp 1080w, /_astro/6-1_Z2ruRRK.webp 1280w, /_astro/6-1_Z29YNlp.webp 1668w, /_astro/6-1_ZpUYI8.webp 2000w&quot;&gt;&lt;/p&gt;
&lt;p&gt;To improve code readability, we’ll make a subtle but effective step by converting the &lt;code&gt;register&lt;/code&gt; function from a &lt;code&gt;EventsHandler&lt;/code&gt; class function, into an &lt;code&gt;EventsHandler&lt;/code&gt; extension function.&lt;/p&gt;
&lt;p&gt;Sounds stupid! So why?&lt;/p&gt;
&lt;p&gt;This small change improves code readability by highlighting the &lt;code&gt;register&lt;/code&gt; keyword through syntax highlighting from a Kotlin extension function. This will make it much more colorful, which improves readability.&lt;/p&gt;
&lt;h3 id=&quot;updated-eventshandler-class&quot;&gt;Updated &lt;code&gt;EventsHandler&lt;/code&gt; Class&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;EventsHandler&lt;/code&gt; class remains largely unchanged, but the &lt;code&gt;register&lt;/code&gt; function is now outside the class and transformed into an extension function for the &lt;code&gt;EventsHandler&lt;/code&gt; class:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;kotlin&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; EventsHandler&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    register: &lt;/span&gt;&lt;span&gt;EventsHandler&lt;/span&gt;&lt;span&gt;.() &lt;/span&gt;&lt;span&gt;-&gt;&lt;/span&gt;&lt;span&gt; Unit,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    // ... (rest of the code remains the same)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;inline&lt;/span&gt;&lt;span&gt; fun&lt;/span&gt;&lt;span&gt; &amp;#x3C;&lt;/span&gt;&lt;span&gt;reified&lt;/span&gt;&lt;span&gt; EventType&lt;/span&gt;&lt;span&gt; : &lt;/span&gt;&lt;span&gt;BaseEvent&lt;/span&gt;&lt;span&gt;&gt; &lt;/span&gt;&lt;span&gt;EventsHandler&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;register&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;noinline&lt;/span&gt;&lt;span&gt; lambda: (&lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;EventType&lt;/span&gt;&lt;span&gt;) -&gt; &lt;/span&gt;&lt;span&gt;Unit&lt;/span&gt;&lt;span&gt;) : &lt;/span&gt;&lt;span&gt;Any&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    this&lt;/span&gt;&lt;span&gt;[EventType::&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; lambda&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    return&lt;/span&gt;&lt;span&gt; lambda&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;By simply shifting &lt;code&gt;register&lt;/code&gt; out of the class, the &lt;code&gt;EventsHandler&lt;/code&gt; class definition now stands out with distinctive syntax highlighting. It’s a clever trick that doesn’t impact runtime or compile performance, since it’s an inline operation anyway.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;kotlin&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;**&lt;/span&gt;&lt;span&gt;register&lt;/span&gt;&lt;span&gt;**&amp;#x3C;&lt;/span&gt;&lt;span&gt;BlockEvent.OnChangeLineWidth&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    engine.block.&lt;/span&gt;&lt;span&gt;setWidth&lt;/span&gt;&lt;span&gt;(block, engine.block.&lt;/span&gt;&lt;span&gt;getFrameWidth&lt;/span&gt;&lt;span&gt;(block))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    engine.block.&lt;/span&gt;&lt;span&gt;setHeight&lt;/span&gt;&lt;span&gt;(block, it.width)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;step-6-eliminating-lateinit-variables-with-delegated-properties&quot;&gt;Step 6: Eliminating &lt;code&gt;lateinit&lt;/code&gt; Variables with Delegated Properties&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&quot;sven2244_an_abstract_image_of_interconnected_gears_and_cogs_for_3b651ffc-9367-470d-8be3-82c3c19b9ffe.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 1856px) 1856px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;1856&quot; height=&quot;656&quot; src=&quot;https://img.ly/_astro/7_ZpHmyi.webp&quot; srcset=&quot;/_astro/7_2rVOk1.webp 640w, /_astro/7_1OvbcH.webp 750w, /_astro/7_Z10hwzY.webp 828w, /_astro/7_154X9V.webp 1080w, /_astro/7_Z1grwxW.webp 1280w, /_astro/7_Z1j4f5I.webp 1668w, /_astro/7_ZpHmyi.webp 1856w&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now, it’s time to address the enigmatic &lt;code&gt;lateinit&lt;/code&gt; variables and the somewhat convoluted &lt;code&gt;fillPayload&lt;/code&gt; mechanism. Let us introduce a cleaner approach, using delegated properties and lambda functions to inject dependencies.&lt;/p&gt;
&lt;p&gt;Let’s add an &lt;code&gt;Inject&lt;/code&gt; class to wrap a normal lambda as delegable:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;kotlin&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; Inject&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Type&lt;/span&gt;&lt;span&gt;&gt;(&lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; val&lt;/span&gt;&lt;span&gt; inject: () &lt;/span&gt;&lt;span&gt;-&gt;&lt;/span&gt;&lt;span&gt; Type) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    operator&lt;/span&gt;&lt;span&gt; fun&lt;/span&gt;&lt;span&gt; getValue&lt;/span&gt;&lt;span&gt;(thisRef: &lt;/span&gt;&lt;span&gt;Any&lt;/span&gt;&lt;span&gt;?, property: &lt;/span&gt;&lt;span&gt;KProperty&lt;/span&gt;&lt;span&gt;&amp;#x3C;*&gt;): &lt;/span&gt;&lt;span&gt;Type&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; inject&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With this newfound power, our event handler code becomes cleaner and more intuitive. It takes on the style of Jetpack Compose’s declarative syntax:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;kotlin&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;fun&lt;/span&gt;&lt;span&gt; EventsHandler&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;textBlockEvents&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    engine: () &lt;/span&gt;&lt;span&gt;-&gt;&lt;/span&gt;&lt;span&gt; Engine,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    block: () &lt;/span&gt;&lt;span&gt;-&gt;&lt;/span&gt;&lt;span&gt; DesignBlock,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    fontFamilyMap: () &lt;/span&gt;&lt;span&gt;-&gt;&lt;/span&gt;&lt;span&gt; Map&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;String, FontFamilyData&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    // Inject the dependencies&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    val&lt;/span&gt;&lt;span&gt; engine &lt;/span&gt;&lt;span&gt;by&lt;/span&gt;&lt;span&gt; Inject&lt;/span&gt;&lt;span&gt;(engine)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    val&lt;/span&gt;&lt;span&gt; block &lt;/span&gt;&lt;span&gt;by&lt;/span&gt;&lt;span&gt; Inject&lt;/span&gt;&lt;span&gt;(block)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    val&lt;/span&gt;&lt;span&gt; fontFamilyMap &lt;/span&gt;&lt;span&gt;by&lt;/span&gt;&lt;span&gt; Inject&lt;/span&gt;&lt;span&gt;(fontFamilyMap)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    // Event handling logic here&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    // ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Whenever one of the variables is accessed, the lambda is called, and you always get the current variable.&lt;/p&gt;
&lt;p&gt;Also, the creation of the “payload” becomes more straightforward, clean, and type-safe. It kinda looks like passing a variable:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;kotlin&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; val&lt;/span&gt;&lt;span&gt; eventHandler &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; EventsHandler&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    textBlockEvents&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        engine &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; ::&lt;/span&gt;&lt;span&gt;engine&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        block &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; ::&lt;/span&gt;&lt;span&gt;getBlockForEvents&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        fontFamilyMap &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;checkNotNull&lt;/span&gt;&lt;span&gt;(assetsRepo.fontFamilies.&lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;getOrThrow&lt;/span&gt;&lt;span&gt;() },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    )&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Looks and feels like magic! Pretty cool, right?&lt;/p&gt;
&lt;h2 id=&quot;step-7-multiple-event-handlers-for-single-responsibility-principle&quot;&gt;Step 7: Multiple Event Handlers for Single Responsibility Principle&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&quot;sven2244_code_as_a_magical_candy-filled_wonderland._Syntax_Suga_a50bcd92-bea2-4fea-aa92-e1cd557277b6.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 1856px) 1856px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;1856&quot; height=&quot;656&quot; src=&quot;https://img.ly/_astro/8_2csiHs.webp&quot; srcset=&quot;/_astro/8_2n6BAE.webp 640w, /_astro/8_1JEXtl.webp 750w, /_astro/8_Z157Jjl.webp 828w, /_astro/8_Z1mVunf.webp 1080w, /_astro/8_1lI8HN.webp 1280w, /_astro/8_1j6qb2.webp 1668w, /_astro/8_2csiHs.webp 1856w&quot;&gt;&lt;/p&gt;
&lt;p&gt;In our grand finale, we harness the newfound flexibility from our previous changes to register multiple event handler functions. Each event handler registration function now has a specific topic, aligning perfectly with the Single Responsibility Principle (SRP).&lt;/p&gt;
&lt;h3 id=&quot;enhanced-event-handler-registration&quot;&gt;Enhanced Event Handler Registration&lt;/h3&gt;
&lt;p&gt;We can now register multiple event handler functions within the same &lt;code&gt;EventsHandler&lt;/code&gt; instance. Each function can specialize in handling a particular type of event, making the code more modular and manageable. Behold the grand design:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;kotlin&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; val&lt;/span&gt;&lt;span&gt; eventHandler &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; EventsHandler&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    cropEvents&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        engine &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; ::&lt;/span&gt;&lt;span&gt;engine&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        block &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; ::&lt;/span&gt;&lt;span&gt;getBlockForEvents&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    )&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    blockEvents&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        engine &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; ::&lt;/span&gt;&lt;span&gt;engine&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        block &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; ::&lt;/span&gt;&lt;span&gt;getBlockForEvents&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    )&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    textBlockEvents&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        engine &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; ::&lt;/span&gt;&lt;span&gt;engine&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        block &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; ::&lt;/span&gt;&lt;span&gt;getBlockForEvents&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        fontFamilyMap &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;checkNotNull&lt;/span&gt;&lt;span&gt;(assetsRepo.fontFamilies.&lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;getOrThrow&lt;/span&gt;&lt;span&gt;() },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    )&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    // ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;fun&lt;/span&gt;&lt;span&gt; EventsHandler&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;blockEvents&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    engine: () &lt;/span&gt;&lt;span&gt;-&gt;&lt;/span&gt;&lt;span&gt; Engine,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    block: () &lt;/span&gt;&lt;span&gt;-&gt;&lt;/span&gt;&lt;span&gt; DesignBlock&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    val&lt;/span&gt;&lt;span&gt; engine: &lt;/span&gt;&lt;span&gt;Engine&lt;/span&gt;&lt;span&gt; by&lt;/span&gt;&lt;span&gt; Inject&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;engine&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    val&lt;/span&gt;&lt;span&gt; block: &lt;/span&gt;&lt;span&gt;DesignBlock&lt;/span&gt;&lt;span&gt; by&lt;/span&gt;&lt;span&gt; Inject&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;block&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    register&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;BlockEvent&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;OnDelete&lt;/span&gt;&lt;span&gt;&gt; { engine.&lt;/span&gt;&lt;span&gt;delete&lt;/span&gt;&lt;span&gt;(block) }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    register&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;BlockEvent&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;OnBackward&lt;/span&gt;&lt;span&gt;&gt; { engine.&lt;/span&gt;&lt;span&gt;sendBackward&lt;/span&gt;&lt;span&gt;(block) }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    register&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;BlockEvent&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;OnDuplicate&lt;/span&gt;&lt;span&gt;&gt; { engine.&lt;/span&gt;&lt;span&gt;duplicate&lt;/span&gt;&lt;span&gt;(block) }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    register&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;BlockEvent&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;OnForward&lt;/span&gt;&lt;span&gt;&gt; { engine.&lt;/span&gt;&lt;span&gt;bringForward&lt;/span&gt;&lt;span&gt;(block) }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    register&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;BlockEvent&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ToBack&lt;/span&gt;&lt;span&gt;&gt; { engine.&lt;/span&gt;&lt;span&gt;sendToBack&lt;/span&gt;&lt;span&gt;(block) }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    register&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;BlockEvent&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ToFront&lt;/span&gt;&lt;span&gt;&gt; { engine.&lt;/span&gt;&lt;span&gt;bringToFront&lt;/span&gt;&lt;span&gt;(block) }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    register&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;BlockEvent&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;OnChangeFinish&lt;/span&gt;&lt;span&gt;&gt; { engine.editor.&lt;/span&gt;&lt;span&gt;addUndoStep&lt;/span&gt;&lt;span&gt;() }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    register&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;BlockEvent&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;OnChangeBlendMode&lt;/span&gt;&lt;span&gt;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        if&lt;/span&gt;&lt;span&gt; (engine.block.&lt;/span&gt;&lt;span&gt;getBlendMode&lt;/span&gt;&lt;span&gt;(block) &lt;/span&gt;&lt;span&gt;!=&lt;/span&gt;&lt;span&gt; it.blendMode) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            engine.block.&lt;/span&gt;&lt;span&gt;setBlendMode&lt;/span&gt;&lt;span&gt;(block, it.blendMode)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            engine.editor.&lt;/span&gt;&lt;span&gt;addUndoStep&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    register&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;BlockEvent&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;OnChangeOpacity&lt;/span&gt;&lt;span&gt;&gt; { engine.block.&lt;/span&gt;&lt;span&gt;setOpacity&lt;/span&gt;&lt;span&gt;(block, it.opacity) }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;fun&lt;/span&gt;&lt;span&gt; EventsHandler&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;cropEvents&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    engine: () &lt;/span&gt;&lt;span&gt;-&gt;&lt;/span&gt;&lt;span&gt; Engine,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    block: () &lt;/span&gt;&lt;span&gt;-&gt;&lt;/span&gt;&lt;span&gt; DesignBlock&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    val&lt;/span&gt;&lt;span&gt; engine: &lt;/span&gt;&lt;span&gt;Engine&lt;/span&gt;&lt;span&gt; by&lt;/span&gt;&lt;span&gt; Inject&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;engine&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    val&lt;/span&gt;&lt;span&gt; block: &lt;/span&gt;&lt;span&gt;DesignBlock&lt;/span&gt;&lt;span&gt; by&lt;/span&gt;&lt;span&gt; Inject&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;block&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    // ... (event handling logic for cropping events)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;fun&lt;/span&gt;&lt;span&gt; EventsHandler&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;textBlockEvents&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    engine: () &lt;/span&gt;&lt;span&gt;-&gt;&lt;/span&gt;&lt;span&gt; Engine,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    block: () &lt;/span&gt;&lt;span&gt;-&gt;&lt;/span&gt;&lt;span&gt; DesignBlock,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    fontFamilyMap: () &lt;/span&gt;&lt;span&gt;-&gt;&lt;/span&gt;&lt;span&gt; Map&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;String, FontFamilyData&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    val&lt;/span&gt;&lt;span&gt; engine &lt;/span&gt;&lt;span&gt;by&lt;/span&gt;&lt;span&gt; Inject&lt;/span&gt;&lt;span&gt;(engine)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    val&lt;/span&gt;&lt;span&gt; block &lt;/span&gt;&lt;span&gt;by&lt;/span&gt;&lt;span&gt; Inject&lt;/span&gt;&lt;span&gt;(block)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    val&lt;/span&gt;&lt;span&gt; fontFamilyMap &lt;/span&gt;&lt;span&gt;by&lt;/span&gt;&lt;span&gt; Inject&lt;/span&gt;&lt;span&gt;(fontFamilyMap)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    // ... (event handling logic for text block events)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;While the triggering and its API remain unchanged, and no extra parameters need to be passed:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;kotlin&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;open&lt;/span&gt;&lt;span&gt; fun&lt;/span&gt;&lt;span&gt; onEvent&lt;/span&gt;&lt;span&gt;(event: &lt;/span&gt;&lt;span&gt;Event&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    eventHandler.&lt;/span&gt;&lt;span&gt;handleEvent&lt;/span&gt;&lt;span&gt;(event)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;final-words&quot;&gt;Final Words&lt;/h2&gt;
&lt;p&gt;As we conclude our journey through Kotlin code refactoring, we’ve unlocked the secrets to enhanced performance and style. By embracing techniques such as HashMaps, infix functions, and inline functions with reified type parameters, we’ve elevated our code to new heights. The benefits are clear: improved efficiency, readability, and adherence to the Single Responsibility Principle. Armed with these tools, you’re now ready to embark on your own coding adventures, transforming messy code into elegant masterpieces.&lt;/p&gt;
&lt;p&gt;If you’d like to try it out, I’ve created a working &lt;a href=&quot;https://pl.kotl.in/tEDorvc04&quot;&gt;example code on the Kotlin Playground&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Thank you for accompanying, and happy coding!&lt;/strong&gt; &lt;strong&gt;Never miss out on updates and &lt;a href=&quot;https://share.hsforms.com/1IgAOV1wASXGPnFG4ZPLejg1hk3i&quot;&gt;subscribe&lt;/a&gt; to our newsletter.&lt;/strong&gt;&lt;/p&gt;</content:encoded><dc:creator>Sven</dc:creator><media:content url="https://blog.img.ly/2023/09/hero_01.jpg" medium="image"/><category>How-To</category><category>Android</category><category>Android App Development</category><category>Kotlin</category><category>Insights</category></item></channel></rss>