maplibre-rs/docs/api/src/maplibre/schedule.rs.html

631 lines
30 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="Source of the Rust file `maplibre/src/schedule.rs`."><title>schedule.rs - source</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/FiraSans-Regular-018c141bf0843ffd.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/FiraSans-Medium-8f9a781e4970d388.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceCodePro-Regular-562dcc5011b6de7d.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceSerif4-Bold-a2c9cd1067f8b328.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceCodePro-Semibold-d899c5a5c4aeb14a.ttf.woff2"><link rel="stylesheet" href="../../static.files/normalize-76eba96aa4d2e634.css"><link rel="stylesheet" href="../../static.files/rustdoc-9bb858ba049f1f21.css" id="mainThemeStyle"><meta name="rustdoc-vars" data-root-path="../../" data-static-root-path="../../static.files/" data-current-crate="maplibre" data-themes="" data-resource-suffix="" data-rustdoc-version="1.72.1 (d5c2e9c34 2023-09-13)" data-channel="1.72.1" data-search-js="search-f6292fe389d70017.js" data-settings-js="settings-de11bff964e9d4e5.js" data-settings-css="settings-8c76f75bfb6bd192.css" data-theme-light-css="light-0f8c037637f9eb3e.css" data-theme-dark-css="dark-1097f8e92a01e3cf.css" data-theme-ayu-css="ayu-614652228113ac93.css" ><script src="../../static.files/storage-59fd9b8ccb335783.js"></script><script defer src="../../static.files/source-script-106908c7a7964ba4.js"></script><script defer src="../../source-files.js"></script><script defer src="../../static.files/main-0795b7d26be81095.js"></script><noscript><link rel="stylesheet" media="(prefers-color-scheme:light)" href="../../static.files/light-0f8c037637f9eb3e.css"><link rel="stylesheet" media="(prefers-color-scheme:dark)" href="../../static.files/dark-1097f8e92a01e3cf.css"><link rel="stylesheet" href="../../static.files/noscript-13285aec31fa243e.css"></noscript><link rel="alternate icon" type="image/png" href="../../static.files/favicon-16x16-8b506e7a72182f1c.png"><link rel="alternate icon" type="image/png" href="../../static.files/favicon-32x32-422f7d1d52889060.png"><link rel="icon" type="image/svg+xml" href="../../static.files/favicon-2c020d218678b618.svg"></head><body class="rustdoc source"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"></nav><main><nav class="sub"><a class="sub-logo-container" href="../../maplibre/index.html"><img class="rust-logo" src="../../static.files/rust-logo-151179464ae7ed46.svg" alt="logo"></a><form class="search-form"><span></span><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press S to search, ? for more options…" type="search"><div id="help-button" title="help" tabindex="-1"><a href="../../help.html">?</a></div><div id="settings-menu" tabindex="-1"><a href="../../settings.html" title="settings"><img width="22" height="22" alt="Change settings" src="../../static.files/wheel-7b819b6101059cd0.svg"></a></div></form></nav><section id="main-content" class="content"><div class="example-wrap"><div data-nosnippet><pre class="src-line-numbers"><a href="#1" id="1">1</a>
<a href="#2" id="2">2</a>
<a href="#3" id="3">3</a>
<a href="#4" id="4">4</a>
<a href="#5" id="5">5</a>
<a href="#6" id="6">6</a>
<a href="#7" id="7">7</a>
<a href="#8" id="8">8</a>
<a href="#9" id="9">9</a>
<a href="#10" id="10">10</a>
<a href="#11" id="11">11</a>
<a href="#12" id="12">12</a>
<a href="#13" id="13">13</a>
<a href="#14" id="14">14</a>
<a href="#15" id="15">15</a>
<a href="#16" id="16">16</a>
<a href="#17" id="17">17</a>
<a href="#18" id="18">18</a>
<a href="#19" id="19">19</a>
<a href="#20" id="20">20</a>
<a href="#21" id="21">21</a>
<a href="#22" id="22">22</a>
<a href="#23" id="23">23</a>
<a href="#24" id="24">24</a>
<a href="#25" id="25">25</a>
<a href="#26" id="26">26</a>
<a href="#27" id="27">27</a>
<a href="#28" id="28">28</a>
<a href="#29" id="29">29</a>
<a href="#30" id="30">30</a>
<a href="#31" id="31">31</a>
<a href="#32" id="32">32</a>
<a href="#33" id="33">33</a>
<a href="#34" id="34">34</a>
<a href="#35" id="35">35</a>
<a href="#36" id="36">36</a>
<a href="#37" id="37">37</a>
<a href="#38" id="38">38</a>
<a href="#39" id="39">39</a>
<a href="#40" id="40">40</a>
<a href="#41" id="41">41</a>
<a href="#42" id="42">42</a>
<a href="#43" id="43">43</a>
<a href="#44" id="44">44</a>
<a href="#45" id="45">45</a>
<a href="#46" id="46">46</a>
<a href="#47" id="47">47</a>
<a href="#48" id="48">48</a>
<a href="#49" id="49">49</a>
<a href="#50" id="50">50</a>
<a href="#51" id="51">51</a>
<a href="#52" id="52">52</a>
<a href="#53" id="53">53</a>
<a href="#54" id="54">54</a>
<a href="#55" id="55">55</a>
<a href="#56" id="56">56</a>
<a href="#57" id="57">57</a>
<a href="#58" id="58">58</a>
<a href="#59" id="59">59</a>
<a href="#60" id="60">60</a>
<a href="#61" id="61">61</a>
<a href="#62" id="62">62</a>
<a href="#63" id="63">63</a>
<a href="#64" id="64">64</a>
<a href="#65" id="65">65</a>
<a href="#66" id="66">66</a>
<a href="#67" id="67">67</a>
<a href="#68" id="68">68</a>
<a href="#69" id="69">69</a>
<a href="#70" id="70">70</a>
<a href="#71" id="71">71</a>
<a href="#72" id="72">72</a>
<a href="#73" id="73">73</a>
<a href="#74" id="74">74</a>
<a href="#75" id="75">75</a>
<a href="#76" id="76">76</a>
<a href="#77" id="77">77</a>
<a href="#78" id="78">78</a>
<a href="#79" id="79">79</a>
<a href="#80" id="80">80</a>
<a href="#81" id="81">81</a>
<a href="#82" id="82">82</a>
<a href="#83" id="83">83</a>
<a href="#84" id="84">84</a>
<a href="#85" id="85">85</a>
<a href="#86" id="86">86</a>
<a href="#87" id="87">87</a>
<a href="#88" id="88">88</a>
<a href="#89" id="89">89</a>
<a href="#90" id="90">90</a>
<a href="#91" id="91">91</a>
<a href="#92" id="92">92</a>
<a href="#93" id="93">93</a>
<a href="#94" id="94">94</a>
<a href="#95" id="95">95</a>
<a href="#96" id="96">96</a>
<a href="#97" id="97">97</a>
<a href="#98" id="98">98</a>
<a href="#99" id="99">99</a>
<a href="#100" id="100">100</a>
<a href="#101" id="101">101</a>
<a href="#102" id="102">102</a>
<a href="#103" id="103">103</a>
<a href="#104" id="104">104</a>
<a href="#105" id="105">105</a>
<a href="#106" id="106">106</a>
<a href="#107" id="107">107</a>
<a href="#108" id="108">108</a>
<a href="#109" id="109">109</a>
<a href="#110" id="110">110</a>
<a href="#111" id="111">111</a>
<a href="#112" id="112">112</a>
<a href="#113" id="113">113</a>
<a href="#114" id="114">114</a>
<a href="#115" id="115">115</a>
<a href="#116" id="116">116</a>
<a href="#117" id="117">117</a>
<a href="#118" id="118">118</a>
<a href="#119" id="119">119</a>
<a href="#120" id="120">120</a>
<a href="#121" id="121">121</a>
<a href="#122" id="122">122</a>
<a href="#123" id="123">123</a>
<a href="#124" id="124">124</a>
<a href="#125" id="125">125</a>
<a href="#126" id="126">126</a>
<a href="#127" id="127">127</a>
<a href="#128" id="128">128</a>
<a href="#129" id="129">129</a>
<a href="#130" id="130">130</a>
<a href="#131" id="131">131</a>
<a href="#132" id="132">132</a>
<a href="#133" id="133">133</a>
<a href="#134" id="134">134</a>
<a href="#135" id="135">135</a>
<a href="#136" id="136">136</a>
<a href="#137" id="137">137</a>
<a href="#138" id="138">138</a>
<a href="#139" id="139">139</a>
<a href="#140" id="140">140</a>
<a href="#141" id="141">141</a>
<a href="#142" id="142">142</a>
<a href="#143" id="143">143</a>
<a href="#144" id="144">144</a>
<a href="#145" id="145">145</a>
<a href="#146" id="146">146</a>
<a href="#147" id="147">147</a>
<a href="#148" id="148">148</a>
<a href="#149" id="149">149</a>
<a href="#150" id="150">150</a>
<a href="#151" id="151">151</a>
<a href="#152" id="152">152</a>
<a href="#153" id="153">153</a>
<a href="#154" id="154">154</a>
<a href="#155" id="155">155</a>
<a href="#156" id="156">156</a>
<a href="#157" id="157">157</a>
<a href="#158" id="158">158</a>
<a href="#159" id="159">159</a>
<a href="#160" id="160">160</a>
<a href="#161" id="161">161</a>
<a href="#162" id="162">162</a>
<a href="#163" id="163">163</a>
<a href="#164" id="164">164</a>
<a href="#165" id="165">165</a>
<a href="#166" id="166">166</a>
<a href="#167" id="167">167</a>
<a href="#168" id="168">168</a>
<a href="#169" id="169">169</a>
<a href="#170" id="170">170</a>
<a href="#171" id="171">171</a>
<a href="#172" id="172">172</a>
<a href="#173" id="173">173</a>
<a href="#174" id="174">174</a>
<a href="#175" id="175">175</a>
<a href="#176" id="176">176</a>
<a href="#177" id="177">177</a>
<a href="#178" id="178">178</a>
<a href="#179" id="179">179</a>
<a href="#180" id="180">180</a>
<a href="#181" id="181">181</a>
<a href="#182" id="182">182</a>
<a href="#183" id="183">183</a>
<a href="#184" id="184">184</a>
<a href="#185" id="185">185</a>
<a href="#186" id="186">186</a>
<a href="#187" id="187">187</a>
<a href="#188" id="188">188</a>
<a href="#189" id="189">189</a>
<a href="#190" id="190">190</a>
<a href="#191" id="191">191</a>
<a href="#192" id="192">192</a>
<a href="#193" id="193">193</a>
<a href="#194" id="194">194</a>
<a href="#195" id="195">195</a>
<a href="#196" id="196">196</a>
<a href="#197" id="197">197</a>
<a href="#198" id="198">198</a>
<a href="#199" id="199">199</a>
<a href="#200" id="200">200</a>
<a href="#201" id="201">201</a>
<a href="#202" id="202">202</a>
<a href="#203" id="203">203</a>
<a href="#204" id="204">204</a>
<a href="#205" id="205">205</a>
<a href="#206" id="206">206</a>
<a href="#207" id="207">207</a>
<a href="#208" id="208">208</a>
<a href="#209" id="209">209</a>
<a href="#210" id="210">210</a>
<a href="#211" id="211">211</a>
<a href="#212" id="212">212</a>
<a href="#213" id="213">213</a>
<a href="#214" id="214">214</a>
<a href="#215" id="215">215</a>
<a href="#216" id="216">216</a>
<a href="#217" id="217">217</a>
<a href="#218" id="218">218</a>
<a href="#219" id="219">219</a>
<a href="#220" id="220">220</a>
<a href="#221" id="221">221</a>
<a href="#222" id="222">222</a>
<a href="#223" id="223">223</a>
<a href="#224" id="224">224</a>
<a href="#225" id="225">225</a>
<a href="#226" id="226">226</a>
<a href="#227" id="227">227</a>
<a href="#228" id="228">228</a>
<a href="#229" id="229">229</a>
<a href="#230" id="230">230</a>
<a href="#231" id="231">231</a>
<a href="#232" id="232">232</a>
<a href="#233" id="233">233</a>
<a href="#234" id="234">234</a>
<a href="#235" id="235">235</a>
<a href="#236" id="236">236</a>
<a href="#237" id="237">237</a>
<a href="#238" id="238">238</a>
<a href="#239" id="239">239</a>
<a href="#240" id="240">240</a>
<a href="#241" id="241">241</a>
<a href="#242" id="242">242</a>
<a href="#243" id="243">243</a>
<a href="#244" id="244">244</a>
<a href="#245" id="245">245</a>
<a href="#246" id="246">246</a>
<a href="#247" id="247">247</a>
<a href="#248" id="248">248</a>
<a href="#249" id="249">249</a>
<a href="#250" id="250">250</a>
<a href="#251" id="251">251</a>
<a href="#252" id="252">252</a>
<a href="#253" id="253">253</a>
<a href="#254" id="254">254</a>
<a href="#255" id="255">255</a>
<a href="#256" id="256">256</a>
<a href="#257" id="257">257</a>
<a href="#258" id="258">258</a>
<a href="#259" id="259">259</a>
<a href="#260" id="260">260</a>
<a href="#261" id="261">261</a>
<a href="#262" id="262">262</a>
<a href="#263" id="263">263</a>
<a href="#264" id="264">264</a>
<a href="#265" id="265">265</a>
<a href="#266" id="266">266</a>
<a href="#267" id="267">267</a>
<a href="#268" id="268">268</a>
<a href="#269" id="269">269</a>
<a href="#270" id="270">270</a>
<a href="#271" id="271">271</a>
<a href="#272" id="272">272</a>
<a href="#273" id="273">273</a>
<a href="#274" id="274">274</a>
<a href="#275" id="275">275</a>
<a href="#276" id="276">276</a>
<a href="#277" id="277">277</a>
<a href="#278" id="278">278</a>
<a href="#279" id="279">279</a>
<a href="#280" id="280">280</a>
<a href="#281" id="281">281</a>
<a href="#282" id="282">282</a>
<a href="#283" id="283">283</a>
<a href="#284" id="284">284</a>
<a href="#285" id="285">285</a>
<a href="#286" id="286">286</a>
<a href="#287" id="287">287</a>
<a href="#288" id="288">288</a>
<a href="#289" id="289">289</a>
<a href="#290" id="290">290</a>
<a href="#291" id="291">291</a>
<a href="#292" id="292">292</a>
<a href="#293" id="293">293</a>
<a href="#294" id="294">294</a>
<a href="#295" id="295">295</a>
<a href="#296" id="296">296</a>
<a href="#297" id="297">297</a>
<a href="#298" id="298">298</a>
<a href="#299" id="299">299</a>
<a href="#300" id="300">300</a>
<a href="#301" id="301">301</a>
<a href="#302" id="302">302</a>
<a href="#303" id="303">303</a>
<a href="#304" id="304">304</a>
<a href="#305" id="305">305</a>
<a href="#306" id="306">306</a>
<a href="#307" id="307">307</a>
<a href="#308" id="308">308</a>
<a href="#309" id="309">309</a>
<a href="#310" id="310">310</a>
<a href="#311" id="311">311</a>
<a href="#312" id="312">312</a>
<a href="#313" id="313">313</a>
<a href="#314" id="314">314</a>
<a href="#315" id="315">315</a>
</pre></div><pre class="rust"><code><span class="kw">use </span>std::collections::HashMap;
<span class="kw">use </span>downcast_rs::{impl_downcast, Downcast};
<span class="kw">use crate</span>::{
context::MapContext,
define_label,
tcs::system::{stage::SystemStage, IntoSystemContainer},
};
<span class="kw">pub struct </span>NopStage;
<span class="kw">impl </span>Stage <span class="kw">for </span>NopStage {
<span class="kw">fn </span>run(<span class="kw-2">&amp;mut </span><span class="self">self</span>, _context: <span class="kw-2">&amp;mut </span>MapContext) {}
}
<span class="attr">#[macro_export]
</span><span class="macro">macro_rules! </span>multi_stage {
(<span class="macro-nonterminal">$multi_stage</span>:ident, $(<span class="macro-nonterminal">$stage</span>:ident: <span class="macro-nonterminal">$stage_ty</span>:ty),<span class="kw-2">*</span>) =&gt; {
<span class="kw">pub struct </span><span class="macro-nonterminal">$multi_stage </span>{
$(<span class="macro-nonterminal">$stage</span>: <span class="macro-nonterminal">$stage_ty</span>),*
}
<span class="kw">impl </span>Stage <span class="kw">for </span><span class="macro-nonterminal">$multi_stage </span>{
<span class="kw">fn </span>run(<span class="kw-2">&amp;mut </span><span class="self">self</span>, context: <span class="kw-2">&amp;mut </span><span class="macro-nonterminal">$crate::context::MapContext</span>) {
$(<span class="self">self</span>.<span class="macro-nonterminal">$stage</span>.run(context);)*
}
}
<span class="kw">impl </span>Default <span class="kw">for </span><span class="macro-nonterminal">$multi_stage </span>{
<span class="kw">fn </span>default() -&gt; <span class="self">Self </span>{
<span class="macro-nonterminal">$multi_stage </span>{
$(<span class="macro-nonterminal">$stage</span>: &lt;<span class="macro-nonterminal">$stage_ty</span>&gt;::default()),*
}
}
}
};
}
<span class="kw">pub struct </span>MultiStage&lt;<span class="kw">const </span>I: usize, S&gt;
<span class="kw">where
</span>S: Stage,
{
stages: [S; I],
}
<span class="kw">impl</span>&lt;<span class="kw">const </span>I: usize, S&gt; MultiStage&lt;I, S&gt;
<span class="kw">where
</span>S: Stage,
{
<span class="kw">pub fn </span>new(stages: [S; I]) -&gt; <span class="self">Self </span>{
<span class="self">Self </span>{ stages }
}
}
<span class="kw">impl</span>&lt;<span class="kw">const </span>I: usize, S&gt; Stage <span class="kw">for </span>MultiStage&lt;I, S&gt;
<span class="kw">where
</span>S: Stage,
{
<span class="kw">fn </span>run(<span class="kw-2">&amp;mut </span><span class="self">self</span>, context: <span class="kw-2">&amp;mut </span>MapContext) {
<span class="kw">for </span>stage <span class="kw">in </span><span class="self">self</span>.stages.iter_mut() {
stage.run(context)
}
}
}
<span class="macro">define_label!</span>(StageLabel);
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">type </span>BoxedStageLabel = Box&lt;<span class="kw">dyn </span>StageLabel&gt;;
<span class="kw">pub trait </span>Stage: Downcast {
<span class="doccomment">/// Runs the stage; this happens once per update.
/// Implementors must initialize all of their state before running the first time.
</span><span class="kw">fn </span>run(<span class="kw-2">&amp;mut </span><span class="self">self</span>, context: <span class="kw-2">&amp;mut </span>MapContext);
}
<span class="macro">impl_downcast!</span>(Stage);
<span class="doccomment">/// A container of [`Stage`]s set to be run in a linear order.
///
/// Since `Schedule` implements the [`Stage`] trait, it can be inserted into another schedule.
/// In this way, the properties of the child schedule can be set differently from the parent.
/// For example, it can be set to run only once during app execution, while the parent schedule
/// runs indefinitely.
</span><span class="attr">#[derive(Default)]
</span><span class="kw">pub struct </span>Schedule {
stages: HashMap&lt;BoxedStageLabel, Box&lt;<span class="kw">dyn </span>Stage&gt;&gt;,
stage_order: Vec&lt;BoxedStageLabel&gt;,
}
<span class="kw">impl </span>Schedule {
<span class="doccomment">/// Adds the given `stage` at the last position of the schedule.
///
/// # Example
///
/// ```
/// # use maplibre::schedule::{Schedule, NopStage};
/// #
/// # let mut schedule = Schedule::default();
/// schedule.add_stage(&quot;my_stage&quot;, NopStage);
/// ```
</span><span class="kw">pub fn </span>add_stage&lt;S: Stage&gt;(<span class="kw-2">&amp;mut </span><span class="self">self</span>, label: <span class="kw">impl </span>StageLabel, stage: S) -&gt; <span class="kw-2">&amp;mut </span><span class="self">Self </span>{
<span class="kw">let </span>label: Box&lt;<span class="kw">dyn </span>StageLabel&gt; = Box::new(label);
<span class="self">self</span>.stage_order.push(label.clone());
<span class="kw">let </span>prev = <span class="self">self</span>.stages.insert(label.clone(), Box::new(stage));
<span class="macro">assert!</span>(prev.is_none(), <span class="string">&quot;Stage already exists: {label:?}.&quot;</span>);
<span class="self">self
</span>}
<span class="kw">pub fn </span>remove_stage(<span class="kw-2">&amp;mut </span><span class="self">self</span>, label: <span class="kw">impl </span>StageLabel) -&gt; <span class="kw-2">&amp;mut </span><span class="self">Self </span>{
<span class="kw">let </span>remove: Box&lt;<span class="kw">dyn </span>StageLabel&gt; = Box::new(label);
<span class="self">self</span>.stages.remove(<span class="kw-2">&amp;</span>remove).expect(<span class="string">&quot;stage not found&quot;</span>);
<span class="self">self</span>.stage_order.retain(|label| label != <span class="kw-2">&amp;</span>remove);
<span class="self">self
</span>}
<span class="doccomment">/// Adds the given `stage` immediately after the `target` stage.
///
/// # Example
///
/// ```
/// # use maplibre::schedule::{Schedule, NopStage};
/// #
/// # let mut schedule = Schedule::default();
/// # schedule.add_stage(&quot;target_stage&quot;, NopStage);
/// schedule.add_stage_after(&quot;target_stage&quot;, &quot;my_stage&quot;, NopStage);
/// ```
</span><span class="kw">pub fn </span>add_stage_after&lt;S: Stage&gt;(
<span class="kw-2">&amp;mut </span><span class="self">self</span>,
target: <span class="kw">impl </span>StageLabel,
label: <span class="kw">impl </span>StageLabel,
stage: S,
) -&gt; <span class="kw-2">&amp;mut </span><span class="self">Self </span>{
<span class="kw">let </span>label: Box&lt;<span class="kw">dyn </span>StageLabel&gt; = Box::new(label);
<span class="kw">let </span>target = <span class="kw-2">&amp;</span>target <span class="kw">as </span><span class="kw-2">&amp;</span><span class="kw">dyn </span>StageLabel;
<span class="kw">let </span>target_index = <span class="self">self
</span>.stage_order
.iter()
.enumerate()
.find(|(_i, stage_label)| <span class="kw-2">&amp;***</span>stage_label == target)
.map(|(i, <span class="kw">_</span>)| i)
.unwrap_or_else(|| <span class="macro">panic!</span>(<span class="string">&quot;Target stage does not exist: {target:?}.&quot;</span>));
<span class="self">self</span>.stage_order.insert(target_index + <span class="number">1</span>, label.clone());
<span class="kw">let </span>prev = <span class="self">self</span>.stages.insert(label.clone(), Box::new(stage));
<span class="macro">assert!</span>(prev.is_none(), <span class="string">&quot;Stage already exists: {label:?}.&quot;</span>);
<span class="self">self
</span>}
<span class="doccomment">/// Adds the given `stage` immediately before the `target` stage.
///
/// # Example
///
/// ```
/// # use maplibre::schedule::{Schedule, NopStage};
/// #
/// # let mut schedule = Schedule::default();
/// # schedule.add_stage(&quot;target_stage&quot;, NopStage);
/// #
/// schedule.add_stage_before(&quot;target_stage&quot;, &quot;my_stage&quot;, NopStage);
/// ```
</span><span class="kw">pub fn </span>add_stage_before&lt;S: Stage&gt;(
<span class="kw-2">&amp;mut </span><span class="self">self</span>,
target: <span class="kw">impl </span>StageLabel,
label: <span class="kw">impl </span>StageLabel,
stage: S,
) -&gt; <span class="kw-2">&amp;mut </span><span class="self">Self </span>{
<span class="kw">let </span>label: Box&lt;<span class="kw">dyn </span>StageLabel&gt; = Box::new(label);
<span class="kw">let </span>target = <span class="kw-2">&amp;</span>target <span class="kw">as </span><span class="kw-2">&amp;</span><span class="kw">dyn </span>StageLabel;
<span class="kw">let </span>target_index = <span class="self">self
</span>.stage_order
.iter()
.enumerate()
.find(|(_i, stage_label)| <span class="kw-2">&amp;***</span>stage_label == target)
.map(|(i, <span class="kw">_</span>)| i)
.unwrap_or_else(|| <span class="macro">panic!</span>(<span class="string">&quot;Target stage does not exist: {target:?}.&quot;</span>));
<span class="self">self</span>.stage_order.insert(target_index, label.clone());
<span class="kw">let </span>prev = <span class="self">self</span>.stages.insert(label.clone(), Box::new(stage));
<span class="macro">assert!</span>(prev.is_none(), <span class="string">&quot;Stage already exists: {label:?}.&quot;</span>);
<span class="self">self
</span>}
<span class="doccomment">/// Fetches the [`Stage`] of type `T` marked with `label`, then executes the provided
/// `func` passing the fetched stage to it as an argument.
///
/// The `func` argument should be a function or a closure that accepts a mutable reference
/// to a struct implementing `Stage` and returns the same type. That means that it should
/// also assume that the stage has already been fetched successfully.
///
/// # Example
///
/// ```
/// # use maplibre::schedule::{Schedule, NopStage};
/// # let mut schedule = Schedule::default();
///
/// # schedule.add_stage(&quot;my_stage&quot;, NopStage);
/// #
/// schedule.stage(&quot;my_stage&quot;, |stage: &amp;mut NopStage| {
/// // modify stage
/// stage
/// });
/// ```
///
/// # Panics
///
/// Panics if `label` refers to a non-existing stage, or if it&#39;s not of type `T`.
</span><span class="kw">pub fn </span>stage&lt;T: Stage, F: FnOnce(<span class="kw-2">&amp;mut </span>T) -&gt; <span class="kw-2">&amp;mut </span>T&gt;(
<span class="kw-2">&amp;mut </span><span class="self">self</span>,
label: <span class="kw">impl </span>StageLabel,
func: F,
) -&gt; <span class="kw-2">&amp;mut </span><span class="self">Self </span>{
<span class="kw">let </span>stage = <span class="self">self</span>.get_stage_mut::&lt;T&gt;(<span class="kw-2">&amp;</span>label).unwrap_or_else(<span class="kw">move </span>|| {
<span class="macro">panic!</span>(<span class="string">&quot;stage &#39;{label:?}&#39; does not exist or is the wrong type&quot;</span>)
});
func(stage);
<span class="self">self
</span>}
<span class="doccomment">/// Returns a shared reference to the stage identified by `label`, if it exists.
///
/// If the requested stage does not exist, `None` is returned instead.
///
/// # Example
///
/// ```
/// # use maplibre::schedule::{Schedule, NopStage};
/// #
/// # let mut schedule = Schedule::default();
/// # schedule.add_stage(&quot;my_stage&quot;, NopStage);
/// #
/// let stage = schedule.get_stage::&lt;NopStage&gt;(&amp;&quot;my_stage&quot;).unwrap();
/// ```
</span><span class="kw">pub fn </span>get_stage&lt;T: Stage&gt;(<span class="kw-2">&amp;</span><span class="self">self</span>, label: <span class="kw-2">&amp;</span><span class="kw">dyn </span>StageLabel) -&gt; <span class="prelude-ty">Option</span>&lt;<span class="kw-2">&amp;</span>T&gt; {
<span class="self">self</span>.stages
.get(label)
.and_then(|stage| stage.downcast_ref::&lt;T&gt;())
}
<span class="doccomment">/// Returns a unique, mutable reference to the stage identified by `label`, if it exists.
///
/// If the requested stage does not exist, `None` is returned instead.
///
/// # Example
///
/// ```
/// # use maplibre::schedule::{Schedule, NopStage};
/// #
/// # let mut schedule = Schedule::default();
/// # schedule.add_stage(&quot;my_stage&quot;, NopStage);
/// #
/// let stage = schedule.get_stage_mut::&lt;NopStage&gt;(&amp;&quot;my_stage&quot;).unwrap();
/// ```
</span><span class="kw">pub fn </span>get_stage_mut&lt;T: Stage&gt;(<span class="kw-2">&amp;mut </span><span class="self">self</span>, label: <span class="kw-2">&amp;</span><span class="kw">dyn </span>StageLabel) -&gt; <span class="prelude-ty">Option</span>&lt;<span class="kw-2">&amp;mut </span>T&gt; {
<span class="self">self</span>.stages
.get_mut(label)
.and_then(|stage| stage.downcast_mut::&lt;T&gt;())
}
<span class="doccomment">/// Executes each [`Stage`] contained in the schedule, one at a time.
</span><span class="kw">pub fn </span>run_once(<span class="kw-2">&amp;mut </span><span class="self">self</span>, context: <span class="kw-2">&amp;mut </span>MapContext) {
<span class="kw">for </span>label <span class="kw">in </span><span class="kw-2">&amp;</span><span class="self">self</span>.stage_order {
<span class="attr">#[cfg(feature = <span class="string">&quot;trace&quot;</span>)]
</span><span class="kw">let </span>_stage_span = <span class="macro">tracing::info_span!</span>(<span class="string">&quot;stage&quot;</span>, name = <span class="question-mark">?</span>label).entered();
<span class="kw">let </span>stage = <span class="self">self</span>.stages.get_mut(label).unwrap(); <span class="comment">// TODO: Remove unwrap
</span>stage.run(context);
}
}
<span class="kw">pub fn </span>clear(<span class="kw-2">&amp;mut </span><span class="self">self</span>) {
<span class="self">self</span>.stage_order.clear();
<span class="self">self</span>.stages.clear();
}
<span class="doccomment">/// Iterates over all of schedule&#39;s stages and their labels, in execution order.
</span><span class="kw">pub fn </span>iter_stages(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw">impl </span>Iterator&lt;Item = (<span class="kw-2">&amp;</span><span class="kw">dyn </span>StageLabel, <span class="kw-2">&amp;</span><span class="kw">dyn </span>Stage)&gt; {
<span class="self">self</span>.stage_order
.iter()
.map(<span class="kw">move </span>|label| (<span class="kw-2">&amp;**</span>label, <span class="kw-2">&amp;*</span><span class="self">self</span>.stages[label]))
}
<span class="doccomment">/// Adds a system to the [`Stage`] identified by `stage_label`.
///
/// # Examples
///
/// ```
/// # use maplibre::context::MapContext;
/// # use maplibre::tcs::system::stage::SystemStage;
/// # use maplibre::schedule::{Schedule, NopStage};
/// #
/// # let mut schedule = Schedule::default();
/// # schedule.add_stage(&quot;my_stage&quot;, SystemStage::default());
/// # fn my_system(context: &amp;mut MapContext) {}
/// #
/// schedule.add_system_to_stage(&quot;my_stage&quot;, my_system);
/// ```
</span><span class="kw">pub fn </span>add_system_to_stage(
<span class="kw-2">&amp;mut </span><span class="self">self</span>,
stage_label: <span class="kw">impl </span>StageLabel,
system: <span class="kw">impl </span>IntoSystemContainer,
) -&gt; <span class="kw-2">&amp;mut </span><span class="self">Self </span>{
<span class="kw">let </span>stage = <span class="self">self
</span>.get_stage_mut::&lt;SystemStage&gt;(<span class="kw-2">&amp;</span>stage_label)
.unwrap_or_else(<span class="kw">move </span>|| {
<span class="macro">panic!</span>(<span class="string">&quot;Stage &#39;{stage_label:?}&#39; does not exist or is not a SystemStage&quot;</span>)
});
stage.add_system(system);
<span class="self">self
</span>}
}
<span class="kw">impl </span>Stage <span class="kw">for </span>Schedule {
<span class="kw">fn </span>run(<span class="kw-2">&amp;mut </span><span class="self">self</span>, context: <span class="kw-2">&amp;mut </span>MapContext) {
<span class="self">self</span>.run_once(context);
}
}
</code></pre></div></section></main></body></html>