Files
rapr-rs/docs/want/index.html
T
Uttarayan Mondal d5ecda4c73 Initial docs commit
2021-03-15 01:27:34 +05:30

82 lines
6.9 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="A Futures channel-like utility to signal when a value is wanted."><meta name="keywords" content="rust, rustlang, rust-lang, want"><title>want - Rust</title><link rel="stylesheet" type="text/css" href="../normalize.css"><link rel="stylesheet" type="text/css" href="../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" type="text/css" href="../light.css" id="themeStyle"><link rel="stylesheet" type="text/css" href="../dark.css" disabled ><link rel="stylesheet" type="text/css" href="../ayu.css" disabled ><script id="default-settings"></script><script src="../storage.js"></script><noscript><link rel="stylesheet" href="../noscript.css"></noscript><link rel="icon" type="image/svg+xml" href="../favicon.svg">
<link rel="alternate icon" type="image/png" href="../favicon-16x16.png">
<link rel="alternate icon" type="image/png" href="../favicon-32x32.png"><style type="text/css">#crate-search{background-image:url("../down-arrow.svg");}</style></head><body class="rustdoc mod"><!--[if lte IE 8]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="sidebar-menu">&#9776;</div><a href='../want/index.html'><div class='logo-container rust-logo'><img src='../rust-logo.png' alt='logo'></div></a><p class="location">Crate want</p><div class="block version"><p>Version 0.3.0</p></div><div class="sidebar-elems"><a id="all-types" href="all.html"><p>See all want's items</p></a><div class="block items"><ul><li><a href="#structs">Structs</a></li><li><a href="#functions">Functions</a></li></ul></div><p class="location"></p><div id="sidebar-vars" data-name="want" data-ty="mod" data-relpath="../"></div></div></nav><div class="theme-picker"><button id="theme-picker" aria-label="Pick another theme!" aria-haspopup="menu"><img src="../brush.svg" width="18" alt="Pick another theme!"></button><div id="theme-choices" role="menu"></div></div><script src="../theme.js"></script><nav class="sub"><form class="search-form"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press S to search, ? for more options…" type="search"></div><button type="button" class="help-button">?</button>
<a id="settings-menu" href="../settings.html"><img src="../wheel.svg" width="18" alt="Change settings"></a></div></form></nav><section id="main" class="content"><h1 class="fqn"><span class="in-band">Crate <a class="mod" href="">want</a></span><span class="out-of-band"><span id="render-detail"><a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">[<span class="inner">&#x2212;</span>]</a></span><a class="srclink" href="../src/want/lib.rs.html#1-585" title="goto source code">[src]</a></span></h1><div class="docblock"><p>A Futures channel-like utility to signal when a value is wanted.</p>
<p>Futures are supposed to be lazy, and only starting work if <code>Future::poll</code>
is called. The same is true of <code>Stream</code>s, but when using a channel as
a <code>Stream</code>, it can be hard to know if the receiver is ready for the next
value.</p>
<p>Put another way, given a <code>(tx, rx)</code> from <code>futures::sync::mpsc::channel()</code>,
how can the sender (<code>tx</code>) know when the receiver (<code>rx</code>) actually wants more
work to be produced? Just because there is room in the channel buffer
doesnt mean the work would be used by the receiver.</p>
<p>This is where something like <code>want</code> comes in. Added to a channel, you can
make sure that the <code>tx</code> only creates the message and sends it when the <code>rx</code>
has <code>poll()</code> for it, and the buffer was empty.</p>
<h1 id="example" class="section-header"><a href="#example">Example</a></h1>
<pre><code class="language-nightly"># //#![feature(async_await)]
extern crate want;
# fn spawn&lt;T&gt;(_t: T) {}
# fn we_still_want_message() -&gt; bool { true }
# fn mpsc_channel() -&gt; (Tx, Rx) { (Tx, Rx) }
# struct Tx;
# impl Tx { fn send&lt;T&gt;(&amp;mut self, _: T) {} }
# struct Rx;
# impl Rx { async fn recv(&amp;mut self) -&gt; Option&lt;Expensive&gt; { Some(Expensive) } }
// Some message that is expensive to produce.
struct Expensive;
// Some futures-aware MPSC channel...
let (mut tx, mut rx) = mpsc_channel();
// And our `want` channel!
let (mut gv, mut tk) = want::new();
// Our receiving task...
spawn(async move {
// Maybe something comes up that prevents us from ever
// using the expensive message.
//
// Without `want`, the &quot;send&quot; task may have started to
// produce the expensive message even though we wouldn't
// be able to use it.
if !we_still_want_message() {
return;
}
// But we can use it! So tell the `want` channel.
tk.want();
match rx.recv().await {
Some(_msg) =&gt; println!(&quot;got a message&quot;),
None =&gt; println!(&quot;DONE&quot;),
}
});
// Our sending task
spawn(async move {
// It's expensive to create a new message, so we wait until the
// receiving end truly *wants* the message.
if let Err(_closed) = gv.want().await {
// Looks like they will never want it...
return;
}
// They want it, let's go!
tx.send(Expensive);
});
# fn main() {}
</code></pre>
</div><h2 id="structs" class="section-header"><a href="#structs">Structs</a></h2>
<table><tr class="module-item"><td><a class="struct" href="struct.Closed.html" title="want::Closed struct">Closed</a></td><td class="docblock-short"><p>The <code>Taker</code> has canceled its interest in a value.</p>
</td></tr><tr class="module-item"><td><a class="struct" href="struct.Giver.html" title="want::Giver struct">Giver</a></td><td class="docblock-short"><p>An entity that gives a value when wanted.</p>
</td></tr><tr class="module-item"><td><a class="struct" href="struct.SharedGiver.html" title="want::SharedGiver struct">SharedGiver</a></td><td class="docblock-short"><p>A cloneable <code>Giver</code>.</p>
</td></tr><tr class="module-item"><td><a class="struct" href="struct.Taker.html" title="want::Taker struct">Taker</a></td><td class="docblock-short"><p>An entity that wants a value.</p>
</td></tr></table><h2 id="functions" class="section-header"><a href="#functions">Functions</a></h2>
<table><tr class="module-item"><td><a class="fn" href="fn.new.html" title="want::new fn">new</a></td><td class="docblock-short"><p>Create a new <code>want</code> channel.</p>
</td></tr></table></section><section id="search" class="content hidden"></section><section class="footer"></section><div id="rustdoc-vars" data-root-path="../" data-current-crate="want"></div>
<script src="../main.js"></script><script defer src="../search-index.js"></script></body></html>