<div dir="auto">Hi Jean-Sebastian</div><div dir="auto"><br></div><div dir="auto">I like it. Don’t you think the provided example (GitHub README.md) should be like this instead:</div><div dir="auto"><br></div><div dir="auto"><p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:"System Font""><span style="font-family:".SFUI-Regular"">%% This transaction checks the left quantity of wood and returns </span><span style="font-family:Menlo-Regular;font-size:13px">true</span><span style="font-family:".SFUI-Regular";font-size:13px"> or</span></p>
<p style="margin:0px;font-stretch:normal;font-size:13px;line-height:normal;font-family:"System Font""><span style="font-family:".SFUI-Regular"">%% </span><span style="font-family:Menlo-Regular">false</span><span style="font-family:".SFUI-Regular""> if we need to process a new order.</span></p>
<p style="margin:0px;font-stretch:normal;font-size:13px;line-height:normal;font-family:"System Font""><span style="font-family:".SFUI-Regular"">khepri:transaction(</span></p>
<p style="margin:0px;font-stretch:normal;font-size:13px;line-height:normal;font-family:"System Font""><span style="font-family:".SFUI-Regular"">    fun() -></span></p>
<p style="margin:0px;font-stretch:normal;font-size:13px;line-height:normal;font-family:"System Font""><span style="font-family:".SFUI-Regular"">        case khepri_tx:get([stock, wood]) of</span></p>
<p style="margin:0px;font-stretch:normal;font-size:13px;line-height:normal;font-family:"System Font""><span style="font-family:".SFUI-Regular"">            {ok, #{[stock, wood] := #{data := Quantity}}}</span></p>
<p style="margin:0px;font-stretch:normal;font-size:13px;line-height:normal;font-family:"System Font""><span style="font-family:".SFUI-Regular"">              when Quantity < 100 -></span></p>
<p style="margin:0px;font-stretch:normal;font-size:13px;line-height:normal;font-family:"System Font""><span style="font-family:".SFUI-Regular"">                %% There is less than 100 pieces of wood, or there is none</span></p>
<p style="margin:0px;font-stretch:normal;font-size:13px;line-height:normal;font-family:"System Font""><span style="font-family:".SFUI-Regular"">                %% at all (the node does not exist in Khepri). We need to</span></p>
<p style="margin:0px;font-stretch:normal;font-size:13px;line-height:normal;font-family:"System Font""><span style="font-family:".SFUI-Regular"">                %% request a new order.</span></p>
<p style="margin:0px;font-stretch:normal;font-size:13px;line-height:normal;font-family:"System Font""><span style="font-family:".SFUI-Regular"">                {ok, _} = khepri_tx:put([order, wood], ?DATA_PAYLOAD(1000)),</span></p>
<p style="margin:0px;font-stretch:normal;font-size:13px;line-height:normal;font-family:"System Font""><span style="font-family:".SFUI-Regular"">                false;</span></p>
<p style="margin:0px;font-stretch:normal;font-size:13px;line-height:normal;font-family:"System Font""><span style="font-family:".SFUI-Regular"">            _ -></span></p>
<p style="margin:0px;font-stretch:normal;font-size:13px;line-height:normal;font-family:"System Font""><span style="font-family:".SFUI-Regular"">                 %% There is enough wood left.</span></p>
<p style="margin:0px;font-stretch:normal;font-size:13px;line-height:normal;font-family:"System Font""><span style="font-family:".SFUI-Regular"">                true</span></p>
<p style="margin:0px;font-stretch:normal;font-size:13px;line-height:normal;font-family:"System Font""><span style="font-family:".SFUI-Regular"">        end</span></p>
<p style="margin:0px;font-stretch:normal;font-size:13px;line-height:normal;font-family:"System Font"" dir="auto"><span style="font-family:".SFUI-Regular"">    end).</span></p></div><div dir="auto"><br></div><div dir="auto">Best</div><div dir="auto">/F.</div><div dir="auto"><br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;padding-left:1ex;border-left-color:rgb(204,204,204)"><br>Hi!<br>
<br>
On behalf of the RabbitMQ team, I'm proud to announce the Khepri <br>
database library (<a href="https://github.com/rabbitmq/khepri" rel="noreferrer" target="_blank">https://github.com/rabbitmq/khepri</a>)!<br>
<br>
Release 0.1.0 is available on;<br>
     * GitHub (<a href="https://github.com/rabbitmq/khepri/releases/tag/v0.1.0" rel="noreferrer" target="_blank">https://github.com/rabbitmq/khepri/releases/tag/v0.1.0</a>)<br>
     * Hex.pm (<a href="https://hex.pm/packages/khepri" rel="noreferrer" target="_blank">https://hex.pm/packages/khepri</a>)<br>
<br>
Khepri is a tree-like replicated on-disk database library for Erlang and <br>
Elixir. This is a library we plan to use inside RabbitMQ as a <br>
replacement for Mnesia. Indeed, we want to leverage Ra[1], our <br>
implementation of the Raft consensus algorithm, to have a uniform <br>
behavior, especially w.r.t. network partitions, across all types of data <br>
managed by RabbitMQ.<br>
<br>
In Khepri, data are organized as nodes in a tree. All tree nodes may <br>
contain data, not only the leaves. Here is a quick example:<br>
<br>
     %% Store "150" under /stock/wood/oak.<br>
     khepri:insert([stock, wood, oak], 150),<br>
<br>
     %% The tree now looks like:<br>
     %% .<br>
     %% `-- stock<br>
     %%     `-- wood<br>
     %%         `-- oak = 150<br>
<br>
     %% Get what is stored under /stock/wood/oak.<br>
     Ret = khepri:get([stock, wood, oak]),<br>
     {ok, #{[stock, wood, oak] := #{data := Units}}} = Ret,<br>
<br>
     %% Check /stock/wood/oak exists.<br>
     true = khepri:exists([stock, wood, oak]),<br>
<br>
     %% Delete /stock/wood/oak.<br>
     khepri:delete([stock, wood, oak]).<br>
<br>
Most of the concepts and a part of the API are described in the <br>
documentation (<a href="https://rabbitmq.github.io/khepri/" rel="noreferrer" target="_blank">https://rabbitmq.github.io/khepri/</a>). Note that the <br>
documentation is also far from complete.<br>
<br>
The implementation is very alpha at this stage. The internal design <br>
should not change drastically now but the API and ABI might.<br>
<br>
I would love Khepri to be as easy to use and intuitive as possible. <br>
That's why I'm reaching out to the community! If anyone is interested, <br>
could you please take a look at the documentation and/or the code and <br>
share your comments?<br>
<br>
Thank you very much!<br>
<br>
[1] <a href="https://github.com/rabbitmq/ra" rel="noreferrer" target="_blank">https://github.com/rabbitmq/ra</a><br>
<br>
-- <br>
Jean-Sébastien Pédron<br>
</blockquote></div></div>