|
@@ -1,7 +1,7 @@
|
|
<!DOCTYPE html>
|
|
<!DOCTYPE html>
|
|
<html lang="en-us">
|
|
<html lang="en-us">
|
|
|
|
|
|
-<head><script src="/livereload.js?mindelay=10&v=2&port=52246&path=livereload" data-no-instant defer></script>
|
|
|
|
|
|
+<head>
|
|
<title>
|
|
<title>
|
|
Posts | codeskraps
|
|
Posts | codeskraps
|
|
</title>
|
|
</title>
|
|
@@ -13,9 +13,9 @@ Posts | codeskraps
|
|
<meta name="generator" content="Hugo 0.134.3">
|
|
<meta name="generator" content="Hugo 0.134.3">
|
|
|
|
|
|
|
|
|
|
-<link rel="canonical" href="http://localhost:52246/posts/" >
|
|
|
|
- <link href="http://localhost:52246/posts/index.xml" rel="alternate" type="application/rss+xml" title="codeskraps" >
|
|
|
|
- <link href="http://localhost:52246/posts/index.xml" rel="feed" type="application/rss+xml" title="codeskraps" >
|
|
|
|
|
|
+<link rel="canonical" href="https://codeskraps.com/posts/" >
|
|
|
|
+ <link href="https://codeskraps.com/posts/index.xml" rel="alternate" type="application/rss+xml" title="codeskraps" >
|
|
|
|
+ <link href="https://codeskraps.com/posts/index.xml" rel="feed" type="application/rss+xml" title="codeskraps" >
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -33,7 +33,7 @@ Posts | codeskraps
|
|
<header class="headerWrapper">
|
|
<header class="headerWrapper">
|
|
<div class="header">
|
|
<div class="header">
|
|
<div>
|
|
<div>
|
|
- <a class="terminal" href="http://localhost:52246/">
|
|
|
|
|
|
+ <a class="terminal" href="https://codeskraps.com/">
|
|
<span>me@codeskraps.com ~ $</span>
|
|
<span>me@codeskraps.com ~ $</span>
|
|
</a>
|
|
</a>
|
|
</div>
|
|
</div>
|
|
@@ -43,17 +43,17 @@ Posts | codeskraps
|
|
<ul>
|
|
<ul>
|
|
|
|
|
|
<li>
|
|
<li>
|
|
- <a href="http://localhost:52246/projects/" title="" >
|
|
|
|
|
|
+ <a href="https://codeskraps.com/projects/" title="" >
|
|
~/projects</a>
|
|
~/projects</a>
|
|
</li>
|
|
</li>
|
|
|
|
|
|
<li>
|
|
<li>
|
|
- <a href="http://localhost:52246/about/" title="" >
|
|
|
|
|
|
+ <a href="https://codeskraps.com/about/" title="" >
|
|
~/about</a>
|
|
~/about</a>
|
|
</li>
|
|
</li>
|
|
|
|
|
|
<li>
|
|
<li>
|
|
- <a href="http://localhost:52246/posts/" title="" >
|
|
|
|
|
|
+ <a href="https://codeskraps.com/posts/" title="" >
|
|
~/posts</a>
|
|
~/posts</a>
|
|
</li>
|
|
</li>
|
|
|
|
|
|
@@ -76,110 +76,6 @@ Posts | codeskraps
|
|
|
|
|
|
<div>
|
|
<div>
|
|
|
|
|
|
-
|
|
|
|
- <a class="postListLink" href="http://localhost:52246/posts/mvi_architecture/">
|
|
|
|
-
|
|
|
|
- <div class="postListItem" role="listitem">
|
|
|
|
- <div class="postHeader">
|
|
|
|
- <span class="postTitle">MVI Architecture Helper</span>
|
|
|
|
-
|
|
|
|
- <time class="postDate" datetime="2024-09-27">September 27, 2024</time>
|
|
|
|
- </div>
|
|
|
|
- <div class="postExcerpt">
|
|
|
|
- <p><p>Something smart to talk about this helper class</p>
|
|
|
|
-<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><STATE> {
|
|
|
|
-</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">-></span> STATE)
|
|
|
|
-</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">-></span> Unit)
|
|
|
|
-</span></span><span style="display:flex;"><span>}
|
|
|
|
-</span></span><span style="display:flex;"><span>
|
|
|
|
-</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> <<span style="color:#66d9ef">reified</span> <span style="color:#a6e22e">TYPE</span> : <span style="color:#a6e22e">STATE</span>, <span style="color:#a6e22e">STATE</span>> <span style="color:#a6e22e">StateReceiver</span><STATE>.withType(<span style="color:#66d9ef">crossinline</span> block: <span style="color:#66d9ef">suspend</span> (TYPE) <span style="color:#f92672">-></span> Unit) {
|
|
|
|
-</span></span><span style="display:flex;"><span> withState { state <span style="color:#f92672">-></span>
|
|
|
|
-</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> (state <span style="color:#66d9ef">is</span> TYPE) {
|
|
|
|
-</span></span><span style="display:flex;"><span> block(state)
|
|
|
|
-</span></span><span style="display:flex;"><span> }
|
|
|
|
-</span></span><span style="display:flex;"><span> }
|
|
|
|
-</span></span><span style="display:flex;"><span>}
|
|
|
|
-</span></span><span style="display:flex;"><span>
|
|
|
|
-</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> <<span style="color:#66d9ef">reified</span> <span style="color:#a6e22e">TYPE</span> : <span style="color:#a6e22e">STATE</span>, <span style="color:#a6e22e">STATE</span>> <span style="color:#a6e22e">StateReceiver</span><STATE>.updateWithType(<span style="color:#66d9ef">crossinline</span> transform: <span style="color:#66d9ef">suspend</span> (TYPE) <span style="color:#f92672">-></span> TYPE) {
|
|
|
|
-</span></span><span style="display:flex;"><span> withType<TYPE, STATE> { state <span style="color:#f92672">-></span> updateState { transform(state) } }
|
|
|
|
-</span></span><span style="display:flex;"><span>}
|
|
|
|
-</span></span><span style="display:flex;"><span>
|
|
|
|
-</span></span><span style="display:flex;"><span><span style="color:#66d9ef">interface</span> <span style="color:#a6e22e">StateProvider</span><STATE> {
|
|
|
|
-</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">val</span> state: StateFlow<STATE>
|
|
|
|
-</span></span><span style="display:flex;"><span>}
|
|
|
|
-</span></span><span style="display:flex;"><span>
|
|
|
|
-</span></span><span style="display:flex;"><span><span style="color:#66d9ef">interface</span> <span style="color:#a6e22e">IntentReceiver</span><INTENT> {
|
|
|
|
-</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">fun</span> <span style="color:#a6e22e">handleIntent</span>(intent: INTENT)
|
|
|
|
-</span></span><span style="display:flex;"><span>}
|
|
|
|
-</span></span><span style="display:flex;"><span>
|
|
|
|
-</span></span><span style="display:flex;"><span><span style="color:#66d9ef">interface</span> <span style="color:#a6e22e">ActionProvider</span><ACTION> {
|
|
|
|
-</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">val</span> action: Flow<ACTION>
|
|
|
|
-</span></span><span style="display:flex;"><span>}
|
|
|
|
-</span></span><span style="display:flex;"><span>
|
|
|
|
-</span></span><span style="display:flex;"><span><span style="color:#66d9ef">interface</span> <span style="color:#a6e22e">ActionReceiver</span><ACTION> {
|
|
|
|
-</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">-></span> ACTION)
|
|
|
|
-</span></span><span style="display:flex;"><span>}
|
|
|
|
-</span></span><span style="display:flex;"><span>
|
|
|
|
-</span></span><span style="display:flex;"><span><span style="color:#66d9ef">interface</span> <span style="color:#a6e22e">StateModule</span><STATE> : StateReceiver<STATE>, StateProvider<STATE>
|
|
|
|
-</span></span><span style="display:flex;"><span><span style="color:#66d9ef">interface</span> <span style="color:#a6e22e">IntentModule</span><INTENT> : IntentReceiver<INTENT>
|
|
|
|
-</span></span><span style="display:flex;"><span><span style="color:#66d9ef">interface</span> <span style="color:#a6e22e">ActionModule</span><ACTION> : ActionReceiver<ACTION>, ActionProvider<ACTION>
|
|
|
|
-</span></span><span style="display:flex;"><span>
|
|
|
|
-</span></span><span style="display:flex;"><span><span style="color:#66d9ef">interface</span> <span style="color:#a6e22e">MVIViewModel</span><STATE, INTENT, ACTION> :
|
|
|
|
-</span></span><span style="display:flex;"><span> StateModule<STATE>,
|
|
|
|
-</span></span><span style="display:flex;"><span> IntentModule<INTENT>,
|
|
|
|
-</span></span><span style="display:flex;"><span> ActionModule<ACTION>
|
|
|
|
-</span></span><span style="display:flex;"><span>
|
|
|
|
-</span></span><span style="display:flex;"><span><span style="color:#66d9ef">class</span> <span style="color:#a6e22e">MVIViewModelDelegate</span><STATE, INTENT, ACTION>(
|
|
|
|
-</span></span><span style="display:flex;"><span> initial: STATE
|
|
|
|
-</span></span><span style="display:flex;"><span>) : MVIViewModel<STATE, INTENT, ACTION> {
|
|
|
|
-</span></span><span style="display:flex;"><span>
|
|
|
|
-</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">private</span> <span style="color:#66d9ef">val</span> _state = MutableStateFlow(initial)
|
|
|
|
-</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">override</span> <span style="color:#66d9ef">val</span> state: StateFlow<STATE> = _state.asStateFlow()
|
|
|
|
-</span></span><span style="display:flex;"><span>
|
|
|
|
-</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">private</span> <span style="color:#66d9ef">val</span> _action = Channel<ACTION>()
|
|
|
|
-</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">override</span> <span style="color:#66d9ef">val</span> action: Flow<ACTION> = _action.receiveAsFlow()
|
|
|
|
-</span></span><span style="display:flex;"><span>
|
|
|
|
-</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">-></span> STATE) {
|
|
|
|
-</span></span><span style="display:flex;"><span> _state.update { transform(<span style="color:#66d9ef">it</span>) }
|
|
|
|
-</span></span><span style="display:flex;"><span> }
|
|
|
|
-</span></span><span style="display:flex;"><span>
|
|
|
|
-</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">-></span> Unit) {
|
|
|
|
-</span></span><span style="display:flex;"><span> block(_state.<span style="color:#66d9ef">value</span>)
|
|
|
|
-</span></span><span style="display:flex;"><span> }
|
|
|
|
-</span></span><span style="display:flex;"><span>
|
|
|
|
-</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">-></span> ACTION) {
|
|
|
|
-</span></span><span style="display:flex;"><span> _action.trySend(block())
|
|
|
|
-</span></span><span style="display:flex;"><span> }
|
|
|
|
-</span></span><span style="display:flex;"><span>
|
|
|
|
-</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) {
|
|
|
|
-</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">throw</span> NotImplementedError()
|
|
|
|
-</span></span><span style="display:flex;"><span> }
|
|
|
|
-</span></span><span style="display:flex;"><span>}</span></span></code></pre></div></p>
|
|
|
|
- </div>
|
|
|
|
- </div>
|
|
|
|
- </a>
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- <a class="postListLink" href="http://localhost:52246/posts/my-first-post/">
|
|
|
|
-
|
|
|
|
- <div class="postListItem" role="listitem">
|
|
|
|
- <div class="postHeader">
|
|
|
|
- <span class="postTitle">My First Post</span>
|
|
|
|
-
|
|
|
|
- <time class="postDate" datetime="2024-09-27">September 27, 2024</time>
|
|
|
|
- </div>
|
|
|
|
- <div class="postExcerpt">
|
|
|
|
- <p><h2 id="introduction">Introduction</h2>
|
|
|
|
-<p>This is <strong>bold</strong> text, and this is <em>emphasized</em> text.</p>
|
|
|
|
-<p>Visit the <a href="https://gohugo.io">Hugo</a> website!</p></p>
|
|
|
|
- </div>
|
|
|
|
- </div>
|
|
|
|
- </a>
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|