<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Core Model on FsFlow</title>
    <link>https://adz.github.io/FsFlow/docs/core-model/</link>
    <description>Recent content in Core Model on FsFlow</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <atom:link href="https://adz.github.io/FsFlow/docs/core-model/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Execution Semantics</title>
      <link>https://adz.github.io/FsFlow/docs/core-model/semantics/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://adz.github.io/FsFlow/docs/core-model/semantics/</guid>
      <description>&lt;h1 id=&#34;execution-semantics&#34;&gt;Execution Semantics&lt;/h1&gt;&#xA;&lt;p&gt;This page shows the exact execution rules for &lt;code&gt;Flow&lt;/code&gt;, including how a cold program becomes an &lt;code&gt;Effect&lt;/code&gt; and resolves to an &lt;code&gt;Exit&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;FsFlow uses a unified &lt;strong&gt;&lt;code&gt;Flow&amp;lt;&#39;env, &#39;error, &#39;value&amp;gt;&lt;/code&gt;&lt;/strong&gt; model that handles synchronous code, F# &lt;code&gt;Async&lt;/code&gt;, and .NET &lt;code&gt;Task&lt;/code&gt; interop natively.&lt;/p&gt;&#xA;&lt;h2 id=&#34;execution-shape&#34;&gt;Execution Shape&lt;/h2&gt;&#xA;&lt;p&gt;Conceptually, execution is:&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;Flow -&amp;gt; Effect -&amp;gt; Exit&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;More precisely:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;Flow&lt;/code&gt; is the cold program you define.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Effect&lt;/code&gt; is the deferred runnable carrier.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Exit&lt;/code&gt; is the terminal outcome after execution.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;success-and-typed-failure&#34;&gt;Success and Typed Failure&lt;/h2&gt;&#xA;&lt;p&gt;Every Flow execution results in an &lt;strong&gt;&lt;code&gt;Exit&amp;lt;&#39;value, &#39;error&amp;gt;&lt;/code&gt;&lt;/strong&gt;:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Task and Async Interop</title>
      <link>https://adz.github.io/FsFlow/docs/core-model/task-async-interop/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://adz.github.io/FsFlow/docs/core-model/task-async-interop/</guid>
      <description>&lt;h1 id=&#34;task-and-async-interop&#34;&gt;Task and Async Interop&lt;/h1&gt;&#xA;&lt;p&gt;FsFlow provides a single, unified computation expression—&lt;strong&gt;&lt;code&gt;flow {}&lt;/code&gt;&lt;/strong&gt;—that handles synchronous code, F# &lt;code&gt;Async&lt;/code&gt;, and .NET &lt;code&gt;Task&lt;/code&gt; interop natively. You don&amp;rsquo;t have to choose between different builders; the same flow can orchestrate all these effect types.&lt;/p&gt;&#xA;&lt;h2 id=&#34;direct-binds&#34;&gt;Direct Binds&lt;/h2&gt;&#xA;&lt;p&gt;Inside a &lt;code&gt;flow {}&lt;/code&gt; block, you can use &lt;code&gt;let!&lt;/code&gt; to bind many common F# and .NET types directly. FsFlow handles the conversion to its internal execution model automatically.&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Type&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Outcome&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;Flow&amp;lt;&#39;env, &#39;error, &#39;value&amp;gt;&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Continues with the flow&amp;rsquo;s value.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;Result&amp;lt;&#39;value, &#39;error&amp;gt;&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Continues on &lt;code&gt;Ok&lt;/code&gt;, short-circuits on &lt;code&gt;Error&lt;/code&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;Async&amp;lt;&#39;value&amp;gt;&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Awaits the async and continues with the value.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;Async&amp;lt;Result&amp;lt;&#39;value, &#39;error&amp;gt;&amp;gt;&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Awaits the async and handles the Result outcome.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;Task&amp;lt;&#39;value&amp;gt;&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Awaits the task and continues with the value.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;Task&amp;lt;Result&amp;lt;&#39;value, &#39;error&amp;gt;&amp;gt;&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Awaits the task and handles the Result outcome.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;ValueTask&amp;lt;&#39;value&amp;gt;&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Awaits the value task and continues with the value.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;ValueTask&amp;lt;Result&amp;lt;&#39;value, &#39;error&amp;gt;&amp;gt;&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Awaits and handles the Result outcome.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h3 id=&#34;example-mixed-orchestration&#34;&gt;Example: Mixed Orchestration&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-fsharp&#34; data-lang=&#34;fsharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;fetchUser&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;int&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Task&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;User&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;validate&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;user&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;User&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Result&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;User&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;string&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;saveUser&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;user&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;User&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Async&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;unit&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;processUser&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;id&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;flow&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// Bind a .NET Task&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;let!&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;user&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;fetchUser&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;id&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// Bind a Result&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;let!&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;validUser&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;validate&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;user&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// Bind an F# Async&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;do&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;!&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;saveUser&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;validUser&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Done&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;option-and-valueoption&#34;&gt;Option and ValueOption&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;Option&amp;lt;&#39;value&amp;gt;&lt;/code&gt; and &lt;code&gt;ValueOption&amp;lt;&#39;value&amp;gt;&lt;/code&gt; can also be bound directly, but only if the flow&amp;rsquo;s error type is &lt;code&gt;unit&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Architectural Styles</title>
      <link>https://adz.github.io/FsFlow/docs/core-model/architectural-styles/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://adz.github.io/FsFlow/docs/core-model/architectural-styles/</guid>
      <description>&lt;h1 id=&#34;architectural-styles&#34;&gt;Architectural Styles&lt;/h1&gt;&#xA;&lt;p&gt;This page shows how the FsFlow workflow family should fit into your application architecture without forcing one app shape on every codebase.&lt;/p&gt;&#xA;&lt;p&gt;FsFlow supports three valid architectural styles.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Three related workflow families. Three valid architectural styles. Choose based on app shape and team preferences.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h2 id=&#34;1-booted-app-environment&#34;&gt;1. Booted App Environment&lt;/h2&gt;&#xA;&lt;p&gt;Use this when your application already has a conventional booted runtime and passing one explicit application environment keeps composition simple.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
