index.html 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. <!DOCTYPE html>
  2. <html lang="en-us">
  3. <head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=49905&amp;path=livereload" data-no-instant defer></script>
  4. <title>
  5. Posts | codeskraps
  6. </title>
  7. <meta http-equiv="content-type" content="text/html; charset=utf-8">
  8. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  9. <meta name="description" content="Your website description">
  10. <meta name="generator" content="Hugo 0.134.3">
  11. <link rel="canonical" href="http://localhost:49905/posts/" >
  12. <link href="http://localhost:49905/posts/index.xml" rel="alternate" type="application/rss+xml" title="codeskraps" >
  13. <link href="http://localhost:49905/posts/index.xml" rel="feed" type="application/rss+xml" title="codeskraps" >
  14. <link href="/css/style.min.38d8ec3c7cca8185fe94ab7dc7ca79d69e14b78ca3c077807b2c32725df95c62.css" rel="stylesheet">
  15. </head>
  16. <body>
  17. <div class="flexWrapper">
  18. <header class="headerWrapper">
  19. <div class="header">
  20. <div>
  21. <a class="terminal" href="http://localhost:49905/">
  22. <span>me@codeskraps.com ~ $</span>
  23. </a>
  24. </div>
  25. <input class="side-menu" type="checkbox" id="side-menu">
  26. <label class="hamb" for="side-menu"><span class="hamb-line"></span></label>
  27. <nav class="headerLinks">
  28. <ul>
  29. <li>
  30. <a href="http://localhost:49905/projects/" title="" >
  31. ~/projects</a>
  32. </li>
  33. <li>
  34. <a href="http://localhost:49905/about/" title="" >
  35. ~/about</a>
  36. </li>
  37. <li>
  38. <a href="http://localhost:49905/posts/" title="" >
  39. ~/posts</a>
  40. </li>
  41. </ul>
  42. </nav>
  43. </div>
  44. </header>
  45. <div class="content">
  46. <main class="main">
  47. <div>
  48. <div class="listHeader">
  49. <h1>Posts</h1>
  50. </div>
  51. <div>
  52. <a class="postListLink" href="http://localhost:49905/posts/mvi_architecture/">
  53. <div class="postListItem" role="listitem">
  54. <div class="postHeader">
  55. <span class="postTitle">MVI Architecture Helper</span>
  56. <time class="postDate" datetime="2024-09-27">September 27, 2024</time>
  57. </div>
  58. <div class="postExcerpt">
  59. <p><p>Something smart to talk about this helper class</p>
  60. <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-kotlin" data-lang="kotlin"><span style="display:flex;"><span><span style="color:#66d9ef">interface</span> <span style="color:#a6e22e">StateReceiver</span>&lt;STATE&gt; {
  61. </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">suspend</span> <span style="color:#66d9ef">fun</span> <span style="color:#a6e22e">updateState</span>(transform: <span style="color:#66d9ef">suspend</span> (STATE) <span style="color:#f92672">-&gt;</span> STATE)
  62. </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">suspend</span> <span style="color:#66d9ef">fun</span> <span style="color:#a6e22e">withState</span>(block: <span style="color:#66d9ef">suspend</span> (STATE) <span style="color:#f92672">-&gt;</span> Unit)
  63. </span></span><span style="display:flex;"><span>}
  64. </span></span><span style="display:flex;"><span>
  65. </span></span><span style="display:flex;"><span><span style="color:#66d9ef">suspend</span> <span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">fun</span> &lt;<span style="color:#66d9ef">reified</span> <span style="color:#a6e22e">TYPE</span> : <span style="color:#a6e22e">STATE</span>, <span style="color:#a6e22e">STATE</span>&gt; <span style="color:#a6e22e">StateReceiver</span>&lt;STATE&gt;.withType(<span style="color:#66d9ef">crossinline</span> block: <span style="color:#66d9ef">suspend</span> (TYPE) <span style="color:#f92672">-&gt;</span> Unit) {
  66. </span></span><span style="display:flex;"><span> withState { state <span style="color:#f92672">-&gt;</span>
  67. </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> (state <span style="color:#66d9ef">is</span> TYPE) {
  68. </span></span><span style="display:flex;"><span> block(state)
  69. </span></span><span style="display:flex;"><span> }
  70. </span></span><span style="display:flex;"><span> }
  71. </span></span><span style="display:flex;"><span>}
  72. </span></span><span style="display:flex;"><span>
  73. </span></span><span style="display:flex;"><span><span style="color:#66d9ef">suspend</span> <span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">fun</span> &lt;<span style="color:#66d9ef">reified</span> <span style="color:#a6e22e">TYPE</span> : <span style="color:#a6e22e">STATE</span>, <span style="color:#a6e22e">STATE</span>&gt; <span style="color:#a6e22e">StateReceiver</span>&lt;STATE&gt;.updateWithType(<span style="color:#66d9ef">crossinline</span> transform: <span style="color:#66d9ef">suspend</span> (TYPE) <span style="color:#f92672">-&gt;</span> TYPE) {
  74. </span></span><span style="display:flex;"><span> withType&lt;TYPE, STATE&gt; { state <span style="color:#f92672">-&gt;</span> updateState { transform(state) } }
  75. </span></span><span style="display:flex;"><span>}
  76. </span></span><span style="display:flex;"><span>
  77. </span></span><span style="display:flex;"><span><span style="color:#66d9ef">interface</span> <span style="color:#a6e22e">StateProvider</span>&lt;STATE&gt; {
  78. </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">val</span> state: StateFlow&lt;STATE&gt;
  79. </span></span><span style="display:flex;"><span>}
  80. </span></span><span style="display:flex;"><span>
  81. </span></span><span style="display:flex;"><span><span style="color:#66d9ef">interface</span> <span style="color:#a6e22e">IntentReceiver</span>&lt;INTENT&gt; {
  82. </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">fun</span> <span style="color:#a6e22e">handleIntent</span>(intent: INTENT)
  83. </span></span><span style="display:flex;"><span>}
  84. </span></span><span style="display:flex;"><span>
  85. </span></span><span style="display:flex;"><span><span style="color:#66d9ef">interface</span> <span style="color:#a6e22e">ActionProvider</span>&lt;ACTION&gt; {
  86. </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">val</span> action: Flow&lt;ACTION&gt;
  87. </span></span><span style="display:flex;"><span>}
  88. </span></span><span style="display:flex;"><span>
  89. </span></span><span style="display:flex;"><span><span style="color:#66d9ef">interface</span> <span style="color:#a6e22e">ActionReceiver</span>&lt;ACTION&gt; {
  90. </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">suspend</span> <span style="color:#66d9ef">fun</span> <span style="color:#a6e22e">sendAction</span>(block: <span style="color:#66d9ef">suspend</span> () <span style="color:#f92672">-&gt;</span> ACTION)
  91. </span></span><span style="display:flex;"><span>}
  92. </span></span><span style="display:flex;"><span>
  93. </span></span><span style="display:flex;"><span><span style="color:#66d9ef">interface</span> <span style="color:#a6e22e">StateModule</span>&lt;STATE&gt; : StateReceiver&lt;STATE&gt;, StateProvider&lt;STATE&gt;
  94. </span></span><span style="display:flex;"><span><span style="color:#66d9ef">interface</span> <span style="color:#a6e22e">IntentModule</span>&lt;INTENT&gt; : IntentReceiver&lt;INTENT&gt;
  95. </span></span><span style="display:flex;"><span><span style="color:#66d9ef">interface</span> <span style="color:#a6e22e">ActionModule</span>&lt;ACTION&gt; : ActionReceiver&lt;ACTION&gt;, ActionProvider&lt;ACTION&gt;
  96. </span></span><span style="display:flex;"><span>
  97. </span></span><span style="display:flex;"><span><span style="color:#66d9ef">interface</span> <span style="color:#a6e22e">MVIViewModel</span>&lt;STATE, INTENT, ACTION&gt; :
  98. </span></span><span style="display:flex;"><span> StateModule&lt;STATE&gt;,
  99. </span></span><span style="display:flex;"><span> IntentModule&lt;INTENT&gt;,
  100. </span></span><span style="display:flex;"><span> ActionModule&lt;ACTION&gt;
  101. </span></span><span style="display:flex;"><span>
  102. </span></span><span style="display:flex;"><span><span style="color:#66d9ef">class</span> <span style="color:#a6e22e">MVIViewModelDelegate</span>&lt;STATE, INTENT, ACTION&gt;(
  103. </span></span><span style="display:flex;"><span> initial: STATE
  104. </span></span><span style="display:flex;"><span>) : MVIViewModel&lt;STATE, INTENT, ACTION&gt; {
  105. </span></span><span style="display:flex;"><span>
  106. </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">private</span> <span style="color:#66d9ef">val</span> _state = MutableStateFlow(initial)
  107. </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">override</span> <span style="color:#66d9ef">val</span> state: StateFlow&lt;STATE&gt; = _state.asStateFlow()
  108. </span></span><span style="display:flex;"><span>
  109. </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">private</span> <span style="color:#66d9ef">val</span> _action = Channel&lt;ACTION&gt;()
  110. </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">override</span> <span style="color:#66d9ef">val</span> action: Flow&lt;ACTION&gt; = _action.receiveAsFlow()
  111. </span></span><span style="display:flex;"><span>
  112. </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">override</span> <span style="color:#66d9ef">suspend</span> <span style="color:#66d9ef">fun</span> <span style="color:#a6e22e">updateState</span>(transform: <span style="color:#66d9ef">suspend</span> (STATE) <span style="color:#f92672">-&gt;</span> STATE) {
  113. </span></span><span style="display:flex;"><span> _state.update { transform(<span style="color:#66d9ef">it</span>) }
  114. </span></span><span style="display:flex;"><span> }
  115. </span></span><span style="display:flex;"><span>
  116. </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">override</span> <span style="color:#66d9ef">suspend</span> <span style="color:#66d9ef">fun</span> <span style="color:#a6e22e">withState</span>(block: <span style="color:#66d9ef">suspend</span> (STATE) <span style="color:#f92672">-&gt;</span> Unit) {
  117. </span></span><span style="display:flex;"><span> block(_state.<span style="color:#66d9ef">value</span>)
  118. </span></span><span style="display:flex;"><span> }
  119. </span></span><span style="display:flex;"><span>
  120. </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">override</span> <span style="color:#66d9ef">suspend</span> <span style="color:#66d9ef">fun</span> <span style="color:#a6e22e">sendAction</span>(block: <span style="color:#66d9ef">suspend</span> () <span style="color:#f92672">-&gt;</span> ACTION) {
  121. </span></span><span style="display:flex;"><span> _action.trySend(block())
  122. </span></span><span style="display:flex;"><span> }
  123. </span></span><span style="display:flex;"><span>
  124. </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">override</span> <span style="color:#66d9ef">fun</span> <span style="color:#a6e22e">handleIntent</span>(intent: INTENT) {
  125. </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">throw</span> NotImplementedError()
  126. </span></span><span style="display:flex;"><span> }
  127. </span></span><span style="display:flex;"><span>}</span></span></code></pre></div></p>
  128. </div>
  129. </div>
  130. </a>
  131. <a class="postListLink" href="http://localhost:49905/posts/my-first-post/">
  132. <div class="postListItem" role="listitem">
  133. <div class="postHeader">
  134. <span class="postTitle">My First Post</span>
  135. <time class="postDate" datetime="2024-09-27">September 27, 2024</time>
  136. </div>
  137. <div class="postExcerpt">
  138. <p><h2 id="introduction">Introduction</h2>
  139. <p>This is <strong>bold</strong> text, and this is <em>emphasized</em> text.</p>
  140. <p>Visit the <a href="https://gohugo.io">Hugo</a> website!</p></p>
  141. </div>
  142. </div>
  143. </a>
  144. </div>
  145. </div>
  146. </main>
  147. </div>
  148. <footer class="footer">
  149. <span>CC-0, Built with <a href="https://gohugo.io" class="footerLink">Hugo</a> and <a href="https://github.com/LordMathis/hugo-theme-nightfall" class="footerLink">Nightfall</a> theme</span>
  150. </footer>
  151. </div>
  152. </body>
  153. </html>