static site

Orual ce12f194 e7931103

+2509 -37
+39 -8
crates/weaver-renderer/src/css.rs
··· 1 1 use crate::theme::Theme; 2 2 use miette::IntoDiagnostic; 3 - use syntect::highlighting::ThemeSet; 3 + use syntect::highlighting::{Theme as SyntectTheme, ThemeSet}; 4 4 use syntect::html::{ClassStyle, css_for_theme_with_class_style}; 5 5 use syntect::parsing::SyntaxSet; 6 + use std::io::Cursor; 7 + 8 + // Embed rose-pine themes at compile time 9 + const ROSE_PINE_THEME: &str = include_str!("../themes/rose-pine.tmTheme"); 10 + const ROSE_PINE_DAWN_THEME: &str = include_str!("../themes/rose-pine-dawn.tmTheme"); 6 11 7 12 pub fn generate_base_css(theme: &Theme) -> String { 8 13 format!( ··· 179 184 } 180 185 181 186 pub fn generate_syntax_css( 182 - syntect_theme_name: &str, 187 + theme: &Theme, 183 188 _syntax_set: &SyntaxSet, 184 189 ) -> miette::Result<String> { 185 - let theme_set = ThemeSet::load_defaults(); 186 - let theme = theme_set 187 - .themes 188 - .get(syntect_theme_name) 189 - .ok_or_else(|| miette::miette!("Theme '{}' not found", syntect_theme_name))?; 190 + let syntect_theme = if let Some(custom_path) = &theme.custom_syntect_theme_path { 191 + // Load custom theme from file 192 + ThemeSet::get_theme(custom_path) 193 + .into_diagnostic() 194 + .map_err(|e| miette::miette!("Failed to load custom theme from {:?}: {}", custom_path, e))? 195 + } else { 196 + // Check for embedded themes first 197 + match theme.syntect_theme_name.as_str() { 198 + "rose-pine" => { 199 + let mut cursor = Cursor::new(ROSE_PINE_THEME.as_bytes()); 200 + ThemeSet::load_from_reader(&mut cursor) 201 + .into_diagnostic() 202 + .map_err(|e| miette::miette!("Failed to load embedded rose-pine theme: {}", e))? 203 + } 204 + "rose-pine-dawn" => { 205 + let mut cursor = Cursor::new(ROSE_PINE_DAWN_THEME.as_bytes()); 206 + ThemeSet::load_from_reader(&mut cursor) 207 + .into_diagnostic() 208 + .map_err(|e| miette::miette!("Failed to load embedded rose-pine-dawn theme: {}", e))? 209 + } 210 + _ => { 211 + // Fall back to syntect's built-in themes 212 + let theme_set = ThemeSet::load_defaults(); 213 + theme_set 214 + .themes 215 + .get(theme.syntect_theme_name.as_str()) 216 + .ok_or_else(|| miette::miette!("Theme '{}' not found in defaults", theme.syntect_theme_name))? 217 + .clone() 218 + } 219 + } 220 + }; 190 221 191 222 let css = css_for_theme_with_class_style( 192 - theme, 223 + &syntect_theme, 193 224 ClassStyle::SpacedPrefixed { 194 225 prefix: crate::code_pretty::CSS_PREFIX, 195 226 },
+4 -4
crates/weaver-renderer/src/snapshots/weaver_renderer__static_site__tests__code_block_rendering.snap
··· 2 2 source: crates/weaver-renderer/src/static_site.rs 3 3 expression: output 4 4 --- 5 - <pre><code class="language-rust">fn main() { 6 - println!("Hello"); 7 - } 8 - </code></pre> 5 + <pre><code class="language-Rust"><span class="wvrcode-source wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">main</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> </span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 6 + <span class="wvrcode-support wvrcode-macro wvrcode-rust">println!</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-string wvrcode-quoted wvrcode-double wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-begin wvrcode-rust">&quot;</span>Hello<span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-end wvrcode-rust">&quot;</span></span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span><span class="wvrcode-punctuation wvrcode-terminator wvrcode-rust">;</span> 7 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 8 + </span></code></pre>
+200 -7
crates/weaver-renderer/src/static_site.rs
··· 11 11 12 12 use crate::{ 13 13 ContextIterator, NotebookProcessor, 14 - static_site::{context::StaticSiteContext, writer::StaticPageWriter}, 14 + static_site::{ 15 + context::StaticSiteContext, 16 + document::{CssMode, write_document_footer, write_document_head}, 17 + writer::StaticPageWriter, 18 + }, 15 19 utils::flatten_dir_to_just_one_parent, 16 20 walker::{WalkOptions, vault_contents}, 17 21 }; ··· 131 135 } 132 136 self.context.destination.clone() 133 137 }; 134 - return write_page(self.context.clone(), &self.context.start_at, dest).await; 138 + // Use standalone writer for single file (inline CSS) 139 + return write_page_standalone(self.context.clone(), &self.context.start_at, dest).await; 135 140 } 136 141 137 142 if !self.context.destination.exists() { ··· 140 145 self.context.destination.display() 141 146 )); 142 147 } 148 + 149 + // Generate CSS files for multi-file mode 150 + self.generate_css_files().await?; 143 151 144 152 let mut writers = 145 153 Vec::with_capacity(self.context.dir_contents.clone().unwrap_or_default().len()); ··· 161 169 .strip_prefix(context.start_at.clone()) 162 170 .expect("file should always be nested under root") 163 171 .to_path_buf(); 172 + 173 + // Check if this is a markdown file 174 + let is_markdown = file.extension() 175 + .and_then(|ext| ext.to_str()) 176 + .map(|ext| ext == "md" || ext == "markdown") 177 + .unwrap_or(false); 178 + 179 + if !is_markdown { 180 + // Copy non-markdown files directly 181 + let output_path = if context 182 + .options 183 + .contains(StaticSiteOptions::FLATTEN_STRUCTURE) 184 + { 185 + let path_str = relative_path.to_string_lossy(); 186 + let (parent, fname) = flatten_dir_to_just_one_parent(&path_str); 187 + let parent = if parent.is_empty() { "entry" } else { parent }; 188 + context 189 + .destination 190 + .join(String::from(parent)) 191 + .join(String::from(fname)) 192 + } else { 193 + context.destination.join(relative_path.clone()) 194 + }; 195 + 196 + // Create parent directory if needed 197 + if let Some(parent) = output_path.parent() { 198 + tokio::fs::create_dir_all(parent).await.into_diagnostic()?; 199 + } 200 + 201 + tokio::fs::copy(&file, &output_path).await.into_diagnostic()?; 202 + return Ok(()); 203 + } 204 + 205 + // Process markdown files 206 + // Check if this is the designated index file 207 + if let Some(index) = &context.index_file { 208 + if &relative_path == index { 209 + let output_path = context.destination.join("index.html"); 210 + return write_page(context.clone(), file, output_path).await; 211 + } 212 + } 213 + 164 214 if context 165 215 .options 166 216 .contains(StaticSiteOptions::FLATTEN_STRUCTURE) 167 217 { 168 218 let path_str = relative_path.to_string_lossy(); 169 - let (parent, file) = flatten_dir_to_just_one_parent(&path_str); 219 + let (parent, fname) = flatten_dir_to_just_one_parent(&path_str); 220 + let parent = if parent.is_empty() { "entry" } else { parent }; 170 221 let output_path = context 171 222 .destination 172 223 .join(String::from(parent)) 173 - .join(String::from(file)); 224 + .join(String::from(fname)); 174 225 175 - write_page(context.clone(), relative_path, output_path).await?; 226 + write_page(context.clone(), file.clone(), output_path).await?; 176 227 } else { 177 228 let output_path = context.destination.join(relative_path.clone()); 178 229 179 - write_page(context.clone(), relative_path, output_path).await?; 230 + write_page(context.clone(), file.clone(), output_path).await?; 180 231 } 181 232 Ok::<(), miette::Report>(()) 182 233 })); ··· 187 238 for fut in n0_future::join_all(writers).await.into_iter() { 188 239 fut.into_diagnostic()??; 189 240 } 241 + 242 + // Generate default index if requested and no custom index specified 243 + if self 244 + .context 245 + .options 246 + .contains(StaticSiteOptions::CREATE_INDEX) 247 + && self.context.index_file.is_none() 248 + { 249 + self.generate_default_index().await?; 250 + } 251 + 252 + Ok(()) 253 + } 254 + 255 + async fn generate_css_files(&self) -> Result<(), miette::Report> { 256 + use crate::css::{generate_base_css, generate_syntax_css}; 257 + use crate::theme::Theme; 258 + 259 + let css_dir = self.context.destination.join("css"); 260 + tokio::fs::create_dir_all(&css_dir) 261 + .await 262 + .into_diagnostic()?; 263 + 264 + let default_theme = Theme::default(); 265 + let theme = self.context.theme.as_deref().unwrap_or(&default_theme); 266 + 267 + // Write base.css 268 + let base_css = generate_base_css(theme); 269 + tokio::fs::write(css_dir.join("base.css"), base_css) 270 + .await 271 + .into_diagnostic()?; 272 + 273 + // Write syntax.css 274 + let syntax_css = generate_syntax_css(theme, &self.context.syntax_set)?; 275 + tokio::fs::write(css_dir.join("syntax.css"), syntax_css) 276 + .await 277 + .into_diagnostic()?; 278 + 279 + Ok(()) 280 + } 281 + 282 + async fn generate_default_index(&self) -> Result<(), miette::Report> { 283 + let index_path = self.context.destination.join("index.html"); 284 + let mut index_file = crate::utils::create_file(&index_path).await?; 285 + 286 + // Write head 287 + write_document_head(&self.context, &mut index_file, CssMode::Linked, &index_path).await?; 288 + 289 + // Write title and list 290 + index_file 291 + .write_all(b"<h1>Index</h1>\n<ul>\n") 292 + .await 293 + .into_diagnostic()?; 294 + 295 + // List all files 296 + if let Some(contents) = &self.context.dir_contents { 297 + for file in contents.iter() { 298 + if let Ok(relative) = file.strip_prefix(&self.context.start_at) { 299 + let display_name = relative.to_string_lossy(); 300 + let link = if self 301 + .context 302 + .options 303 + .contains(StaticSiteOptions::FLATTEN_STRUCTURE) 304 + { 305 + let (parent, fname) = flatten_dir_to_just_one_parent(&display_name); 306 + // Change extension to .html 307 + let fname_html = 308 + PathBuf::from(fname.as_ref() as &str).with_extension("html"); 309 + let fname_html_str = fname_html.to_string_lossy(); 310 + if !parent.is_empty() { 311 + format!("./{}/{}", parent, fname_html_str) 312 + } else { 313 + format!("./entry/{}", fname_html_str) 314 + } 315 + } else { 316 + // Change extension to .html 317 + let html_path = 318 + PathBuf::from(display_name.as_ref() as &str).with_extension("html"); 319 + format!("./{}", html_path.to_string_lossy()) 320 + }; 321 + 322 + index_file 323 + .write_all( 324 + format!(" <li><a href=\"{}\">{}</a></li>\n", link, display_name) 325 + .as_bytes(), 326 + ) 327 + .await 328 + .into_diagnostic()?; 329 + } 330 + } 331 + } 332 + 333 + index_file.write_all(b"</ul>\n").await.into_diagnostic()?; 334 + 335 + // Write footer 336 + write_document_footer(&mut index_file).await?; 337 + 190 338 Ok(()) 191 339 } 192 340 } ··· 227 375 let contents = tokio::fs::read_to_string(&input_path) 228 376 .await 229 377 .into_diagnostic()?; 230 - let mut output_file = crate::utils::create_file(output_path.as_ref()).await?; 378 + 379 + // Change extension to .html 380 + let output_path = output_path.as_ref().with_extension("html"); 381 + let mut output_file = crate::utils::create_file(&output_path).await?; 382 + let context = context.clone_with_path(input_path); 383 + 384 + // Write document head 385 + write_document_head(&context, &mut output_file, CssMode::Linked, &output_path).await?; 386 + 387 + // Write body content 388 + let output = export_page(&contents, context).await?; 389 + output_file 390 + .write_all(output.as_bytes()) 391 + .await 392 + .into_diagnostic()?; 393 + 394 + // Write document footer 395 + write_document_footer(&mut output_file).await?; 396 + 397 + Ok(()) 398 + } 399 + 400 + pub async fn write_page_standalone<A>( 401 + context: StaticSiteContext<A>, 402 + input_path: impl AsRef<Path>, 403 + output_path: impl AsRef<Path>, 404 + ) -> Result<(), miette::Report> 405 + where 406 + A: AgentSession + IdentityResolver, 407 + { 408 + let contents = tokio::fs::read_to_string(&input_path) 409 + .await 410 + .into_diagnostic()?; 411 + 412 + // Change extension to .html 413 + let output_path = output_path.as_ref().with_extension("html"); 414 + let mut output_file = crate::utils::create_file(&output_path).await?; 231 415 let context = context.clone_with_path(input_path); 416 + 417 + // Write document head with inline CSS 418 + write_document_head(&context, &mut output_file, CssMode::Inline, &output_path).await?; 419 + 420 + // Write body content 232 421 let output = export_page(&contents, context).await?; 233 422 output_file 234 423 .write_all(output.as_bytes()) 235 424 .await 236 425 .into_diagnostic()?; 426 + 427 + // Write document footer 428 + write_document_footer(&mut output_file).await?; 429 + 237 430 Ok(()) 238 431 } 239 432
+72 -13
crates/weaver-renderer/src/static_site/document.rs
··· 14 14 context: &StaticSiteContext<A>, 15 15 writer: &mut (impl tokio::io::AsyncWrite + Unpin), 16 16 css_mode: CssMode, 17 + output_path: &std::path::Path, 17 18 ) -> miette::Result<()> { 18 19 use tokio::io::AsyncWriteExt; 19 20 20 21 // Get title from frontmatter or current path 21 - let title = if let Some(path) = context.dir_contents.as_ref() 22 + let title = if let Some(path) = context 23 + .dir_contents 24 + .as_ref() 22 25 .and_then(|contents| contents.get(context.position)) 23 26 { 24 - context.titles.get(path) 27 + context 28 + .titles 29 + .get(path) 25 30 .map(|t| t.value().to_string()) 26 31 .unwrap_or_else(|| { 27 32 path.file_stem() ··· 33 38 "Untitled".to_string() 34 39 }; 35 40 36 - writer.write_all(b"<!DOCTYPE html>\n").await.into_diagnostic()?; 37 - writer.write_all(b"<html lang=\"en\">\n").await.into_diagnostic()?; 41 + // Calculate relative path to root based on output file depth 42 + let relative_to_root = if let Ok(rel) = output_path.strip_prefix(&context.destination) { 43 + let depth = rel.components().count() - 1; // -1 because the file itself doesn't count 44 + if depth == 0 { 45 + ".".to_string() 46 + } else { 47 + "../".repeat(depth) 48 + } 49 + } else { 50 + ".".to_string() 51 + }; 52 + 53 + writer 54 + .write_all(b"<!DOCTYPE html>\n") 55 + .await 56 + .into_diagnostic()?; 57 + writer 58 + .write_all(b"<html lang=\"en\">\n") 59 + .await 60 + .into_diagnostic()?; 38 61 writer.write_all(b"<head>\n").await.into_diagnostic()?; 39 - writer.write_all(b" <meta charset=\"utf-8\">\n").await.into_diagnostic()?; 40 - writer.write_all(b" <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n").await.into_diagnostic()?; 62 + writer 63 + .write_all(b" <meta charset=\"utf-8\">\n") 64 + .await 65 + .into_diagnostic()?; 66 + writer 67 + .write_all(b" <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n") 68 + .await 69 + .into_diagnostic()?; 41 70 42 71 // Title 43 72 writer.write_all(b" <title>").await.into_diagnostic()?; ··· 47 76 // CSS 48 77 match css_mode { 49 78 CssMode::Linked => { 50 - writer.write_all(b" <link rel=\"stylesheet\" href=\"/css/base.css\">\n").await.into_diagnostic()?; 51 - writer.write_all(b" <link rel=\"stylesheet\" href=\"/css/syntax.css\">\n").await.into_diagnostic()?; 79 + writer 80 + .write_all(format!(" <link rel=\"stylesheet\" href=\"{}/css/base.css\">\n", relative_to_root).as_bytes()) 81 + .await 82 + .into_diagnostic()?; 83 + writer 84 + .write_all(format!(" <link rel=\"stylesheet\" href=\"{}/css/syntax.css\">\n", relative_to_root).as_bytes()) 85 + .await 86 + .into_diagnostic()?; 52 87 } 53 88 CssMode::Inline => { 54 89 let default_theme = Theme::default(); 55 90 let theme = context.theme.as_deref().unwrap_or(&default_theme); 56 91 57 92 writer.write_all(b" <style>\n").await.into_diagnostic()?; 58 - writer.write_all(generate_base_css(theme).as_bytes()).await.into_diagnostic()?; 93 + writer 94 + .write_all(generate_base_css(theme).as_bytes()) 95 + .await 96 + .into_diagnostic()?; 59 97 writer.write_all(b" </style>\n").await.into_diagnostic()?; 60 98 61 99 writer.write_all(b" <style>\n").await.into_diagnostic()?; 62 - let syntax_css = generate_syntax_css(&theme.syntect_theme_name, &context.syntax_set)?; 63 - writer.write_all(syntax_css.as_bytes()).await.into_diagnostic()?; 100 + let syntax_css = generate_syntax_css(theme, &context.syntax_set)?; 101 + writer 102 + .write_all(syntax_css.as_bytes()) 103 + .await 104 + .into_diagnostic()?; 64 105 writer.write_all(b" </style>\n").await.into_diagnostic()?; 65 106 } 66 107 } ··· 75 116 } 76 117 KaTeXSource::Local(path) => { 77 118 let path_str = path.to_string_lossy(); 78 - writer.write_all(format!(" <link rel=\"stylesheet\" href=\"{}/katex.min.css\">\n", path_str).as_bytes()).await.into_diagnostic()?; 79 - writer.write_all(format!(" <script defer src=\"{}/katex.min.js\"></script>\n", path_str).as_bytes()).await.into_diagnostic()?; 119 + writer 120 + .write_all( 121 + format!( 122 + " <link rel=\"stylesheet\" href=\"{}/katex.min.css\">\n", 123 + path_str 124 + ) 125 + .as_bytes(), 126 + ) 127 + .await 128 + .into_diagnostic()?; 129 + writer 130 + .write_all( 131 + format!( 132 + " <script defer src=\"{}/katex.min.js\"></script>\n", 133 + path_str 134 + ) 135 + .as_bytes(), 136 + ) 137 + .await 138 + .into_diagnostic()?; 80 139 writer.write_all(format!(" <script defer src=\"{}/contrib/auto-render.min.js\" onload=\"renderMathInElement(document.body);\"></script>\n", path_str).as_bytes()).await.into_diagnostic()?; 81 140 } 82 141 }
+3 -1
crates/weaver-renderer/src/static_site/writer.rs
··· 109 109 ) { 110 110 Ok(_) => { 111 111 self.write(&temp_output)?; 112 - }, 112 + } 113 113 Err(_) => { 114 114 // Fallback to plain code block 115 115 self.write("<pre><code class=\"language-")?; ··· 518 518 id, 519 519 attrs, 520 520 } => { 521 + println!("Image tag {}", dest_url); 521 522 self.write_image(Tag::Image { 522 523 link_type, 523 524 dest_url, ··· 534 535 id, 535 536 attrs, 536 537 } => { 538 + println!("Embed {:?}: {} - {}", embed_type, title, dest_url); 537 539 if let Some(attrs) = attrs { 538 540 if let Some((_, content)) = attrs 539 541 .attrs
+13 -4
crates/weaver-renderer/src/theme.rs
··· 1 1 use smol_str::SmolStr; 2 + use std::path::PathBuf; 2 3 3 4 #[derive(Debug, Clone)] 4 5 pub struct Theme { ··· 6 7 pub fonts: FontScheme, 7 8 pub spacing: SpacingScheme, 8 9 pub syntect_theme_name: SmolStr, 10 + pub custom_syntect_theme_path: Option<PathBuf>, 9 11 } 10 12 11 13 #[derive(Debug, Clone)] ··· 36 38 colors: ColorScheme::default(), 37 39 fonts: FontScheme::default(), 38 40 spacing: SpacingScheme::default(), 39 - syntect_theme_name: SmolStr::new("base16-ocean.dark"), 41 + syntect_theme_name: SmolStr::new("rose-pine"), 42 + custom_syntect_theme_path: None, 40 43 } 41 44 } 42 45 } ··· 55 58 impl Default for FontScheme { 56 59 fn default() -> Self { 57 60 Self { 58 - body: SmolStr::new("system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif"), 59 - heading: SmolStr::new("system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif"), 60 - monospace: SmolStr::new("'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, monospace"), 61 + body: SmolStr::new( 62 + "IBM Plex, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif", 63 + ), 64 + heading: SmolStr::new( 65 + "IBM Plex Sans, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif", 66 + ), 67 + monospace: SmolStr::new( 68 + "'IBM Plex Mono', 'Berkeley Mono', 'Cascadia Code', 'Roboto Mono', Consolas, monospace", 69 + ), 61 70 } 62 71 } 63 72 }
+316
crates/weaver-renderer/themes/rose-pine-dawn.tmTheme
··· 1 + <?xml version="1.0" encoding="UTF-8"?> 2 + <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 3 + <plist version="1.0"> 4 + <dict> 5 + <key>name</key> 6 + <string>Rosé Pine Dawn</string> 7 + <key>settings</key> 8 + <array> 9 + <dict> 10 + <key>settings</key> 11 + <dict> 12 + <key>background</key> 13 + <string>#faf4ed</string> 14 + <key>caret</key> 15 + <string>#cecacd</string> 16 + <key>foreground</key> 17 + <string>#575279</string> 18 + <key>invisibles</key> 19 + <string>#fffaf3</string> 20 + <key>lineHighlight</key> 21 + <string>#f4ede8</string> 22 + <key>selection</key> 23 + <string>#dfdad9</string> 24 + </dict> 25 + </dict> 26 + <dict> 27 + <key>name</key> 28 + <string>Comment</string> 29 + <key>scope</key> 30 + <string>comment</string> 31 + <key>settings</key> 32 + <dict> 33 + <key>fontStyle</key> 34 + <string>italic</string> 35 + <key>foreground</key> 36 + <string>#797593</string> 37 + </dict> 38 + </dict> 39 + <dict> 40 + <key>name</key> 41 + <string>String</string> 42 + <key>scope</key> 43 + <string>string, punctuation.definition.string</string> 44 + <key>settings</key> 45 + <dict> 46 + <key>foreground</key> 47 + <string>#ea9d34</string> 48 + </dict> 49 + </dict> 50 + <dict> 51 + <key>name</key> 52 + <string>Number</string> 53 + <key>scope</key> 54 + <string>constant.numeric</string> 55 + <key>settings</key> 56 + <dict> 57 + <key>foreground</key> 58 + <string>#ea9d34</string> 59 + </dict> 60 + </dict> 61 + <dict> 62 + <key>name</key> 63 + <string>Built-in constant</string> 64 + <key>scope</key> 65 + <string>constant.language</string> 66 + <key>settings</key> 67 + <dict> 68 + <key>fontStyle</key> 69 + <string>bold</string> 70 + <key>foreground</key> 71 + <string>#ea9d34</string> 72 + </dict> 73 + </dict> 74 + <dict> 75 + <key>name</key> 76 + <string>User-defined constant</string> 77 + <key>scope</key> 78 + <string>constant.character, constant.other</string> 79 + <key>settings</key> 80 + <dict> 81 + <key>foreground</key> 82 + <string>#ea9d34</string> 83 + </dict> 84 + </dict> 85 + <dict> 86 + <key>name</key> 87 + <string>Variable</string> 88 + <key>scope</key> 89 + <string>variable</string> 90 + <key>settings</key> 91 + <dict> 92 + <key>fontStyle</key> 93 + <string>italic</string> 94 + <key>foreground</key> 95 + <string>#575279</string> 96 + </dict> 97 + </dict> 98 + <dict> 99 + <key>name</key> 100 + <string>Keyword</string> 101 + <key>scope</key> 102 + <string>keyword</string> 103 + <key>settings</key> 104 + <dict> 105 + <key>foreground</key> 106 + <string>#286983</string> 107 + </dict> 108 + </dict> 109 + <dict> 110 + <key>name</key> 111 + <string>Storage</string> 112 + <key>scope</key> 113 + <string>storage</string> 114 + <key>settings</key> 115 + <dict> 116 + <key>fontStyle</key> 117 + <string></string> 118 + <key>foreground</key> 119 + <string>#56949f</string> 120 + </dict> 121 + </dict> 122 + <dict> 123 + <key>name</key> 124 + <string>Storage type</string> 125 + <key>scope</key> 126 + <string>storage.type</string> 127 + <key>settings</key> 128 + <dict> 129 + <key>fontStyle</key> 130 + <string></string> 131 + <key>foreground</key> 132 + <string>#56949f</string> 133 + </dict> 134 + </dict> 135 + <dict> 136 + <key>name</key> 137 + <string>Class name</string> 138 + <key>scope</key> 139 + <string>entity.name.class</string> 140 + <key>settings</key> 141 + <dict> 142 + <key>fontStyle</key> 143 + <string>bold</string> 144 + <key>foreground</key> 145 + <string>#286983</string> 146 + </dict> 147 + </dict> 148 + <dict> 149 + <key>name</key> 150 + <string>Inherited class</string> 151 + <key>scope</key> 152 + <string>entity.other.inherited-class</string> 153 + <key>settings</key> 154 + <dict> 155 + <key>fontStyle</key> 156 + <string>italic </string> 157 + <key>foreground</key> 158 + <string>#286983</string> 159 + </dict> 160 + </dict> 161 + <dict> 162 + <key>name</key> 163 + <string>Function name</string> 164 + <key>scope</key> 165 + <string>entity.name.function</string> 166 + <key>settings</key> 167 + <dict> 168 + <key>fontStyle</key> 169 + <string>italic</string> 170 + <key>foreground</key> 171 + <string>#d7827e</string> 172 + </dict> 173 + </dict> 174 + <dict> 175 + <key>name</key> 176 + <string>Function argument</string> 177 + <key>scope</key> 178 + <string>variable.parameter</string> 179 + <key>settings</key> 180 + <dict> 181 + <key>fontStyle</key> 182 + <string></string> 183 + <key>foreground</key> 184 + <string>#907aa9</string> 185 + </dict> 186 + </dict> 187 + <dict> 188 + <key>name</key> 189 + <string>Tag name</string> 190 + <key>scope</key> 191 + <string>entity.name.tag</string> 192 + <key>settings</key> 193 + <dict> 194 + <key>fontStyle</key> 195 + <string>bold</string> 196 + <key>foreground</key> 197 + <string>#286983</string> 198 + </dict> 199 + </dict> 200 + <dict> 201 + <key>name</key> 202 + <string>Tag attribute</string> 203 + <key>scope</key> 204 + <string>entity.other.attribute-name</string> 205 + <key>settings</key> 206 + <dict> 207 + <key>fontStyle</key> 208 + <string></string> 209 + <key>foreground</key> 210 + <string>#907aa9</string> 211 + </dict> 212 + </dict> 213 + <dict> 214 + <key>name</key> 215 + <string>Library function</string> 216 + <key>scope</key> 217 + <string>support.function</string> 218 + <key>settings</key> 219 + <dict> 220 + <key>fontStyle</key> 221 + <string>bold</string> 222 + <key>foreground</key> 223 + <string>#d7827e</string> 224 + </dict> 225 + </dict> 226 + <dict> 227 + <key>name</key> 228 + <string>Library constant</string> 229 + <key>scope</key> 230 + <string>support.constant</string> 231 + <key>settings</key> 232 + <dict> 233 + <key>fontStyle</key> 234 + <string>bold</string> 235 + <key>foreground</key> 236 + <string>#ea9d34</string> 237 + </dict> 238 + </dict> 239 + <dict> 240 + <key>name</key> 241 + <string>Library class&#x2f;type</string> 242 + <key>scope</key> 243 + <string>support.type, support.class</string> 244 + <key>settings</key> 245 + <dict> 246 + <key>fontStyle</key> 247 + <string>bold</string> 248 + <key>foreground</key> 249 + <string>#56949f</string> 250 + </dict> 251 + </dict> 252 + <dict> 253 + <key>name</key> 254 + <string>Library variable</string> 255 + <key>scope</key> 256 + <string>support.other.variable</string> 257 + <key>settings</key> 258 + <dict> 259 + <key>fontStyle</key> 260 + <string>bold</string> 261 + <key>foreground</key> 262 + <string>#b4637a</string> 263 + </dict> 264 + </dict> 265 + <dict> 266 + <key>name</key> 267 + <string>Invalid</string> 268 + <key>scope</key> 269 + <string>invalid</string> 270 + <key>settings</key> 271 + <dict> 272 + <key>background</key> 273 + <string>#b4637a</string> 274 + <key>fontStyle</key> 275 + <string></string> 276 + <key>foreground</key> 277 + <string>#575279</string> 278 + </dict> 279 + </dict> 280 + <dict> 281 + <key>name</key> 282 + <string>Invalid deprecated</string> 283 + <key>scope</key> 284 + <string>invalid.deprecated</string> 285 + <key>settings</key> 286 + <dict> 287 + <key>background</key> 288 + <string>#907aa9</string> 289 + <key>foreground</key> 290 + <string>#575279</string> 291 + </dict> 292 + </dict> 293 + <dict> 294 + <key>name</key> 295 + <string>Punctuation, Operators</string> 296 + <key>scope</key> 297 + <string>punctuation, keyword.operator</string> 298 + <key>settings</key> 299 + <dict> 300 + <key>foreground</key> 301 + <string>#797593</string> 302 + </dict> 303 + </dict> 304 + </array> 305 + <key>colorSpaceName</key> 306 + <string>sRGB</string> 307 + <key>semanticClass</key> 308 + <string>theme.light.rosé-pine-dawn</string> 309 + <key>author</key> 310 + <string>arrrgi</string> 311 + <key>comment</key> 312 + <string>All natural pine, faux fur and a bit of soho vibes for the classy minimalist</string> 313 + <key>uuid</key> 314 + <string>BB4B4616-E742-41D5-BB5B-63D45FA614F</string> 315 + </dict> 316 + </plist>
+316
crates/weaver-renderer/themes/rose-pine.tmTheme
··· 1 + <?xml version="1.0" encoding="UTF-8"?> 2 + <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 3 + <plist version="1.0"> 4 + <dict> 5 + <key>name</key> 6 + <string>Rosé Pine</string> 7 + <key>settings</key> 8 + <array> 9 + <dict> 10 + <key>settings</key> 11 + <dict> 12 + <key>background</key> 13 + <string>#191724</string> 14 + <key>caret</key> 15 + <string>#524f67</string> 16 + <key>foreground</key> 17 + <string>#e0def4</string> 18 + <key>invisibles</key> 19 + <string>#1f1d2e</string> 20 + <key>lineHighlight</key> 21 + <string>#21202e</string> 22 + <key>selection</key> 23 + <string>#403d52</string> 24 + </dict> 25 + </dict> 26 + <dict> 27 + <key>name</key> 28 + <string>Comment</string> 29 + <key>scope</key> 30 + <string>comment</string> 31 + <key>settings</key> 32 + <dict> 33 + <key>fontStyle</key> 34 + <string>italic</string> 35 + <key>foreground</key> 36 + <string>#908caa</string> 37 + </dict> 38 + </dict> 39 + <dict> 40 + <key>name</key> 41 + <string>String</string> 42 + <key>scope</key> 43 + <string>string, punctuation.definition.string</string> 44 + <key>settings</key> 45 + <dict> 46 + <key>foreground</key> 47 + <string>#f6c177</string> 48 + </dict> 49 + </dict> 50 + <dict> 51 + <key>name</key> 52 + <string>Number</string> 53 + <key>scope</key> 54 + <string>constant.numeric</string> 55 + <key>settings</key> 56 + <dict> 57 + <key>foreground</key> 58 + <string>#f6c177</string> 59 + </dict> 60 + </dict> 61 + <dict> 62 + <key>name</key> 63 + <string>Built-in constant</string> 64 + <key>scope</key> 65 + <string>constant.language</string> 66 + <key>settings</key> 67 + <dict> 68 + <key>fontStyle</key> 69 + <string>bold</string> 70 + <key>foreground</key> 71 + <string>#f6c177</string> 72 + </dict> 73 + </dict> 74 + <dict> 75 + <key>name</key> 76 + <string>User-defined constant</string> 77 + <key>scope</key> 78 + <string>constant.character, constant.other</string> 79 + <key>settings</key> 80 + <dict> 81 + <key>foreground</key> 82 + <string>#f6c177</string> 83 + </dict> 84 + </dict> 85 + <dict> 86 + <key>name</key> 87 + <string>Variable</string> 88 + <key>scope</key> 89 + <string>variable</string> 90 + <key>settings</key> 91 + <dict> 92 + <key>fontStyle</key> 93 + <string>italic</string> 94 + <key>foreground</key> 95 + <string>#e0def4</string> 96 + </dict> 97 + </dict> 98 + <dict> 99 + <key>name</key> 100 + <string>Keyword</string> 101 + <key>scope</key> 102 + <string>keyword</string> 103 + <key>settings</key> 104 + <dict> 105 + <key>foreground</key> 106 + <string>#31748f</string> 107 + </dict> 108 + </dict> 109 + <dict> 110 + <key>name</key> 111 + <string>Storage</string> 112 + <key>scope</key> 113 + <string>storage</string> 114 + <key>settings</key> 115 + <dict> 116 + <key>fontStyle</key> 117 + <string></string> 118 + <key>foreground</key> 119 + <string>#9ccfd8</string> 120 + </dict> 121 + </dict> 122 + <dict> 123 + <key>name</key> 124 + <string>Storage type</string> 125 + <key>scope</key> 126 + <string>storage.type</string> 127 + <key>settings</key> 128 + <dict> 129 + <key>fontStyle</key> 130 + <string></string> 131 + <key>foreground</key> 132 + <string>#9ccfd8</string> 133 + </dict> 134 + </dict> 135 + <dict> 136 + <key>name</key> 137 + <string>Class name</string> 138 + <key>scope</key> 139 + <string>entity.name.class</string> 140 + <key>settings</key> 141 + <dict> 142 + <key>fontStyle</key> 143 + <string>bold</string> 144 + <key>foreground</key> 145 + <string>#31748f</string> 146 + </dict> 147 + </dict> 148 + <dict> 149 + <key>name</key> 150 + <string>Inherited class</string> 151 + <key>scope</key> 152 + <string>entity.other.inherited-class</string> 153 + <key>settings</key> 154 + <dict> 155 + <key>fontStyle</key> 156 + <string>italic </string> 157 + <key>foreground</key> 158 + <string>#31748f</string> 159 + </dict> 160 + </dict> 161 + <dict> 162 + <key>name</key> 163 + <string>Function name</string> 164 + <key>scope</key> 165 + <string>entity.name.function</string> 166 + <key>settings</key> 167 + <dict> 168 + <key>fontStyle</key> 169 + <string>italic</string> 170 + <key>foreground</key> 171 + <string>#ebbcba</string> 172 + </dict> 173 + </dict> 174 + <dict> 175 + <key>name</key> 176 + <string>Function argument</string> 177 + <key>scope</key> 178 + <string>variable.parameter</string> 179 + <key>settings</key> 180 + <dict> 181 + <key>fontStyle</key> 182 + <string></string> 183 + <key>foreground</key> 184 + <string>#c4a7e7</string> 185 + </dict> 186 + </dict> 187 + <dict> 188 + <key>name</key> 189 + <string>Tag name</string> 190 + <key>scope</key> 191 + <string>entity.name.tag</string> 192 + <key>settings</key> 193 + <dict> 194 + <key>fontStyle</key> 195 + <string>bold</string> 196 + <key>foreground</key> 197 + <string>#31748f</string> 198 + </dict> 199 + </dict> 200 + <dict> 201 + <key>name</key> 202 + <string>Tag attribute</string> 203 + <key>scope</key> 204 + <string>entity.other.attribute-name</string> 205 + <key>settings</key> 206 + <dict> 207 + <key>fontStyle</key> 208 + <string></string> 209 + <key>foreground</key> 210 + <string>#c4a7e7</string> 211 + </dict> 212 + </dict> 213 + <dict> 214 + <key>name</key> 215 + <string>Library function</string> 216 + <key>scope</key> 217 + <string>support.function</string> 218 + <key>settings</key> 219 + <dict> 220 + <key>fontStyle</key> 221 + <string>bold</string> 222 + <key>foreground</key> 223 + <string>#ebbcba</string> 224 + </dict> 225 + </dict> 226 + <dict> 227 + <key>name</key> 228 + <string>Library constant</string> 229 + <key>scope</key> 230 + <string>support.constant</string> 231 + <key>settings</key> 232 + <dict> 233 + <key>fontStyle</key> 234 + <string>bold</string> 235 + <key>foreground</key> 236 + <string>#f6c177</string> 237 + </dict> 238 + </dict> 239 + <dict> 240 + <key>name</key> 241 + <string>Library class&#x2f;type</string> 242 + <key>scope</key> 243 + <string>support.type, support.class</string> 244 + <key>settings</key> 245 + <dict> 246 + <key>fontStyle</key> 247 + <string>bold</string> 248 + <key>foreground</key> 249 + <string>#9ccfd8</string> 250 + </dict> 251 + </dict> 252 + <dict> 253 + <key>name</key> 254 + <string>Library variable</string> 255 + <key>scope</key> 256 + <string>support.other.variable</string> 257 + <key>settings</key> 258 + <dict> 259 + <key>fontStyle</key> 260 + <string>bold</string> 261 + <key>foreground</key> 262 + <string>#eb6f92</string> 263 + </dict> 264 + </dict> 265 + <dict> 266 + <key>name</key> 267 + <string>Invalid</string> 268 + <key>scope</key> 269 + <string>invalid</string> 270 + <key>settings</key> 271 + <dict> 272 + <key>background</key> 273 + <string>#eb6f92</string> 274 + <key>fontStyle</key> 275 + <string></string> 276 + <key>foreground</key> 277 + <string>#e0def4</string> 278 + </dict> 279 + </dict> 280 + <dict> 281 + <key>name</key> 282 + <string>Invalid deprecated</string> 283 + <key>scope</key> 284 + <string>invalid.deprecated</string> 285 + <key>settings</key> 286 + <dict> 287 + <key>background</key> 288 + <string>#c4a7e7</string> 289 + <key>foreground</key> 290 + <string>#e0def4</string> 291 + </dict> 292 + </dict> 293 + <dict> 294 + <key>name</key> 295 + <string>Punctuation, Operators</string> 296 + <key>scope</key> 297 + <string>punctuation, keyword.operator</string> 298 + <key>settings</key> 299 + <dict> 300 + <key>foreground</key> 301 + <string>#908caa</string> 302 + </dict> 303 + </dict> 304 + </array> 305 + <key>colorSpaceName</key> 306 + <string>sRGB</string> 307 + <key>semanticClass</key> 308 + <string>theme.dark.rosé-pine</string> 309 + <key>author</key> 310 + <string>arrrgi</string> 311 + <key>comment</key> 312 + <string>All natural pine, faux fur and a bit of soho vibes for the classy minimalist</string> 313 + <key>uuid</key> 314 + <string>14991673-80EB-41A2-BEFF-03216A233730</string> 315 + </dict> 316 + </plist>
+158
essay/css/base.css
··· 1 + /* CSS Reset */ 2 + *, *::before, *::after { 3 + box-sizing: border-box; 4 + margin: 0; 5 + padding: 0; 6 + } 7 + 8 + /* CSS Variables */ 9 + :root { 10 + --color-background: #ffffff; 11 + --color-foreground: #2b303b; 12 + --color-link: #0366d6; 13 + --color-link-hover: #0256b8; 14 + 15 + --font-body: IBM Plex, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; 16 + --font-heading: IBM Plex Sans, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; 17 + --font-mono: 'IBM Plex Mono', 'Berkeley Mono', 'Cascadia Code', 'Roboto Mono', Consolas, monospace; 18 + 19 + --spacing-base: 16px; 20 + --spacing-line-height: 1.6; 21 + --spacing-scale: 1.25; 22 + } 23 + 24 + /* Base Styles */ 25 + html { 26 + font-size: var(--spacing-base); 27 + line-height: var(--spacing-line-height); 28 + } 29 + 30 + body { 31 + font-family: var(--font-body); 32 + color: var(--color-foreground); 33 + background-color: var(--color-background); 34 + max-width: 65ch; 35 + margin: 0 auto; 36 + padding: 2rem 1rem; 37 + } 38 + 39 + /* Typography */ 40 + h1, h2, h3, h4, h5, h6 { 41 + font-family: var(--font-heading); 42 + margin-top: calc(1rem * var(--spacing-scale)); 43 + margin-bottom: 0.5rem; 44 + line-height: 1.2; 45 + } 46 + 47 + h1 { font-size: 2.5rem; } 48 + h2 { font-size: 2rem; } 49 + h3 { font-size: 1.5rem; } 50 + h4 { font-size: 1.25rem; } 51 + h5 { font-size: 1.125rem; } 52 + h6 { font-size: 1rem; } 53 + 54 + p { 55 + margin-bottom: 1rem; 56 + } 57 + 58 + a { 59 + color: var(--color-link); 60 + text-decoration: none; 61 + } 62 + 63 + a:hover { 64 + color: var(--color-link-hover); 65 + text-decoration: underline; 66 + } 67 + 68 + /* Lists */ 69 + ul, ol { 70 + margin-left: 2rem; 71 + margin-bottom: 1rem; 72 + } 73 + 74 + li { 75 + margin-bottom: 0.25rem; 76 + } 77 + 78 + /* Code */ 79 + code { 80 + font-family: var(--font-mono); 81 + background-color: rgba(0, 0, 0, 0.05); 82 + padding: 0.125rem 0.25rem; 83 + border-radius: 3px; 84 + font-size: 0.9em; 85 + } 86 + 87 + pre { 88 + overflow-x: auto; 89 + margin-bottom: 1rem; 90 + } 91 + 92 + pre code { 93 + display: block; 94 + padding: 1rem; 95 + background-color: rgba(0, 0, 0, 0.03); 96 + border-radius: 5px; 97 + } 98 + 99 + /* Math */ 100 + .math { 101 + font-family: var(--font-mono); 102 + } 103 + 104 + .math-display { 105 + display: block; 106 + margin: 1rem 0; 107 + text-align: center; 108 + } 109 + 110 + /* Blockquotes */ 111 + blockquote { 112 + border-left: 4px solid var(--color-link); 113 + padding-left: 1rem; 114 + margin: 1rem 0; 115 + font-style: italic; 116 + } 117 + 118 + /* Tables */ 119 + table { 120 + border-collapse: collapse; 121 + width: 100%; 122 + margin-bottom: 1rem; 123 + } 124 + 125 + th, td { 126 + border: 1px solid rgba(0, 0, 0, 0.1); 127 + padding: 0.5rem; 128 + text-align: left; 129 + } 130 + 131 + th { 132 + background-color: rgba(0, 0, 0, 0.05); 133 + font-weight: 600; 134 + } 135 + 136 + /* Footnotes */ 137 + .footnote-reference { 138 + font-size: 0.8em; 139 + } 140 + 141 + .footnote-definition { 142 + margin-top: 2rem; 143 + padding-top: 0.5rem; 144 + border-top: 1px solid rgba(0, 0, 0, 0.1); 145 + font-size: 0.9em; 146 + } 147 + 148 + .footnote-definition-label { 149 + font-weight: 600; 150 + margin-right: 0.5rem; 151 + } 152 + 153 + /* Horizontal Rule */ 154 + hr { 155 + border: none; 156 + border-top: 1px solid rgba(0, 0, 0, 0.1); 157 + margin: 2rem 0; 158 + }
+88
essay/css/syntax.css
··· 1 + /* 2 + * theme "Rosé Pine" generated by syntect 3 + */ 4 + 5 + .wvrcode-code { 6 + color: #e0def4; 7 + background-color: #191724; 8 + } 9 + 10 + .wvrcode-comment { 11 + color: #908caa; 12 + font-style: italic; 13 + } 14 + .wvrcode-string, .wvrcode-punctuation.wvrcode-definition.wvrcode-string { 15 + color: #f6c177; 16 + } 17 + .wvrcode-constant.wvrcode-numeric { 18 + color: #f6c177; 19 + } 20 + .wvrcode-constant.wvrcode-language { 21 + color: #f6c177; 22 + font-weight: bold; 23 + } 24 + .wvrcode-constant.wvrcode-character, .wvrcode-constant.wvrcode-other { 25 + color: #f6c177; 26 + } 27 + .wvrcode-variable { 28 + color: #e0def4; 29 + font-style: italic; 30 + } 31 + .wvrcode-keyword { 32 + color: #31748f; 33 + } 34 + .wvrcode-storage { 35 + color: #9ccfd8; 36 + } 37 + .wvrcode-storage.wvrcode-type { 38 + color: #9ccfd8; 39 + } 40 + .wvrcode-entity.wvrcode-name.wvrcode-class { 41 + color: #31748f; 42 + font-weight: bold; 43 + } 44 + .wvrcode-entity.wvrcode-other.wvrcode-inherited-class { 45 + color: #31748f; 46 + font-style: italic; 47 + } 48 + .wvrcode-entity.wvrcode-name.wvrcode-function { 49 + color: #ebbcba; 50 + font-style: italic; 51 + } 52 + .wvrcode-variable.wvrcode-parameter { 53 + color: #c4a7e7; 54 + } 55 + .wvrcode-entity.wvrcode-name.wvrcode-tag { 56 + color: #31748f; 57 + font-weight: bold; 58 + } 59 + .wvrcode-entity.wvrcode-other.wvrcode-attribute-name { 60 + color: #c4a7e7; 61 + } 62 + .wvrcode-support.wvrcode-function { 63 + color: #ebbcba; 64 + font-weight: bold; 65 + } 66 + .wvrcode-support.wvrcode-constant { 67 + color: #f6c177; 68 + font-weight: bold; 69 + } 70 + .wvrcode-support.wvrcode-type, .wvrcode-support.wvrcode-class { 71 + color: #9ccfd8; 72 + font-weight: bold; 73 + } 74 + .wvrcode-support.wvrcode-other.wvrcode-variable { 75 + color: #eb6f92; 76 + font-weight: bold; 77 + } 78 + .wvrcode-invalid { 79 + color: #e0def4; 80 + background-color: #eb6f92; 81 + } 82 + .wvrcode-invalid.wvrcode-deprecated { 83 + color: #e0def4; 84 + background-color: #c4a7e7; 85 + } 86 + .wvrcode-punctuation, .wvrcode-keyword.wvrcode-operator { 87 + color: #908caa; 88 + }
+12
essay/entry/Features/Allocator.html
··· 1 + <!DOCTYPE html> 2 + <html lang="en"> 3 + <head> 4 + <meta charset="utf-8"> 5 + <meta name="viewport" content="width=device-width, initial-scale=1"> 6 + <title>Allocator</title> 7 + <link rel="stylesheet" href="../..//css/base.css"> 8 + <link rel="stylesheet" href="../..//css/syntax.css"> 9 + </head> 10 + <body> 11 + </body> 12 + </html>
+204
essay/entry/Features/Effects.html
··· 1 + <!DOCTYPE html> 2 + <html lang="en"> 3 + <head> 4 + <meta charset="utf-8"> 5 + <meta name="viewport" content="width=device-width, initial-scale=1"> 6 + <title>Effects</title> 7 + <link rel="stylesheet" href="../..//css/base.css"> 8 + <link rel="stylesheet" href="../..//css/syntax.css"> 9 + </head> 10 + <body> 11 + <h2>Overview</h2> 12 + <p>Alloy's effect system provides explicit tracking of side effects at the type level. This allows for better reasoning about code behavior and enables powerful optimizations while maintaining clarity about what a function can do.</p> 13 + <h2>Core Concepts</h2> 14 + <h3>Effect Declaration</h3> 15 + <p>Effects are declared using the <code>effect</code> keyword:</p> 16 + <pre><code class="language-Rust"><span class="wvrcode-source wvrcode-rust">effect <span class="wvrcode-constant wvrcode-other wvrcode-rust">IO</span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 17 + <span class="wvrcode-support wvrcode-function wvrcode-rust">read_line</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> String 18 + print<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>String<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span> 19 + </span></span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 20 + 21 + effect State<span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">[</span>T<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">]</span></span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 22 + <span class="wvrcode-support wvrcode-function wvrcode-rust">get</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> T 23 + set<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>T<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span> 24 + </span></span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 25 + 26 + effect Random <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 27 + <span class="wvrcode-support wvrcode-function wvrcode-rust">next_int</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>min<span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> <span class="wvrcode-storage wvrcode-type wvrcode-rust">i32</span><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">,</span> max<span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> <span class="wvrcode-storage wvrcode-type wvrcode-rust">i32</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> <span class="wvrcode-storage wvrcode-type wvrcode-rust">i32</span> 28 + </span></span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 29 + </span></code></pre> 30 + <h3>Using Effects</h3> 31 + <p>Functions must declare which effects they use with the <code>with</code> keyword:</p> 32 + <pre><code class="language-Rust"><span class="wvrcode-source wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">get_user_name</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> String with IO</span> </span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 33 + <span class="wvrcode-support wvrcode-function wvrcode-rust">print</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-string wvrcode-quoted wvrcode-double wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-begin wvrcode-rust">&quot;</span>Enter your name: <span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-end wvrcode-rust">&quot;</span></span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 34 + <span class="wvrcode-support wvrcode-function wvrcode-rust">read_line</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 35 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 36 + 37 + <span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">generate_id</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> <span class="wvrcode-storage wvrcode-type wvrcode-rust">i32</span> with Random</span> </span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 38 + <span class="wvrcode-support wvrcode-function wvrcode-rust">next_int</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-constant wvrcode-numeric wvrcode-integer wvrcode-decimal wvrcode-rust">0</span><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">,</span> <span class="wvrcode-constant wvrcode-numeric wvrcode-integer wvrcode-decimal wvrcode-rust">1000</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 39 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 40 + </span></code></pre> 41 + <h3>Multiple Effects</h3> 42 + <p>Functions can use multiple effects:</p> 43 + <pre><code class="language-Rust"><span class="wvrcode-source wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">interactive_random</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> <span class="wvrcode-storage wvrcode-type wvrcode-rust">i32</span> with IO</span></span><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">,</span> Random <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 44 + <span class="wvrcode-support wvrcode-function wvrcode-rust">print</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-string wvrcode-quoted wvrcode-double wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-begin wvrcode-rust">&quot;</span>Generating a random number...<span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-end wvrcode-rust">&quot;</span></span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 45 + <span class="wvrcode-storage wvrcode-type wvrcode-rust">let</span> num <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> <span class="wvrcode-support wvrcode-function wvrcode-rust">next_int</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-constant wvrcode-numeric wvrcode-integer wvrcode-decimal wvrcode-rust">0</span><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">,</span> <span class="wvrcode-constant wvrcode-numeric wvrcode-integer wvrcode-decimal wvrcode-rust">100</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 46 + <span class="wvrcode-support wvrcode-function wvrcode-rust">print</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-string wvrcode-quoted wvrcode-double wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-begin wvrcode-rust">&quot;</span>Generated: {num}<span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-end wvrcode-rust">&quot;</span></span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 47 + num 48 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 49 + </span></code></pre> 50 + <h3>Effect Handlers</h3> 51 + <p>Effects are implemented using handlers:</p> 52 + <pre><code class="language-Rust"><span class="wvrcode-source wvrcode-rust">handler ConsoleIO <span class="wvrcode-keyword wvrcode-control wvrcode-rust">for</span> <span class="wvrcode-constant wvrcode-other wvrcode-rust">IO</span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 53 + <span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">read_line</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> String</span> </span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 54 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Implementation using actual console I/O 55 + </span> </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 56 + 57 + <span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">print</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-variable wvrcode-parameter wvrcode-rust">message</span><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> String</span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> </span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 58 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Implementation using actual console I/O 59 + </span> </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 60 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 61 + 62 + handler TestIO <span class="wvrcode-keyword wvrcode-control wvrcode-rust">for</span> <span class="wvrcode-constant wvrcode-other wvrcode-rust">IO</span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 63 + <span class="wvrcode-storage wvrcode-type wvrcode-rust">let</span> <span class="wvrcode-storage wvrcode-modifier wvrcode-rust">mut</span> inputs<span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> <span class="wvrcode-support wvrcode-type wvrcode-rust">Vec</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">[</span><span class="wvrcode-support wvrcode-type wvrcode-rust">String</span><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">]</span></span> 64 + <span class="wvrcode-storage wvrcode-type wvrcode-rust">let</span> <span class="wvrcode-storage wvrcode-modifier wvrcode-rust">mut</span> outputs<span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> <span class="wvrcode-support wvrcode-type wvrcode-rust">Vec</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">[</span><span class="wvrcode-support wvrcode-type wvrcode-rust">String</span><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">]</span></span> 65 + 66 + <span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">read_line</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> String</span> </span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 67 + inputs.<span class="wvrcode-support wvrcode-function wvrcode-rust">pop</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span>.<span class="wvrcode-support wvrcode-function wvrcode-rust">unwrap_or</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-string wvrcode-quoted wvrcode-double wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-begin wvrcode-rust">&quot;</span>Test Input<span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-end wvrcode-rust">&quot;</span></span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 68 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 69 + 70 + <span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">print</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-variable wvrcode-parameter wvrcode-rust">message</span><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> String</span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> </span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 71 + outputs.<span class="wvrcode-support wvrcode-function wvrcode-rust">push</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>messages</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 72 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 73 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 74 + </span></code></pre> 75 + <h3>Running with Effects</h3> 76 + <p>Use the <code>run</code> keyword to execute code with effect handlers:</p> 77 + <pre><code class="language-Rust"><span class="wvrcode-source wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">main</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> </span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 78 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Using real I/O 79 + </span> run with ConsoleIO <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 80 + <span class="wvrcode-storage wvrcode-type wvrcode-rust">let</span> name <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> <span class="wvrcode-support wvrcode-function wvrcode-rust">get_user_name</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 81 + <span class="wvrcode-support wvrcode-function wvrcode-rust">print</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-string wvrcode-quoted wvrcode-double wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-begin wvrcode-rust">&quot;</span>Hello, {name}!<span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-end wvrcode-rust">&quot;</span></span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 82 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 83 + 84 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Using test I/O 85 + </span> <span class="wvrcode-storage wvrcode-type wvrcode-rust">let</span> test_io <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> TestIO <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 86 + inputs<span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> <span class="wvrcode-support wvrcode-macro wvrcode-rust">vec!</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">[</span><span class="wvrcode-string wvrcode-quoted wvrcode-double wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-begin wvrcode-rust">&quot;</span>Test User<span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-end wvrcode-rust">&quot;</span></span><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">]</span></span><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">,</span> 87 + outputs<span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> <span class="wvrcode-support wvrcode-macro wvrcode-rust">vec!</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">[</span><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">]</span></span> 88 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 89 + 90 + run with test_io <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 91 + <span class="wvrcode-storage wvrcode-type wvrcode-rust">let</span> name <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> <span class="wvrcode-support wvrcode-function wvrcode-rust">get_user_name</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 92 + <span class="wvrcode-support wvrcode-function wvrcode-rust">print</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-string wvrcode-quoted wvrcode-double wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-begin wvrcode-rust">&quot;</span>Hello, {name}!<span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-end wvrcode-rust">&quot;</span></span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 93 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 94 + 95 + <span class="wvrcode-support wvrcode-function wvrcode-rust">assert_eq</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>test_io.outputs<span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">,</span> <span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">[</span><span class="wvrcode-string wvrcode-quoted wvrcode-double wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-begin wvrcode-rust">&quot;</span>Enter your name: <span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-end wvrcode-rust">&quot;</span></span><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">,</span> <span class="wvrcode-string wvrcode-quoted wvrcode-double wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-begin wvrcode-rust">&quot;</span>Hello, Test User!<span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-end wvrcode-rust">&quot;</span></span><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">]</span></span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 96 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 97 + </span></code></pre> 98 + <h2>Effect Composition</h2> 99 + <h3>Combining Effects</h3> 100 + <pre><code class="language-Rust"><span class="wvrcode-source wvrcode-rust">effect Logger <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 101 + <span class="wvrcode-support wvrcode-function wvrcode-rust">log</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>message<span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> <span class="wvrcode-support wvrcode-type wvrcode-rust">String</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 102 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 103 + 104 + effect Database <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 105 + <span class="wvrcode-support wvrcode-function wvrcode-rust">query</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>sql<span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> <span class="wvrcode-support wvrcode-type wvrcode-rust">String</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> Result</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">[</span>Row<span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">,</span> DbError<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">]</span></span> 106 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 107 + 108 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Combined effect handler 109 + </span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">process_user</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> Result</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">[</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">,</span> Error<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">]</span></span> with Logger<span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">,</span> Database<span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">,</span> <span class="wvrcode-constant wvrcode-other wvrcode-rust">IO</span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 110 + <span class="wvrcode-support wvrcode-function wvrcode-rust">log</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-string wvrcode-quoted wvrcode-double wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-begin wvrcode-rust">&quot;</span>Starting user processing<span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-end wvrcode-rust">&quot;</span></span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 111 + <span class="wvrcode-storage wvrcode-type wvrcode-rust">let</span> user <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> <span class="wvrcode-keyword wvrcode-control wvrcode-rust">match</span> <span class="wvrcode-support wvrcode-function wvrcode-rust">query</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-string wvrcode-quoted wvrcode-double wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-begin wvrcode-rust">&quot;</span>SELECT * FROM users LIMIT 1<span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-end wvrcode-rust">&quot;</span></span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 112 + <span class="wvrcode-support wvrcode-type wvrcode-rust">Ok</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>row</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> row</span><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">,</span> 113 + <span class="wvrcode-support wvrcode-type wvrcode-rust">Err</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>e</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span></span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 114 + <span class="wvrcode-support wvrcode-function wvrcode-rust">log</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-string wvrcode-quoted wvrcode-double wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-begin wvrcode-rust">&quot;</span>Database error: {e}<span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-end wvrcode-rust">&quot;</span></span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 115 + <span class="wvrcode-keyword wvrcode-control wvrcode-rust">return</span> <span class="wvrcode-support wvrcode-type wvrcode-rust">Err</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>e.<span class="wvrcode-support wvrcode-function wvrcode-rust">into</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 116 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 117 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 118 + <span class="wvrcode-support wvrcode-function wvrcode-rust">print</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-string wvrcode-quoted wvrcode-double wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-begin wvrcode-rust">&quot;</span>Found user: {user.name}<span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-end wvrcode-rust">&quot;</span></span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 119 + <span class="wvrcode-support wvrcode-type wvrcode-rust">Ok</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 120 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 121 + </span></code></pre> 122 + <h3>Effect Polymorphism</h3> 123 + <pre><code class="language-Rust"><span class="wvrcode-source wvrcode-rust"><span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Generic over any effect that provides logging 124 + </span> 125 + <span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">audit</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">[</span>E<span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> Logger<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">]</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>action<span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> <span class="wvrcode-support wvrcode-type wvrcode-rust">String</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> <span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span> with E</span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 126 + <span class="wvrcode-support wvrcode-function wvrcode-rust">log</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-string wvrcode-quoted wvrcode-double wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-begin wvrcode-rust">&quot;</span>Audit: {action}<span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-end wvrcode-rust">&quot;</span></span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 127 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 128 + </span></code></pre> 129 + <h2>Best Practices</h2> 130 + <ol> 131 + <li><strong>Effect Granularity</strong></li> 132 + </ol> 133 + <ul> 134 + <li>Keep effects focused and single-purpose</li> 135 + <li>Split large effects into smaller, composable ones</li> 136 + </ul> 137 + <ol start="2"> 138 + <li><strong>Effect Isolation</strong></li> 139 + </ol> 140 + <ul> 141 + <li>Contain effects at the edges of your program</li> 142 + <li>Keep core logic pure when possible</li> 143 + </ul> 144 + <ol start="3"> 145 + <li><strong>Testing with Effects</strong></li> 146 + </ol> 147 + <ul> 148 + <li>Create test handlers for effects</li> 149 + <li>Use effect substitution to simulate different scenarios</li> 150 + </ul> 151 + <ol start="4"> 152 + <li><strong>Effect Documentation</strong></li> 153 + </ol> 154 + <ul> 155 + <li>Document effect requirements clearly</li> 156 + <li>Explain effect interactions in complex systems</li> 157 + </ul> 158 + <ol start="5"> 159 + <li><strong>Effect Performance</strong></li> 160 + </ol> 161 + <ul> 162 + <li>Group related effects to reduce handler overhead</li> 163 + <li>Consider effect batching for performance-critical code</li> 164 + </ul> 165 + <h2>Patterns</h2> 166 + <h3>The Reader Effect</h3> 167 + <pre><code class="language-Rust"><span class="wvrcode-source wvrcode-rust">effect Reader<span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">[</span>C<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">]</span></span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 168 + <span class="wvrcode-support wvrcode-function wvrcode-rust">ask</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> C 169 + </span></span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 170 + 171 + <span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">get_config</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">[</span>C<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">]</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> C with Reader</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">[</span>C<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">]</span></span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 172 + <span class="wvrcode-support wvrcode-function wvrcode-rust">ask</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 173 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 174 + 175 + <span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">use_config</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> String with Reader</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">[</span>Config<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">]</span></span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 176 + <span class="wvrcode-storage wvrcode-type wvrcode-rust">let</span> config <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> <span class="wvrcode-support wvrcode-function wvrcode-rust">ask</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 177 + config.base_url 178 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 179 + </span></code></pre> 180 + <h3>The Writer Effect</h3> 181 + <pre><code class="language-Rust"><span class="wvrcode-source wvrcode-rust">effect Writer<span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">[</span>W<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">]</span></span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 182 + <span class="wvrcode-support wvrcode-function wvrcode-rust">tell</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>W</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 183 + <span class="wvrcode-support wvrcode-function wvrcode-rust">clear</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 184 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 185 + 186 + <span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">log_action</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-variable wvrcode-parameter wvrcode-rust">action</span><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> String</span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> <span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span> with Writer</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">[</span><span class="wvrcode-support wvrcode-type wvrcode-rust">String</span><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">]</span></span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 187 + <span class="wvrcode-support wvrcode-function wvrcode-rust">tell</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-string wvrcode-quoted wvrcode-double wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-begin wvrcode-rust">&quot;</span>[{timestamp()}] {action}<span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-end wvrcode-rust">&quot;</span></span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 188 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 189 + </span></code></pre> 190 + <h3>Combining with Pipelines</h3> 191 + <pre><code class="language-Rust"><span class="wvrcode-source wvrcode-rust">effect Transform <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 192 + <span class="wvrcode-support wvrcode-function wvrcode-rust">validate</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-support wvrcode-type wvrcode-rust">String</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> Result</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">[</span><span class="wvrcode-support wvrcode-type wvrcode-rust">String</span><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">,</span> Error<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">]</span></span> 193 + <span class="wvrcode-support wvrcode-function wvrcode-rust">normalize</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-support wvrcode-type wvrcode-rust">String</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> String 194 + encrypt<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>String<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span> </span><span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> String 195 + </span></span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 196 + 197 + <span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">process_input</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-variable wvrcode-parameter wvrcode-rust">input</span><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> String</span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> Result</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">[</span><span class="wvrcode-support wvrcode-type wvrcode-rust">String</span><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">,</span> Error<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">]</span></span> with Transform <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 198 + input 199 + <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">|</span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">&gt;</span> <span class="wvrcode-support wvrcode-function wvrcode-rust">validate</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 200 + <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">|</span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">&gt;</span> <span class="wvrcode-support wvrcode-function wvrcode-rust">map</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>normalize</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 201 + <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">|</span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">&gt;</span> <span class="wvrcode-support wvrcode-function wvrcode-rust">map</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>encrypt</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 202 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 203 + </span></code></pre></body> 204 + </html>
+211
essay/entry/Features/Traits.html
··· 1 + <!DOCTYPE html> 2 + <html lang="en"> 3 + <head> 4 + <meta charset="utf-8"> 5 + <meta name="viewport" content="width=device-width, initial-scale=1"> 6 + <title>Traits</title> 7 + <link rel="stylesheet" href="../..//css/base.css"> 8 + <link rel="stylesheet" href="../..//css/syntax.css"> 9 + </head> 10 + <body> 11 + <h1>Trait System Guide</h1> 12 + <h2>Overview</h2> 13 + <p>Alloy's trait system builds on Rust's traits while adding powerful features like default implementations, template control, and better composition patterns.</p> 14 + <h2>Core Concepts</h2> 15 + <p>The basics follow Rust closely</p> 16 + <h3>Basic Trait Declaration</h3> 17 + <pre><code class="language-Rust"><span class="wvrcode-source wvrcode-rust"><span class="wvrcode-meta wvrcode-trait wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-trait wvrcode-rust">trait</span> <span class="wvrcode-entity wvrcode-name wvrcode-trait wvrcode-rust">Display</span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 18 + <span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">display</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-variable wvrcode-parameter wvrcode-rust">self</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> String </span><span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Note: no semicolon 19 + </span></span></span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 20 + </span></code></pre> 21 + <h3>Implementation</h3> 22 + <pre><code class="language-Rust"><span class="wvrcode-source wvrcode-rust"><span class="wvrcode-meta wvrcode-struct wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-struct wvrcode-rust">struct</span> </span><span class="wvrcode-meta wvrcode-struct wvrcode-rust"><span class="wvrcode-entity wvrcode-name wvrcode-struct wvrcode-rust">Point</span> </span><span class="wvrcode-meta wvrcode-struct wvrcode-rust"><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 23 + <span class="wvrcode-variable wvrcode-other wvrcode-member wvrcode-rust">x</span><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> <span class="wvrcode-storage wvrcode-type wvrcode-rust">f64</span> 24 + y<span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> <span class="wvrcode-storage wvrcode-type wvrcode-rust">f64</span> 25 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 26 + 27 + <span class="wvrcode-meta wvrcode-impl wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-impl wvrcode-rust">impl</span> </span><span class="wvrcode-meta wvrcode-impl wvrcode-rust">Display <span class="wvrcode-keyword wvrcode-other wvrcode-rust">for</span></span><span class="wvrcode-meta wvrcode-impl wvrcode-rust"> <span class="wvrcode-entity wvrcode-name wvrcode-impl wvrcode-rust">Point</span> </span><span class="wvrcode-meta wvrcode-impl wvrcode-rust"><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 28 + <span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">display</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-variable wvrcode-parameter wvrcode-rust">self</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> String</span> </span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 29 + <span class="wvrcode-string wvrcode-quoted wvrcode-double wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-begin wvrcode-rust">&quot;</span>({self.x}, {self.y})<span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-end wvrcode-rust">&quot;</span></span> <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Alloy builds formatting into Strings 30 + </span> </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 31 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 32 + </span></code></pre> 33 + <h3>Generic Traits</h3> 34 + <pre><code class="language-Rust"><span class="wvrcode-source wvrcode-rust"><span class="wvrcode-meta wvrcode-trait wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-trait wvrcode-rust">trait</span> <span class="wvrcode-entity wvrcode-name wvrcode-trait wvrcode-rust">Container</span>[T] <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Alloy uses [] rather than &lt; &gt; for type parameters 35 + </span> <span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">add</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-variable wvrcode-parameter wvrcode-rust">self</span>, <span class="wvrcode-variable wvrcode-parameter wvrcode-rust">item</span><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> T</span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> 36 + </span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">remove</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-variable wvrcode-parameter wvrcode-rust">self</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> Option</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">[</span>T<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">]</span></span> 37 + <span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">is_empty</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-variable wvrcode-parameter wvrcode-rust">self</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> <span class="wvrcode-storage wvrcode-type wvrcode-rust">bool</span> 38 + </span></span></span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 39 + 40 + <span class="wvrcode-meta wvrcode-impl wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-impl wvrcode-rust">impl</span></span><span class="wvrcode-meta wvrcode-impl wvrcode-rust">[<span class="wvrcode-entity wvrcode-name wvrcode-impl wvrcode-rust">T</span>] <span class="wvrcode-entity wvrcode-name wvrcode-impl wvrcode-rust">Container</span>[<span class="wvrcode-entity wvrcode-name wvrcode-impl wvrcode-rust">T</span>] <span class="wvrcode-entity wvrcode-name wvrcode-impl wvrcode-rust">for</span> <span class="wvrcode-entity wvrcode-name wvrcode-impl wvrcode-rust">Stack</span>[<span class="wvrcode-entity wvrcode-name wvrcode-impl wvrcode-rust">T</span>] </span><span class="wvrcode-meta wvrcode-impl wvrcode-rust"><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 41 + <span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">add</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-variable wvrcode-parameter wvrcode-rust">self</span>, <span class="wvrcode-variable wvrcode-parameter wvrcode-rust">item</span><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> T</span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> </span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 42 + <span class="wvrcode-variable wvrcode-language wvrcode-rust">self</span>.<span class="wvrcode-support wvrcode-function wvrcode-rust">push</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>item</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 43 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 44 + 45 + <span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">remove</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-variable wvrcode-parameter wvrcode-rust">self</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> Option</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">[</span>T<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">]</span></span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 46 + <span class="wvrcode-variable wvrcode-language wvrcode-rust">self</span>.<span class="wvrcode-support wvrcode-function wvrcode-rust">pop</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 47 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 48 + 49 + <span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">is_empty</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-variable wvrcode-parameter wvrcode-rust">self</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> <span class="wvrcode-storage wvrcode-type wvrcode-rust">bool</span></span> </span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 50 + <span class="wvrcode-variable wvrcode-language wvrcode-rust">self</span>.<span class="wvrcode-support wvrcode-function wvrcode-rust">len</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> <span class="wvrcode-constant wvrcode-numeric wvrcode-integer wvrcode-decimal wvrcode-rust">0</span> 51 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 52 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 53 + </span></code></pre> 54 + <h2>Features</h2> 55 + <h3>Default Implementations</h3> 56 + <p>Like in Rust, traits in Alloy can contain a mix of methods which include a default implementation and ones which require the implementer to provide an implementation.</p> 57 + <pre><code class="language-Rust"><span class="wvrcode-source wvrcode-rust"><span class="wvrcode-meta wvrcode-trait wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-trait wvrcode-rust">trait</span> <span class="wvrcode-entity wvrcode-name wvrcode-trait wvrcode-rust">Collection</span>[T] <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 58 + <span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">is_empty</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-variable wvrcode-parameter wvrcode-rust">self</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> <span class="wvrcode-storage wvrcode-type wvrcode-rust">bool</span></span> </span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 59 + <span class="wvrcode-variable wvrcode-language wvrcode-rust">self</span>.<span class="wvrcode-support wvrcode-function wvrcode-rust">len</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> <span class="wvrcode-constant wvrcode-numeric wvrcode-integer wvrcode-decimal wvrcode-rust">0</span> 60 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 61 + 62 + <span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">len</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-variable wvrcode-parameter wvrcode-rust">self</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> <span class="wvrcode-storage wvrcode-type wvrcode-rust">usize</span> 63 + 64 + fn contains<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>self, item: T<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span> </span><span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> <span class="wvrcode-storage wvrcode-type wvrcode-rust">bool</span></span> </span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 65 + <span class="wvrcode-variable wvrcode-language wvrcode-rust">self</span>.<span class="wvrcode-support wvrcode-function wvrcode-rust">into_iter</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span>.any <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> x <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">in</span> x <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> item </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 66 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 67 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 68 + </span></code></pre> 69 + <h3>Trait Defaults</h3> 70 + <p>Unlike in Rust, associated types in Alloy can carry a default value. Sensible defaults make writing simple things easy, without losing any flexibility.</p> 71 + <pre><code class="language-Rust"><span class="wvrcode-source wvrcode-rust"><span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Define a trait with a default implementation strategy 72 + </span><span class="wvrcode-meta wvrcode-trait wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-trait wvrcode-rust">trait</span> <span class="wvrcode-entity wvrcode-name wvrcode-trait wvrcode-rust">ToString</span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 73 + default <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> JsonString 74 + <span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">to_string</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-variable wvrcode-parameter wvrcode-rust">self</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> String 75 + </span></span></span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 76 + 77 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Implementations can override the default 78 + </span><span class="wvrcode-meta wvrcode-impl wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-impl wvrcode-rust">impl</span> </span><span class="wvrcode-meta wvrcode-impl wvrcode-rust">ToString <span class="wvrcode-keyword wvrcode-other wvrcode-rust">for</span></span><span class="wvrcode-meta wvrcode-impl wvrcode-rust"> <span class="wvrcode-entity wvrcode-name wvrcode-impl wvrcode-rust">CustomType</span> </span><span class="wvrcode-meta wvrcode-impl wvrcode-rust"><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 79 + <span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">to_string</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-variable wvrcode-parameter wvrcode-rust">self</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> String</span> </span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 80 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Custom implementation 81 + </span> </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 82 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 83 + 84 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Or use the default 85 + </span><span class="wvrcode-meta wvrcode-impl wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-impl wvrcode-rust">impl</span> </span><span class="wvrcode-meta wvrcode-impl wvrcode-rust">ToString <span class="wvrcode-keyword wvrcode-other wvrcode-rust">for</span></span><span class="wvrcode-meta wvrcode-impl wvrcode-rust"> <span class="wvrcode-entity wvrcode-name wvrcode-impl wvrcode-rust">SimpleType</span> <span class="wvrcode-entity wvrcode-name wvrcode-impl wvrcode-rust">default</span> 86 + </span></span></code></pre> 87 + <h3>Template Control</h3> 88 + <p>Defaults allow more organic composition and make code simpler.</p> 89 + <pre><code class="language-Rust"><span class="wvrcode-source wvrcode-rust"><span class="wvrcode-meta wvrcode-trait wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-trait wvrcode-rust">trait</span> <span class="wvrcode-entity wvrcode-name wvrcode-trait wvrcode-rust">Serialize</span>[Format] <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 90 + default Format <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> Json 91 + <span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">serialize</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-variable wvrcode-parameter wvrcode-rust">self</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> String 92 + </span></span></span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 93 + 94 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Use default format 95 + </span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">save</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">[</span>T<span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> Serialize<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">]</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>item<span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> T</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 96 + item.<span class="wvrcode-support wvrcode-function wvrcode-rust">serialize</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Uses Json format 97 + </span></span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 98 + 99 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Override default format 100 + </span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">save_xml</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">[</span>T<span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> Serialize<span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">[</span>Xml<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">]</span></span><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">]</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>item<span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> T</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 101 + item.<span class="wvrcode-support wvrcode-function wvrcode-rust">serialize</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Uses XML format 102 + </span></span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 103 + </span></code></pre> 104 + <h3>Conditional Implementation</h3> 105 + <pre><code class="language-Rust"><span class="wvrcode-source wvrcode-rust"><span class="wvrcode-meta wvrcode-impl wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-impl wvrcode-rust">impl</span></span><span class="wvrcode-meta wvrcode-impl wvrcode-rust">[<span class="wvrcode-entity wvrcode-name wvrcode-impl wvrcode-rust">T</span>: <span class="wvrcode-entity wvrcode-name wvrcode-impl wvrcode-rust">Display</span>] <span class="wvrcode-entity wvrcode-name wvrcode-impl wvrcode-rust">Display</span> <span class="wvrcode-entity wvrcode-name wvrcode-impl wvrcode-rust">for</span> <span class="wvrcode-entity wvrcode-name wvrcode-impl wvrcode-rust">Option</span>[<span class="wvrcode-entity wvrcode-name wvrcode-impl wvrcode-rust">T</span>] </span><span class="wvrcode-meta wvrcode-impl wvrcode-rust"><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 106 + <span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">display</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-variable wvrcode-parameter wvrcode-rust">self</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> String</span> </span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 107 + <span class="wvrcode-keyword wvrcode-control wvrcode-rust">match</span> <span class="wvrcode-variable wvrcode-language wvrcode-rust">self</span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 108 + <span class="wvrcode-support wvrcode-type wvrcode-rust">Some</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>value</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> value</span>.<span class="wvrcode-support wvrcode-function wvrcode-rust">display</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 109 + <span class="wvrcode-support wvrcode-type wvrcode-rust">None</span> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> </span><span class="wvrcode-string wvrcode-quoted wvrcode-double wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-begin wvrcode-rust">&quot;</span>None<span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-end wvrcode-rust">&quot;</span></span> 110 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 111 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 112 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 113 + </span></code></pre> 114 + <p>The above snippet, if not defined in either the same crate as Display or the same crate as Option[T], would require a newtype wrapper in Rust due to the orphan rule, and a bunch of extra boilerplate to make it behave nicely. Alloy either avoids or elides all that for you. Types are types and traits are traits, and you should be able to work with them as you wish. The compiler will attempt to resolve them and handle any possible conflicts as expected, without surprises, but if it cannot, or if you want to choose the implementation, you can specify.</p> 115 + <h3>Trait Composition</h3> 116 + <p>Traits can also be composed quite freely using a few simple operators, to build up more complex types, in a way that is easy to understand.</p> 117 + <pre><code class="language-Rust"><span class="wvrcode-source wvrcode-rust"><span class="wvrcode-meta wvrcode-trait wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-trait wvrcode-rust">trait</span> <span class="wvrcode-entity wvrcode-name wvrcode-trait wvrcode-rust">Identified</span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 118 + <span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">id</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-variable wvrcode-parameter wvrcode-rust">self</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> <span class="wvrcode-storage wvrcode-type wvrcode-rust">usize</span> 119 + </span></span></span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 120 + 121 + <span class="wvrcode-meta wvrcode-trait wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-trait wvrcode-rust">trait</span> <span class="wvrcode-entity wvrcode-name wvrcode-trait wvrcode-rust">Named</span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 122 + <span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">name</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-variable wvrcode-parameter wvrcode-rust">self</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> String 123 + </span></span></span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 124 + 125 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Compose traits 126 + </span><span class="wvrcode-meta wvrcode-trait wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-trait wvrcode-rust">trait</span> <span class="wvrcode-entity wvrcode-name wvrcode-trait wvrcode-rust">Entity</span> = Identified + Named <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 127 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Additional requirements can be added 128 + </span> <span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">describe</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-variable wvrcode-parameter wvrcode-rust">self</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> String</span> </span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 129 + <span class="wvrcode-string wvrcode-quoted wvrcode-double wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-begin wvrcode-rust">&quot;</span>{self.id()}: {self.name()}<span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-end wvrcode-rust">&quot;</span></span> 130 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 131 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 132 + 133 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Misha can you check my syntax here? 134 + </span><span class="wvrcode-meta wvrcode-trait wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-trait wvrcode-rust">trait</span> <span class="wvrcode-entity wvrcode-name wvrcode-trait wvrcode-rust">Component</span> = Identified + !Named <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Marker trait 135 + </span> 136 + trait GameObject = Entity | Component <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 137 + <span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">describe</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-variable wvrcode-parameter wvrcode-rust">self</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> String</span> </span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 138 + <span class="wvrcode-keyword wvrcode-control wvrcode-rust">match</span> <span class="wvrcode-invalid wvrcode-illegal wvrcode-rust">typeof</span> <span class="wvrcode-variable wvrcode-language wvrcode-rust">self</span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 139 + Entity <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> <span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>self as Entity<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span>.<span class="wvrcode-support wvrcode-function wvrcode-rust">describe</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 140 + Component <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> </span><span class="wvrcode-string wvrcode-quoted wvrcode-double wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-begin wvrcode-rust">&quot;</span>{(self as Identified).id()}<span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-end wvrcode-rust">&quot;</span></span> 141 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 142 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 143 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 144 + </span></code></pre> 145 + <h2>Best Practices</h2> 146 + <ol> 147 + <li><strong>Trait Cohesion</strong></li> 148 + </ol> 149 + <ul> 150 + <li>Keep traits focused on a single responsibility</li> 151 + <li>Use composition for complex behaviors</li> 152 + </ul> 153 + <ol start="2"> 154 + <li><strong>Default Implementations</strong></li> 155 + </ol> 156 + <ul> 157 + <li>Provide sensible defaults when possible</li> 158 + <li>Make defaults efficient and general</li> 159 + </ul> 160 + <ol start="3"> 161 + <li><strong>Template Defaults</strong></li> 162 + </ol> 163 + <ul> 164 + <li>Choose widely applicable defaults</li> 165 + <li>Document default behavior clearly</li> 166 + </ul> 167 + <ol start="4"> 168 + <li><strong>Trait Bounds</strong></li> 169 + </ol> 170 + <ul> 171 + <li>Use minimal trait bounds</li> 172 + <li>Prefer composition over complex bounds</li> 173 + </ul> 174 + <ol start="5"> 175 + <li><strong>Documentation</strong></li> 176 + </ol> 177 + <ul> 178 + <li>Document required behavior clearly</li> 179 + <li>Explain performance characteristics</li> 180 + </ul> 181 + <h2>Patterns</h2> 182 + <h3>Builder Pattern</h3> 183 + <pre><code class="language-Rust"><span class="wvrcode-source wvrcode-rust"><span class="wvrcode-meta wvrcode-trait wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-trait wvrcode-rust">trait</span> <span class="wvrcode-entity wvrcode-name wvrcode-trait wvrcode-rust">Builder</span>[T] <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 184 + <span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">build</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-variable wvrcode-parameter wvrcode-rust">self</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> Result</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">[</span>T<span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">,</span> BuildError<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">]</span></span> 185 + 186 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Optional steps with defaults 187 + </span> <span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">with_name</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-variable wvrcode-parameter wvrcode-rust">self</span>, <span class="wvrcode-variable wvrcode-parameter wvrcode-rust">name</span><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> String</span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> <span class="wvrcode-storage wvrcode-type wvrcode-rust">Self</span></span> </span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 188 + <span class="wvrcode-variable wvrcode-language wvrcode-rust">self</span> 189 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 190 + 191 + <span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">with_id</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-variable wvrcode-parameter wvrcode-rust">self</span>, <span class="wvrcode-variable wvrcode-parameter wvrcode-rust">id</span><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> <span class="wvrcode-storage wvrcode-type wvrcode-rust">usize</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> <span class="wvrcode-storage wvrcode-type wvrcode-rust">Self</span></span> </span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 192 + <span class="wvrcode-variable wvrcode-language wvrcode-rust">self</span> 193 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 194 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 195 + </span></code></pre> 196 + <h3>Type State Pattern</h3> 197 + <pre><code class="language-Rust"><span class="wvrcode-source wvrcode-rust"><span class="wvrcode-meta wvrcode-trait wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-trait wvrcode-rust">trait</span> <span class="wvrcode-entity wvrcode-name wvrcode-trait wvrcode-rust">State</span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 198 + <span class="wvrcode-storage wvrcode-type wvrcode-type wvrcode-rust">type</span> <span class="wvrcode-entity wvrcode-name wvrcode-type wvrcode-rust">Next</span><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> State 199 + <span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">transition</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-variable wvrcode-parameter wvrcode-rust">self</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> Next 200 + </span></span></span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 201 + 202 + 203 + implement State <span class="wvrcode-keyword wvrcode-control wvrcode-rust">for</span> Draft <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 204 + <span class="wvrcode-storage wvrcode-type wvrcode-type wvrcode-rust">type</span> <span class="wvrcode-entity wvrcode-name wvrcode-type wvrcode-rust">Next</span> <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> Review 205 + 206 + <span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">transition</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-variable wvrcode-parameter wvrcode-rust">self</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> Review</span> </span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 207 + <span class="wvrcode-meta wvrcode-path wvrcode-rust">Review<span class="wvrcode-punctuation wvrcode-accessor wvrcode-rust">::</span></span>new<span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-variable wvrcode-language wvrcode-rust">self</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 208 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 209 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 210 + </span></code></pre></body> 211 + </html>
+86
essay/entry/Language Overview.html
··· 1 + <!DOCTYPE html> 2 + <html lang="en"> 3 + <head> 4 + <meta charset="utf-8"> 5 + <meta name="viewport" content="width=device-width, initial-scale=1"> 6 + <title>Language Overview</title> 7 + <link rel="stylesheet" href="..//css/base.css"> 8 + <link rel="stylesheet" href="..//css/syntax.css"> 9 + </head> 10 + <body> 11 + <p><code>.ac</code> file extension</p> 12 + <h2>Design Philosophy</h2> 13 + <h3>Safety First</h3> 14 + <ul> 15 + <li>Thread-safe by default through Arc</li> 16 + <li>Immutable by default</li> 17 + <li>Explicit effect tracking</li> 18 + <li>Comprehensive compile-time checks</li> 19 + <li>No unsafe blocks</li> 20 + </ul> 21 + <h3>Performance</h3> 22 + <ul> 23 + <li>Zero-cost abstractions where possible</li> 24 + <li>Predictable performance</li> 25 + <li>Efficient compilation to Rust</li> 26 + <li>Optional no-atomic reference counting for embedded systems</li> 27 + <li>Effect system enables compile-time optimizations</li> 28 + </ul> 29 + <h3>Ergonomics</h3> 30 + <ul> 31 + <li>Clear, readable syntax</li> 32 + <li>Powerful type inference</li> 33 + <li>Pipeline operator for fluid data transformation</li> 34 + <li>Pattern matching with exhaustive checking</li> 35 + <li>Trailing closure syntax</li> 36 + </ul> 37 + <h2>Key Features</h2> 38 + <h3>Type System</h3> 39 + <ul> 40 + <li>Strong static typing with powerful type inference</li> 41 + <li>Union types and type narrowing from TypeScript</li> 42 + <li>Advanced trait system with defaults and template control</li> 43 + <li>Square brackets <code>[]</code> for generics/templates instead of angle brackets</li> 44 + <li>Algebraic data types with pattern matching</li> 45 + <li>Optional chaining and null coalescing operators from Swift</li> 46 + </ul> 47 + <pre><code class="language-Rust"><span class="wvrcode-source wvrcode-rust"><span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Union types and type narrowing 48 + </span><span class="wvrcode-storage wvrcode-type wvrcode-type wvrcode-rust">type</span> <span class="wvrcode-entity wvrcode-name wvrcode-type wvrcode-rust">StringOrNumber</span> <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> string <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">|</span> number 49 + 50 + <span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">process</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-variable wvrcode-parameter wvrcode-rust">value</span><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> StringOrNumber</span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> </span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 51 + <span class="wvrcode-keyword wvrcode-control wvrcode-rust">match</span> <span class="wvrcode-invalid wvrcode-illegal wvrcode-rust">typeof</span> value <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 52 + <span class="wvrcode-string wvrcode-quoted wvrcode-double wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-begin wvrcode-rust">&quot;</span>string<span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-end wvrcode-rust">&quot;</span></span> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> handle_string<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>value as string<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span> 53 + </span><span class="wvrcode-string wvrcode-quoted wvrcode-double wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-begin wvrcode-rust">&quot;</span>number<span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-end wvrcode-rust">&quot;</span></span> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> handle_number<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>value as number<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span> 54 + </span></span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 55 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 56 + 57 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Optional chaining and null coalescing 58 + </span><span class="wvrcode-storage wvrcode-type wvrcode-rust">let</span> value <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> obj<span class="wvrcode-keyword wvrcode-operator wvrcode-rust">?</span>.prop<span class="wvrcode-keyword wvrcode-operator wvrcode-rust">?</span>.<span class="wvrcode-support wvrcode-function wvrcode-rust">method</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">?</span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">?</span> default_value 59 + </span></code></pre> 60 + <h3>Memory Management</h3> 61 + <ul> 62 + <li>Implicit Arc (Atomic Reference Counting) by default</li> 63 + <li>Optional non-atomic reference counting for platforms without atomics</li> 64 + <li>Custom allocator support via the effect system</li> 65 + <li>Everything immutable by default</li> 66 + <li>Thread-safe by default through Arc</li> 67 + </ul> 68 + <p>Example:</p> 69 + <pre><code class="language-Rust"><span class="wvrcode-source wvrcode-rust"><span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Standard usage - implicit Arc 70 + </span><span class="wvrcode-storage wvrcode-type wvrcode-rust">let</span> shared <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> <span class="wvrcode-meta wvrcode-path wvrcode-rust">ComplexType<span class="wvrcode-punctuation wvrcode-accessor wvrcode-rust">::</span></span>new<span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 71 + 72 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> No-atomic reference counting for embedded platforms 73 + </span> 74 + <span class="wvrcode-meta wvrcode-annotation wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-annotation wvrcode-rust">#</span><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">[</span><span class="wvrcode-variable wvrcode-annotation wvrcode-rust">no_atomic</span><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">]</span></span> 75 + <span class="wvrcode-storage wvrcode-type wvrcode-rust">let</span> basic <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> <span class="wvrcode-meta wvrcode-path wvrcode-rust">ComplexType<span class="wvrcode-punctuation wvrcode-accessor wvrcode-rust">::</span></span>new<span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 76 + 77 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Custom allocation 78 + </span> 79 + <span class="wvrcode-storage wvrcode-type wvrcode-rust">let</span> bump_allocator <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> <span class="wvrcode-meta wvrcode-path wvrcode-rust">BumpAllocator<span class="wvrcode-punctuation wvrcode-accessor wvrcode-rust">::</span></span>new<span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-constant wvrcode-numeric wvrcode-integer wvrcode-decimal wvrcode-rust">1024</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 80 + run with bump_allocator <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">as</span> Alloc <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 81 + <span class="wvrcode-storage wvrcode-type wvrcode-rust">let</span> temp <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> <span class="wvrcode-meta wvrcode-path wvrcode-rust">ComplexType<span class="wvrcode-punctuation wvrcode-accessor wvrcode-rust">::</span></span>new<span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 82 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 83 + </span></code></pre> 84 + <p>...</p> 85 + </body> 86 + </html>
+1
essay/entry/Logo.svg
··· 1 + <svg fill="0" height="256" width="256" viewBox="0 0 512.08 512.08" xml:space="preserve" stroke="0" stroke-width=".005" xmlns="http://www.w3.org/2000/svg"><path style="color:#000;fill:#000;" d="M203.455 374.098h105.172a10.95 10.95 0 0 1 9.111 4.875l56.885 85.33c4.849 7.277-.367 17.022-9.111 17.023H146.568c-8.744 0-13.96-9.746-9.111-17.023l56.887-85.33a10.95 10.95 0 0 1 9.111-4.875zM186.691 68.86a10.95 10.95 0 0 1 9.147 11.359L181.64 357.813a10.94 10.94 0 0 1-1.825 5.515l-42.662 63.996c-6.236 9.347-20.822 4.36-20.033-6.847l21.582-304.704a10.95 10.95 0 0 1 3.008-6.794l35.277-36.887a10.95 10.95 0 0 1 9.703-3.233zm139.289-.15a10.95 10.95 0 0 1 7.954 3.38l35.279 36.889a10.95 10.95 0 0 1 3.006 6.753l22.742 304.704c.835 11.228-13.783 16.255-20.031 6.888l-42.668-64a10.95 10.95 0 0 1-1.823-5.469L315.086 80.264c-.345-6.26 4.626-11.53 10.894-11.553zM223.66 42.63h64.182a10.95 10.95 0 0 1 10.941 10.538l10.863 288.797c.233 6.204-4.733 11.36-10.94 11.361h-85.331c-6.2 0-11.164-5.143-10.943-11.34L212.717 53.19a10.95 10.95 0 0 1 10.943-10.558z"/><path style="color:#000;fill:#000;" d="M223.66 42.629q-335.49-63.943 0 0Zm0 0a10.953 10.953 0 0 0-10.945 10.56L202.43 341.986c-.22 6.198 4.743 11.342 10.945 11.342h85.33c6.21 0 11.176-5.158 10.943-11.363L298.785 53.168a10.953 10.953 0 0 0-10.943-10.54Zm0 .004h64.182a10.95 10.95 0 0 1 10.94 10.535l10.863 288.797c.232 6.202-4.733 11.358-10.94 11.36h-85.33c-6.199-.001-11.162-5.144-10.941-11.339L212.719 53.19c.21-5.89 5.047-10.556 10.941-10.556zm102.32 26.076c-6.27.023-11.24 5.294-10.896 11.555l15.353 277.591a10.96 10.96 0 0 0 1.823 5.471l42.668 64c3.124 4.685 8.341 5.77 12.674 4.28 4.332-1.49 7.778-5.555 7.36-11.17l-22.741-304.704a10.95 10.95 0 0 0-3.006-6.755l-35.28-36.89a10.95 10.95 0 0 0-7.955-3.378zm0 .004a10.95 10.95 0 0 1 7.952 3.379l35.279 36.888a10.95 10.95 0 0 1 3.006 6.752l22.742 304.704c.417 5.613-3.03 9.676-7.36 11.166-4.33 1.489-9.544.403-12.667-4.28l-42.668-64a10.95 10.95 0 0 1-1.823-5.467L315.088 80.264c-.345-6.258 4.625-11.528 10.892-11.551zm-141.959.031a10.96 10.96 0 0 0-7.035 3.346l-35.277 36.887a10.95 10.95 0 0 0-3.008 6.796L117.12 420.477c-.395 5.605 3.055 9.655 7.383 11.134s9.535.39 12.654-4.285l42.662-63.996a10.96 10.96 0 0 0 1.825-5.518L195.84 80.22a10.953 10.953 0 0 0-11.819-11.475zm0 .006a10.945 10.945 0 0 1 11.815 11.469l-14.197 277.594a10.94 10.94 0 0 1-1.825 5.513l-42.662 63.996c-3.117 4.672-8.322 5.762-12.648 4.283s-7.776-5.525-7.381-11.128l21.582-304.704a10.95 10.95 0 0 1 3.008-6.793l35.277-36.886a10.95 10.95 0 0 1 7.031-3.344zm19.434 305.346a10.95 10.95 0 0 0-9.113 4.875l-56.887 85.33c-4.85 7.278.367 17.026 9.113 17.027h218.944c8.746 0 13.963-9.749 9.113-17.027l-56.885-85.33a10.95 10.95 0 0 0-9.113-4.875zm0 .004h105.172c3.66 0 7.079 1.83 9.11 4.875l56.884 85.33c4.848 7.275-.367 17.018-9.11 17.02H146.569c-8.742-.002-13.957-9.745-9.109-17.02l56.887-85.33a10.95 10.95 0 0 1 9.11-4.875z"/><path style="color:#000;fill:#000;" d="m333.16 96.125 14.33 259.086 28.584 42.875-20.812-278.852z"/></svg>
+56
essay/entry/README.md.html
··· 1 + <!DOCTYPE html> 2 + <html lang="en"> 3 + <head> 4 + <meta charset="utf-8"> 5 + <meta name="viewport" content="width=device-width, initial-scale=1"> 6 + <title>README.md</title> 7 + <link rel="stylesheet" href="..//css/base.css"> 8 + <link rel="stylesheet" href="..//css/syntax.css"> 9 + </head> 10 + <body> 11 + <p><img src="Logo.svg" alt="Logo.svg" /></p> 12 + <h1>Alloy</h1> 13 + <p>Alloy is a language that fuses Rust's power, safety guarantees, and performance with Swift's ergonomics and TypeScript's type system innovations. It features unique systems like explicit effect tracking and an advanced trait system with defaults. It maintains portability and compatibility by transpiling to Rust code, meaning it runs pretty much anywhere Rust does, and can take advantage of the existing Rust ecosystem.</p> 14 + <h2>Key Features</h2> 15 + <ul> 16 + <li>🚀 <strong>Performance</strong>: (hopefully) Zero-cost abstractions and efficient compilation to Rust</li> 17 + <li>🛡️ <strong>Safety</strong>: Thread-safe by default with implicit Arc</li> 18 + <li>🎯 <strong>Effect Tracking</strong>: Explicit side effect management</li> 19 + <li>🧩 <strong>Advanced Traits</strong>: Flexible trait system with powerful defaults</li> 20 + <li>🔄 <strong>Ergonomic Syntax</strong>: Clean, expressive code</li> 21 + </ul> 22 + <h2>Example</h2> 23 + <pre><code class="language-Rust"><span class="wvrcode-source wvrcode-rust">effect <span class="wvrcode-constant wvrcode-other wvrcode-rust">IO</span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 24 + <span class="wvrcode-support wvrcode-function wvrcode-rust">read_line</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> String 25 + print<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>String<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span> 26 + </span></span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 27 + 28 + <span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">process</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-variable wvrcode-parameter wvrcode-rust">input</span><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> String</span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> String</span> </span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 29 + input 30 + <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">|</span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">&gt;</span> <span class="wvrcode-support wvrcode-function wvrcode-rust">trim</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 31 + <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">|</span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">&gt;</span> <span class="wvrcode-support wvrcode-function wvrcode-rust">to_uppercase</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 32 + <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">|</span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">&gt;</span> <span class="wvrcode-support wvrcode-function wvrcode-rust">add_exclamation</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 33 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 34 + 35 + <span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">main</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> Result</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">[</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">,</span> Error<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">]</span></span> with <span class="wvrcode-constant wvrcode-other wvrcode-rust">IO</span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 36 + <span class="wvrcode-support wvrcode-function wvrcode-rust">print</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-string wvrcode-quoted wvrcode-double wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-begin wvrcode-rust">&quot;</span>Enter your name: <span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-end wvrcode-rust">&quot;</span></span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 37 + <span class="wvrcode-storage wvrcode-type wvrcode-rust">let</span> name <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> <span class="wvrcode-support wvrcode-function wvrcode-rust">read_line</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 38 + <span class="wvrcode-storage wvrcode-type wvrcode-rust">let</span> processed <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> <span class="wvrcode-support wvrcode-function wvrcode-rust">process</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>name</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 39 + <span class="wvrcode-support wvrcode-function wvrcode-rust">print</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-string wvrcode-quoted wvrcode-double wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-begin wvrcode-rust">&quot;</span>Hello, {processed}!<span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-end wvrcode-rust">&quot;</span></span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 40 + <span class="wvrcode-support wvrcode-type wvrcode-rust">Ok</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 41 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 42 + </span></code></pre> 43 + <h2>Documentation</h2> 44 + <ul> 45 + <li><a href="./Language%20Overview">Language Overview</a></li> 46 + <li><a href="./Syntax%20Guide">Syntax Guide</a></li> 47 + <li><a href="./Traits">Traits</a></li> 48 + <li><a href="./Effects">Effects</a></li> 49 + </ul> 50 + <h2>Status</h2> 51 + <h2>Contributing</h2> 52 + <h2>License</h2> 53 + <p>Alloy is licensed under the MPL-2.0.</p> 54 + <p><a href="./licenses/MPL-2.0"><img src="https://img.shields.io/badge/License-MPL_2.0-brightgreen.svg" alt="License: MPL 2.0" /></a></p> 55 + </body> 56 + </html>
+356
essay/entry/Syntax Guide.html
··· 1 + <!DOCTYPE html> 2 + <html lang="en"> 3 + <head> 4 + <meta charset="utf-8"> 5 + <meta name="viewport" content="width=device-width, initial-scale=1"> 6 + <title>Syntax Guide</title> 7 + <link rel="stylesheet" href="..//css/base.css"> 8 + <link rel="stylesheet" href="..//css/syntax.css"> 9 + </head> 10 + <body> 11 + <h2>Core Principles</h2> 12 + <ol> 13 + <li>Clean and consistent syntax that prioritizes readability</li> 14 + <li>Pipeline-oriented flow where appropriate</li> 15 + <li>Explicit over implicit</li> 16 + <li>Thread-local and immutable by default</li> 17 + <li>Square brackets for generics/templates</li> 18 + <li>Minimal noise and ceremony</li> 19 + <li>Predictable formatting rules</li> 20 + </ol> 21 + <h2>Basic Syntax Elements</h2> 22 + <h3>Keywords and Names</h3> 23 + <h4>Functions</h4> 24 + <pre><code class="language-Rust"><span class="wvrcode-source wvrcode-rust"><span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Function declaration 25 + </span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">add</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-variable wvrcode-parameter wvrcode-rust">x</span><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> <span class="wvrcode-storage wvrcode-type wvrcode-rust">i32</span>, <span class="wvrcode-variable wvrcode-parameter wvrcode-rust">y</span><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> <span class="wvrcode-storage wvrcode-type wvrcode-rust">i32</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> <span class="wvrcode-storage wvrcode-type wvrcode-rust">i32</span></span> </span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 26 + x <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">+</span> y 27 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 28 + 29 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Async function 30 + </span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">fetch_data</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> Result</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">[</span>Data<span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">,</span> Error<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">]</span></span> with Async <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 31 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> ... 32 + </span></span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 33 + 34 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Generic function 35 + </span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">map</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">[</span>T<span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">,</span> U<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">]</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>value<span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> T<span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">,</span> f<span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> <span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>T</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> U</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> U</span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 36 + <span class="wvrcode-support wvrcode-function wvrcode-rust">f</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>value</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 37 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 38 + </span></code></pre> 39 + <h4>Variables</h4> 40 + <pre><code class="language-Rust"><span class="wvrcode-source wvrcode-rust"> 41 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Immutable by default 42 + </span><span class="wvrcode-storage wvrcode-type wvrcode-rust">let</span> x <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> <span class="wvrcode-constant wvrcode-numeric wvrcode-integer wvrcode-decimal wvrcode-rust">5</span> 43 + 44 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Mutable variables must be declared with &#39;let mut&#39; 45 + </span><span class="wvrcode-storage wvrcode-type wvrcode-rust">let</span> <span class="wvrcode-storage wvrcode-modifier wvrcode-rust">mut</span> count <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> <span class="wvrcode-constant wvrcode-numeric wvrcode-integer wvrcode-decimal wvrcode-rust">0</span> 46 + 47 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Explicit type annotation 48 + </span><span class="wvrcode-storage wvrcode-type wvrcode-rust">let</span> name<span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> <span class="wvrcode-support wvrcode-type wvrcode-rust">String</span> <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> <span class="wvrcode-string wvrcode-quoted wvrcode-double wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-begin wvrcode-rust">&quot;</span>Alice<span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-end wvrcode-rust">&quot;</span></span> 49 + 50 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Pattern binding 51 + </span><span class="wvrcode-storage wvrcode-type wvrcode-rust">let</span> Point<span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>x<span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">,</span> y</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> point 52 + </span></code></pre> 53 + <h4>Types and Traits</h4> 54 + <pre><code class="language-Rust"><span class="wvrcode-source wvrcode-rust"><span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Type declaration 55 + </span><span class="wvrcode-storage wvrcode-type wvrcode-type wvrcode-rust">type</span> <span class="wvrcode-entity wvrcode-name wvrcode-type wvrcode-rust">Point</span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 56 + x<span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> <span class="wvrcode-storage wvrcode-type wvrcode-rust">f64</span> 57 + y<span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> <span class="wvrcode-storage wvrcode-type wvrcode-rust">f64</span> 58 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 59 + 60 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Enum (sum type) 61 + </span><span class="wvrcode-storage wvrcode-type wvrcode-type wvrcode-rust">type</span> <span class="wvrcode-entity wvrcode-name wvrcode-type wvrcode-rust">Option</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">[</span>T<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">]</span></span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 62 + <span class="wvrcode-support wvrcode-type wvrcode-rust">Some</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>T</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 63 + <span class="wvrcode-support wvrcode-type wvrcode-rust">None</span> 64 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 65 + 66 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Trait declaration 67 + </span><span class="wvrcode-meta wvrcode-trait wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-trait wvrcode-rust">trait</span> <span class="wvrcode-entity wvrcode-name wvrcode-trait wvrcode-rust">Display</span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 68 + <span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">display</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-variable wvrcode-parameter wvrcode-rust">self</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> String 69 + </span></span></span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 70 + 71 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Generic trait with associated type 72 + </span><span class="wvrcode-meta wvrcode-trait wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-trait wvrcode-rust">trait</span> <span class="wvrcode-entity wvrcode-name wvrcode-trait wvrcode-rust">Container</span>[T] <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 73 + <span class="wvrcode-storage wvrcode-type wvrcode-type wvrcode-rust">type</span> <span class="wvrcode-entity wvrcode-name wvrcode-type wvrcode-rust">Item</span> 74 + <span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">get</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-variable wvrcode-parameter wvrcode-rust">self</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> Option</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">[</span>T<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">]</span></span> 75 + <span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">insert</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-variable wvrcode-parameter wvrcode-rust">self</span>, <span class="wvrcode-variable wvrcode-parameter wvrcode-rust">item</span><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> T</span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> 76 + </span></span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 77 + </span></code></pre> 78 + <h2>Control Flow</h2> 79 + <h3>Pattern Matching</h3> 80 + <pre><code class="language-Rust"><span class="wvrcode-source wvrcode-rust"><span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Basic match expression using pipeline 81 + </span><span class="wvrcode-storage wvrcode-type wvrcode-rust">let</span> description <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> value 82 + <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">|</span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">&gt;</span> <span class="wvrcode-keyword wvrcode-control wvrcode-rust">match</span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 83 + <span class="wvrcode-support wvrcode-type wvrcode-rust">Ok</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>n</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> <span class="wvrcode-keyword wvrcode-control wvrcode-rust">if</span> n <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">&gt;</span> <span class="wvrcode-constant wvrcode-numeric wvrcode-integer wvrcode-decimal wvrcode-rust">0</span> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> </span><span class="wvrcode-string wvrcode-quoted wvrcode-double wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-begin wvrcode-rust">&quot;</span>Positive<span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-end wvrcode-rust">&quot;</span></span> 84 + <span class="wvrcode-support wvrcode-type wvrcode-rust">Ok</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>n</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> <span class="wvrcode-keyword wvrcode-control wvrcode-rust">if</span> n <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">&lt;</span> <span class="wvrcode-constant wvrcode-numeric wvrcode-integer wvrcode-decimal wvrcode-rust">0</span> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> </span><span class="wvrcode-string wvrcode-quoted wvrcode-double wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-begin wvrcode-rust">&quot;</span>Negative<span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-end wvrcode-rust">&quot;</span></span> 85 + <span class="wvrcode-support wvrcode-type wvrcode-rust">Ok</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-constant wvrcode-numeric wvrcode-integer wvrcode-decimal wvrcode-rust">0</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> </span><span class="wvrcode-string wvrcode-quoted wvrcode-double wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-begin wvrcode-rust">&quot;</span>Zero<span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-end wvrcode-rust">&quot;</span></span> 86 + <span class="wvrcode-support wvrcode-type wvrcode-rust">Err</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>e</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> </span><span class="wvrcode-string wvrcode-quoted wvrcode-double wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-begin wvrcode-rust">&quot;</span>Error: {e}<span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-end wvrcode-rust">&quot;</span></span> 87 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 88 + 89 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Match with complex patterns 90 + </span><span class="wvrcode-storage wvrcode-type wvrcode-rust">let</span> command <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> input 91 + <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">|</span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">&gt;</span> <span class="wvrcode-keyword wvrcode-control wvrcode-rust">match</span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 92 + Command.Quit <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> exit<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>0<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span> 93 + Command</span>.Move<span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>x<span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">,</span> y</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> move_cursor<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>x, y<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span> 94 + Command</span>.Text<span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-storage wvrcode-type wvrcode-rust">str</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> insert_text<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-storage wvrcode-type wvrcode-rust">str</span><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span> 95 + <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">_</span> </span><span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> beep<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span> 96 + </span></span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 97 + </span></code></pre> 98 + <h3>Conditionals</h3> 99 + <pre><code class="language-Rust"><span class="wvrcode-source wvrcode-rust"><span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> If expression 100 + </span><span class="wvrcode-storage wvrcode-type wvrcode-rust">let</span> status <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> <span class="wvrcode-keyword wvrcode-control wvrcode-rust">if</span> count <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">&gt;</span> <span class="wvrcode-constant wvrcode-numeric wvrcode-integer wvrcode-decimal wvrcode-rust">0</span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 101 + <span class="wvrcode-string wvrcode-quoted wvrcode-double wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-begin wvrcode-rust">&quot;</span>Active<span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-end wvrcode-rust">&quot;</span></span> 102 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> <span class="wvrcode-keyword wvrcode-control wvrcode-rust">else</span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 103 + <span class="wvrcode-string wvrcode-quoted wvrcode-double wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-begin wvrcode-rust">&quot;</span>Inactive<span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-end wvrcode-rust">&quot;</span></span> 104 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 105 + 106 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Guard statement for early returns 107 + </span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">process</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-variable wvrcode-parameter wvrcode-rust">data</span><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> Option[Data]</span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> Result</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">[</span>Output<span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">,</span> Error<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">]</span></span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 108 + guard <span class="wvrcode-storage wvrcode-type wvrcode-rust">let</span> unwrapped <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> data <span class="wvrcode-keyword wvrcode-control wvrcode-rust">else</span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 109 + <span class="wvrcode-keyword wvrcode-control wvrcode-rust">return</span> <span class="wvrcode-support wvrcode-type wvrcode-rust">Err</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>Error.InvalidData</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 110 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 111 + <span class="wvrcode-support wvrcode-function wvrcode-rust">process_unwrapped</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>unwrapped</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 112 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 113 + 114 + </span></code></pre> 115 + <h3>Loops</h3> 116 + <pre><code class="language-Rust"><span class="wvrcode-source wvrcode-rust"><span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> For-in loop 117 + </span><span class="wvrcode-keyword wvrcode-control wvrcode-rust">for</span> item <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">in</span> items <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 118 + <span class="wvrcode-support wvrcode-function wvrcode-rust">process</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>item</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 119 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 120 + 121 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> While loop 122 + </span><span class="wvrcode-keyword wvrcode-control wvrcode-rust">while</span> condition <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 123 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> ... 124 + </span></span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 125 + 126 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Loop with iterator methods 127 + </span>items 128 + <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">|</span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">&gt;</span> <span class="wvrcode-support wvrcode-function wvrcode-rust">filter</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>pred</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 129 + <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">|</span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">&gt;</span> <span class="wvrcode-support wvrcode-function wvrcode-rust">map</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>transform</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 130 + <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">|</span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">&gt;</span> <span class="wvrcode-support wvrcode-function wvrcode-rust">collect</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 131 + </span></code></pre> 132 + <h2>Error Handling</h2> 133 + <h3>Results and Options</h3> 134 + <pre><code class="language-Rust"><span class="wvrcode-source wvrcode-rust"><span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Using Result type 135 + </span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">divide</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-variable wvrcode-parameter wvrcode-rust">x</span><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> <span class="wvrcode-storage wvrcode-type wvrcode-rust">f64</span>, <span class="wvrcode-variable wvrcode-parameter wvrcode-rust">y</span><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> <span class="wvrcode-storage wvrcode-type wvrcode-rust">f64</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> Result</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">[</span><span class="wvrcode-storage wvrcode-type wvrcode-rust">f64</span><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">,</span> DivisionError<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">]</span></span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 136 + <span class="wvrcode-keyword wvrcode-control wvrcode-rust">if</span> y <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> <span class="wvrcode-constant wvrcode-numeric wvrcode-float wvrcode-rust">0.</span><span class="wvrcode-constant wvrcode-numeric wvrcode-float wvrcode-rust">0</span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 137 + <span class="wvrcode-support wvrcode-type wvrcode-rust">Err</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>DivisionError.DivideByZero</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 138 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> <span class="wvrcode-keyword wvrcode-control wvrcode-rust">else</span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 139 + <span class="wvrcode-support wvrcode-type wvrcode-rust">Ok</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>x <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">/</span> y</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 140 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 141 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 142 + 143 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Chaining Results 144 + </span><span class="wvrcode-storage wvrcode-type wvrcode-rust">let</span> result <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> value 145 + <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">|</span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">&gt;</span> <span class="wvrcode-support wvrcode-function wvrcode-rust">first_operation</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 146 + <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">|</span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">&gt;</span> <span class="wvrcode-support wvrcode-function wvrcode-rust">and_then</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>second_operation</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 147 + <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">|</span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">&gt;</span> <span class="wvrcode-support wvrcode-function wvrcode-rust">map</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>third_operation</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 148 + <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">|</span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">&gt;</span> <span class="wvrcode-support wvrcode-function wvrcode-rust">map_err</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>CustomError</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 149 + 150 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Pattern matching on Result 151 + </span><span class="wvrcode-storage wvrcode-type wvrcode-rust">let</span> output <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> result 152 + <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">|</span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">&gt;</span> <span class="wvrcode-keyword wvrcode-control wvrcode-rust">match</span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 153 + <span class="wvrcode-support wvrcode-type wvrcode-rust">Ok</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>value</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> process<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>value<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span> 154 + Err<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>e<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span> </span><span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> handle_error<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>e<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span> 155 + </span></span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 156 + </span></code></pre> 157 + <h2>Effects and Side Effects</h2> 158 + <h3>Effect Declaration and Usage</h3> 159 + <pre><code class="language-Rust"><span class="wvrcode-source wvrcode-rust"><span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Declaring effects 160 + </span>effect <span class="wvrcode-constant wvrcode-other wvrcode-rust">IO</span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 161 + <span class="wvrcode-support wvrcode-function wvrcode-rust">read_line</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> String 162 + print<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-storage wvrcode-type wvrcode-rust">str</span>: String<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span> 163 + </span></span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 164 + 165 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Using effects 166 + </span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">greet</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> String with IO</span> </span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 167 + <span class="wvrcode-support wvrcode-function wvrcode-rust">print</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-string wvrcode-quoted wvrcode-double wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-begin wvrcode-rust">&quot;</span>What&#39;s your name?<span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-end wvrcode-rust">&quot;</span></span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 168 + <span class="wvrcode-storage wvrcode-type wvrcode-rust">let</span> name <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> <span class="wvrcode-support wvrcode-function wvrcode-rust">read_line</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 169 + <span class="wvrcode-support wvrcode-function wvrcode-rust">print</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-string wvrcode-quoted wvrcode-double wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-begin wvrcode-rust">&quot;</span>Hello, {name}!<span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-end wvrcode-rust">&quot;</span></span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 170 + name 171 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 172 + 173 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Handling effects 174 + </span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">main</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> </span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 175 + run with <span class="wvrcode-constant wvrcode-other wvrcode-rust">IO</span> <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> ConsoleIO <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 176 + <span class="wvrcode-storage wvrcode-type wvrcode-rust">let</span> name <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> <span class="wvrcode-support wvrcode-function wvrcode-rust">greet</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 177 + <span class="wvrcode-support wvrcode-function wvrcode-rust">print</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-string wvrcode-quoted wvrcode-double wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-begin wvrcode-rust">&quot;</span>Goodbye, {name}<span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-end wvrcode-rust">&quot;</span></span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 178 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 179 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 180 + </span></code></pre> 181 + <h2>Generics and Traits</h2> 182 + <h3>Generic Types</h3> 183 + <pre><code class="language-Rust"><span class="wvrcode-source wvrcode-rust"><span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Generic type declaration 184 + </span><span class="wvrcode-storage wvrcode-type wvrcode-type wvrcode-rust">type</span> <span class="wvrcode-entity wvrcode-name wvrcode-type wvrcode-rust">List</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">[</span>T<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">]</span></span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 185 + head<span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> <span class="wvrcode-support wvrcode-type wvrcode-rust">Option</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">[</span>T<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">]</span></span> 186 + tail<span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> <span class="wvrcode-support wvrcode-type wvrcode-rust">Option</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">[</span><span class="wvrcode-support wvrcode-type wvrcode-rust">Box</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">[</span>List<span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">[</span>T<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">]</span></span><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">]</span></span><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">]</span></span> 187 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 188 + 189 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Generic trait bounds 190 + </span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">sort</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">[</span>T<span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> <span class="wvrcode-support wvrcode-type wvrcode-rust">Ord</span><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">]</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>list<span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">&amp;</span><span class="wvrcode-storage wvrcode-modifier wvrcode-rust">mut</span> <span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">[</span>T<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">]</span></span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 191 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Implementation 192 + </span></span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 193 + 194 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Multiple bounds 195 + </span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">process</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">[</span>T<span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> Display <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">+</span> <span class="wvrcode-support wvrcode-type wvrcode-rust">Clone</span><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">]</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>item<span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> T</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 196 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Implementation 197 + </span></span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 198 + </span></code></pre> 199 + <h3>Trait Implementation</h3> 200 + <pre><code class="language-Rust"><span class="wvrcode-source wvrcode-rust">implement Display <span class="wvrcode-keyword wvrcode-control wvrcode-rust">for</span> Point <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 201 + <span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">display</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-variable wvrcode-parameter wvrcode-rust">self</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> String</span> </span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 202 + <span class="wvrcode-string wvrcode-quoted wvrcode-double wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-begin wvrcode-rust">&quot;</span>Point({self.x}, {self.y})<span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-end wvrcode-rust">&quot;</span></span> 203 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 204 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 205 + 206 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Generic implementation 207 + </span>implement<span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">[</span>T<span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> Display<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">]</span></span> Display <span class="wvrcode-keyword wvrcode-control wvrcode-rust">for</span> <span class="wvrcode-support wvrcode-type wvrcode-rust">Option</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">[</span>T<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">]</span></span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 208 + <span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">display</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-variable wvrcode-parameter wvrcode-rust">self</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> String</span> </span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 209 + <span class="wvrcode-keyword wvrcode-control wvrcode-rust">match</span> <span class="wvrcode-variable wvrcode-language wvrcode-rust">self</span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 210 + <span class="wvrcode-support wvrcode-type wvrcode-rust">Some</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>value</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> </span><span class="wvrcode-string wvrcode-quoted wvrcode-double wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-begin wvrcode-rust">&quot;</span>Some({value})<span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-end wvrcode-rust">&quot;</span></span> 211 + <span class="wvrcode-support wvrcode-type wvrcode-rust">None</span> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> </span><span class="wvrcode-string wvrcode-quoted wvrcode-double wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-begin wvrcode-rust">&quot;</span>None<span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-end wvrcode-rust">&quot;</span></span> 212 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 213 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 214 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 215 + 216 + </span></code></pre> 217 + <h2>Concurrency</h2> 218 + <h3>Async/Await</h3> 219 + <pre><code class="language-Rust"><span class="wvrcode-source wvrcode-rust"><span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Async function declaration 220 + </span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">fetch_data</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-variable wvrcode-parameter wvrcode-rust">url</span><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> String</span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> Result</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">[</span>Data<span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">,</span> Error<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">]</span></span> with Async <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 221 + <span class="wvrcode-storage wvrcode-type wvrcode-rust">let</span> response <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> http.<span class="wvrcode-support wvrcode-function wvrcode-rust">get</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>url</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">?</span>.await 222 + <span class="wvrcode-storage wvrcode-type wvrcode-rust">let</span> data <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> response.<span class="wvrcode-support wvrcode-function wvrcode-rust">json</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">?</span>.await 223 + <span class="wvrcode-support wvrcode-type wvrcode-rust">Ok</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>data</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 224 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 225 + 226 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Using async functions 227 + </span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">process</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> </span>with Async <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 228 + <span class="wvrcode-storage wvrcode-type wvrcode-rust">let</span> data <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> <span class="wvrcode-support wvrcode-function wvrcode-rust">fetch_data</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-string wvrcode-quoted wvrcode-double wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-begin wvrcode-rust">&quot;</span>example.com<span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-end wvrcode-rust">&quot;</span></span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">?</span> 229 + <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">|</span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">&gt;</span> await 230 + <span class="wvrcode-support wvrcode-function wvrcode-rust">process_data</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>data</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 231 + <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">|</span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">&gt;</span> await 232 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 233 + </span></code></pre> 234 + <h3>Thread Safety</h3> 235 + <pre><code class="language-Rust"><span class="wvrcode-source wvrcode-rust"><span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Thread-local by default 236 + </span><span class="wvrcode-storage wvrcode-type wvrcode-rust">let</span> counter <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> <span class="wvrcode-constant wvrcode-numeric wvrcode-integer wvrcode-decimal wvrcode-rust">0</span> 237 + 238 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Explicitly shared state 239 + </span>shared <span class="wvrcode-storage wvrcode-type wvrcode-rust">let</span> global_counter <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> AtomicInteger<span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-constant wvrcode-numeric wvrcode-integer wvrcode-decimal wvrcode-rust">0</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 240 + 241 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Shared function 242 + </span>shared <span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">increment</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> </span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 243 + global_counter.<span class="wvrcode-support wvrcode-function wvrcode-rust">fetch_add</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-constant wvrcode-numeric wvrcode-integer wvrcode-decimal wvrcode-rust">1</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 244 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 245 + </span></code></pre> 246 + <h2>Pipeline Operator</h2> 247 + <h3>Basic Usage</h3> 248 + <pre><code class="language-Rust"><span class="wvrcode-source wvrcode-rust"><span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Pipeline with simple transformations 249 + </span><span class="wvrcode-storage wvrcode-type wvrcode-rust">let</span> result <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> value 250 + <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">|</span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">&gt;</span> <span class="wvrcode-support wvrcode-function wvrcode-rust">transform1</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 251 + <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">|</span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">&gt;</span> <span class="wvrcode-support wvrcode-function wvrcode-rust">transform2</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 252 + <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">|</span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">&gt;</span> <span class="wvrcode-support wvrcode-function wvrcode-rust">transform3</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 253 + 254 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Pipeline with closures 255 + </span><span class="wvrcode-storage wvrcode-type wvrcode-rust">let</span> processed <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> data 256 + <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">|</span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">&gt;</span> <span class="wvrcode-support wvrcode-function wvrcode-rust">map</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>x <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> x </span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">*</span> <span class="wvrcode-constant wvrcode-numeric wvrcode-integer wvrcode-decimal wvrcode-rust">2</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 257 + <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">|</span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">&gt;</span> <span class="wvrcode-support wvrcode-function wvrcode-rust">filter</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>x <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> x </span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">&gt;</span> <span class="wvrcode-constant wvrcode-numeric wvrcode-integer wvrcode-decimal wvrcode-rust">0</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 258 + <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">|</span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">&gt;</span> <span class="wvrcode-support wvrcode-function wvrcode-rust">fold</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-constant wvrcode-numeric wvrcode-integer wvrcode-decimal wvrcode-rust">0</span><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">,</span> <span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>acc<span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">,</span> x</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> acc </span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">+</span> x</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 259 + </span></code></pre> 260 + <h3>Complex Pipelines</h3> 261 + <pre><code class="language-Rust"><span class="wvrcode-source wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-rust">let</span> result <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> initial_value 262 + <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">|</span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">&gt;</span> <span class="wvrcode-support wvrcode-function wvrcode-rust">validate</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 263 + <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">|</span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">&gt;</span> <span class="wvrcode-keyword wvrcode-control wvrcode-rust">match</span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 264 + <span class="wvrcode-support wvrcode-type wvrcode-rust">Ok</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>value</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> process<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>value<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span> 265 + Err<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>e<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span> </span><span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> handle_error<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>e<span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span> 266 + </span></span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 267 + <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">|</span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">&gt;</span> <span class="wvrcode-support wvrcode-function wvrcode-rust">transform</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 268 + <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">|</span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">&gt;</span> <span class="wvrcode-support wvrcode-function wvrcode-rust">finalize</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 269 + </span></code></pre> 270 + <h2>Standard Library Conventions</h2> 271 + <h3>Iterator Methods</h3> 272 + <pre><code class="language-Rust"><span class="wvrcode-source wvrcode-rust"><span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Method chaining with iterators 273 + </span><span class="wvrcode-storage wvrcode-type wvrcode-rust">let</span> sum <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> numbers 274 + <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">|</span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">&gt;</span> <span class="wvrcode-support wvrcode-function wvrcode-rust">filter</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>n <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> n </span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">&gt;</span> <span class="wvrcode-constant wvrcode-numeric wvrcode-integer wvrcode-decimal wvrcode-rust">0</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 275 + <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">|</span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">&gt;</span> <span class="wvrcode-support wvrcode-function wvrcode-rust">map</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>n <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> n </span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">*</span> n</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 276 + <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">|</span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">&gt;</span> <span class="wvrcode-support wvrcode-function wvrcode-rust">sum</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 277 + 278 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Collecting results 279 + </span><span class="wvrcode-storage wvrcode-type wvrcode-rust">let</span> vec <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> iter 280 + <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">|</span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">&gt;</span> <span class="wvrcode-support wvrcode-function wvrcode-rust">filter</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>pred</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 281 + <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">|</span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">&gt;</span> <span class="wvrcode-support wvrcode-function wvrcode-rust">map</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>transform</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 282 + <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">|</span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">&gt;</span> <span class="wvrcode-support wvrcode-function wvrcode-rust">collect</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span></span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 283 + </span></code></pre> 284 + <h3>String Formatting</h3> 285 + <pre><code class="language-Rust"><span class="wvrcode-source wvrcode-rust"><span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> String interpolation 286 + </span><span class="wvrcode-storage wvrcode-type wvrcode-rust">let</span> message <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> <span class="wvrcode-string wvrcode-quoted wvrcode-double wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-begin wvrcode-rust">&quot;</span>Hello, {name}!<span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-end wvrcode-rust">&quot;</span></span> 287 + 288 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Multi-line strings 289 + </span><span class="wvrcode-storage wvrcode-type wvrcode-rust">let</span> text <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> <span class="wvrcode-string wvrcode-quoted wvrcode-double wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-begin wvrcode-rust">&quot;</span><span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-end wvrcode-rust">&quot;</span></span><span class="wvrcode-string wvrcode-quoted wvrcode-double wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-begin wvrcode-rust">&quot;</span> 290 + This is a multi-line 291 + string with proper 292 + indentation handling 293 + <span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-end wvrcode-rust">&quot;</span></span><span class="wvrcode-string wvrcode-quoted wvrcode-double wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-begin wvrcode-rust">&quot;</span><span class="wvrcode-punctuation wvrcode-definition wvrcode-string wvrcode-end wvrcode-rust">&quot;</span></span> 294 + </span></code></pre> 295 + <h2>Module System</h2> 296 + <h3>Module Declaration</h3> 297 + <pre><code class="language-Rust"><span class="wvrcode-source wvrcode-rust"><span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Module declaration 298 + </span>module math <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 299 + <span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-modifier wvrcode-rust">pub</span> <span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">add</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-variable wvrcode-parameter wvrcode-rust">x</span><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> <span class="wvrcode-storage wvrcode-type wvrcode-rust">i32</span>, <span class="wvrcode-variable wvrcode-parameter wvrcode-rust">y</span><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> <span class="wvrcode-storage wvrcode-type wvrcode-rust">i32</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> <span class="wvrcode-storage wvrcode-type wvrcode-rust">i32</span></span> </span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 300 + x <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">+</span> y 301 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 302 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 303 + 304 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Using modules 305 + </span><span class="wvrcode-keyword wvrcode-other wvrcode-rust">use</span> math.<span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span>add<span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">,</span> subtract</span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 306 + <span class="wvrcode-keyword wvrcode-other wvrcode-rust">use</span> collections.<span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span>HashMap<span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">,</span> Vector</span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 307 + </span></code></pre> 308 + <h2>Comments and Documentation</h2> 309 + <h3>Documentation Comments</h3> 310 + <pre><code class="language-Rust"><span class="wvrcode-source wvrcode-rust"><span class="wvrcode-comment wvrcode-line wvrcode-documentation wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">///</span> Function documentation 311 + </span><span class="wvrcode-comment wvrcode-line wvrcode-documentation wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">///</span> 312 + </span><span class="wvrcode-comment wvrcode-line wvrcode-documentation wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">///</span> # Arguments 313 + </span><span class="wvrcode-comment wvrcode-line wvrcode-documentation wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">///</span> * `x` - First number 314 + </span><span class="wvrcode-comment wvrcode-line wvrcode-documentation wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">///</span> * `y` - Second number 315 + </span><span class="wvrcode-comment wvrcode-line wvrcode-documentation wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">///</span> 316 + </span><span class="wvrcode-comment wvrcode-line wvrcode-documentation wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">///</span> # Returns 317 + </span><span class="wvrcode-comment wvrcode-line wvrcode-documentation wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">///</span> Sum of the two numbers 318 + </span> 319 + <span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">add</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-variable wvrcode-parameter wvrcode-rust">x</span><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> <span class="wvrcode-storage wvrcode-type wvrcode-rust">i32</span>, <span class="wvrcode-variable wvrcode-parameter wvrcode-rust">y</span><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> <span class="wvrcode-storage wvrcode-type wvrcode-rust">i32</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> <span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> <span class="wvrcode-storage wvrcode-type wvrcode-rust">i32</span></span> </span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 320 + x <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">+</span> y 321 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 322 + 323 + <span class="wvrcode-comment wvrcode-line wvrcode-double-slash wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">//</span> Regular single-line comment 324 + </span> 325 + <span class="wvrcode-comment wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">/*</span> Block comment 326 + spanning multiple 327 + lines <span class="wvrcode-punctuation wvrcode-definition wvrcode-comment wvrcode-rust">*/</span></span> 328 + 329 + </span></code></pre> 330 + <h2>Formatting Rules</h2> 331 + <ol> 332 + <li>Use 4 spaces for indentation</li> 333 + <li>One statement per line</li> 334 + <li>Blank line between function definitions</li> 335 + <li>No semicolon for expressions that are the last in a block</li> 336 + <li>Space after keywords</li> 337 + <li>No space after function names in calls</li> 338 + <li>Align match arms</li> 339 + <li>Pipeline operators at the start of lines</li> 340 + <li>Break long lines at sensible points (pipelines, binary operators)</li> 341 + </ol> 342 + <h2>Best Practices</h2> 343 + <ol> 344 + <li>Prefer pipeline style for transformations and matches</li> 345 + <li>Use pattern matching over if/else chains</li> 346 + <li>Make effects explicit</li> 347 + <li>Keep functions focused and small</li> 348 + <li>Use meaningful and descriptive names</li> 349 + <li>Document public interfaces</li> 350 + <li>Utilize type inference where it aids readability</li> 351 + <li>Make thread sharing explicit</li> 352 + <li>Handle all error cases explicitly</li> 353 + <li>Use appropriate abstraction levels</li> 354 + </ol> 355 + </body> 356 + </html>
+37
essay/entry/Untitled.html
··· 1 + <!DOCTYPE html> 2 + <html lang="en"> 3 + <head> 4 + <meta charset="utf-8"> 5 + <meta name="viewport" content="width=device-width, initial-scale=1"> 6 + <title>Untitled</title> 7 + <link rel="stylesheet" href="..//css/base.css"> 8 + <link rel="stylesheet" href="..//css/syntax.css"> 9 + </head> 10 + <body> 11 + <pre><code class="language-Rust"><span class="wvrcode-source wvrcode-rust"> 12 + <span class="wvrcode-meta wvrcode-struct wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-struct wvrcode-rust">struct</span> </span><span class="wvrcode-meta wvrcode-struct wvrcode-rust"><span class="wvrcode-entity wvrcode-name wvrcode-struct wvrcode-rust">Encoder</span> </span><span class="wvrcode-meta wvrcode-struct wvrcode-rust"><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 13 + 14 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 15 + 16 + <span class="wvrcode-meta wvrcode-impl wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-impl wvrcode-rust">impl</span> </span><span class="wvrcode-meta wvrcode-impl wvrcode-rust"><span class="wvrcode-entity wvrcode-name wvrcode-impl wvrcode-rust">Encoder</span> </span><span class="wvrcode-meta wvrcode-impl wvrcode-rust"><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 17 + <span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-storage wvrcode-type wvrcode-function wvrcode-rust">fn</span> </span><span class="wvrcode-entity wvrcode-name wvrcode-function wvrcode-rust">new</span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-begin wvrcode-rust">(</span><span class="wvrcode-variable wvrcode-parameter wvrcode-rust">chars</span><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">&amp;</span>[<span class="wvrcode-storage wvrcode-type wvrcode-rust">char</span>]</span><span class="wvrcode-meta wvrcode-function wvrcode-rust"><span class="wvrcode-meta wvrcode-function wvrcode-parameters wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-parameters wvrcode-end wvrcode-rust">)</span></span></span></span><span class="wvrcode-meta wvrcode-function wvrcode-rust"> </span><span class="wvrcode-keyword wvrcode-operator wvrcode-rust">-</span><span class="wvrcode-meta wvrcode-function wvrcode-return-type wvrcode-rust"><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">-&gt;</span> <span class="wvrcode-storage wvrcode-type wvrcode-rust">Self</span></span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 18 + <span class="wvrcode-storage wvrcode-type wvrcode-rust">Self</span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 19 + chars<span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">,</span> 20 + position<span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> <span class="wvrcode-constant wvrcode-numeric wvrcode-integer wvrcode-decimal wvrcode-rust">0</span><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">,</span> 21 + is_number<span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> <span class="wvrcode-constant wvrcode-language wvrcode-rust">false</span><span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">,</span> 22 + number_start<span class="wvrcode-punctuation wvrcode-separator wvrcode-rust">:</span> <span class="wvrcode-constant wvrcode-numeric wvrcode-integer wvrcode-decimal wvrcode-rust">0</span> 23 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 24 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 25 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span></span> 26 + 27 + <span class="wvrcode-storage wvrcode-type wvrcode-rust">let</span> chars <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span></span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 28 + 29 + <span class="wvrcode-storage wvrcode-type wvrcode-rust">let</span> enc <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">=</span> <span class="wvrcode-meta wvrcode-path wvrcode-rust">Encoder<span class="wvrcode-punctuation wvrcode-accessor wvrcode-rust">::</span></span>new<span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-begin wvrcode-rust">(</span>chars</span><span class="wvrcode-meta wvrcode-group wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-group wvrcode-end wvrcode-rust">)</span></span> 30 + 31 + <span class="wvrcode-keyword wvrcode-control wvrcode-rust">for</span> <span class="wvrcode-storage wvrcode-type wvrcode-rust">char</span> <span class="wvrcode-keyword wvrcode-operator wvrcode-rust">in</span> enc.chars <span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-begin wvrcode-rust">{</span> 32 + 33 + </span><span class="wvrcode-meta wvrcode-block wvrcode-rust"><span class="wvrcode-punctuation wvrcode-section wvrcode-block wvrcode-end wvrcode-rust">}</span></span> 34 + 35 + 36 + </span></code></pre></body> 37 + </html>
+26
essay/entry/todo!.html
··· 1 + <!DOCTYPE html> 2 + <html lang="en"> 3 + <head> 4 + <meta charset="utf-8"> 5 + <meta name="viewport" content="width=device-width, initial-scale=1"> 6 + <title>todo!</title> 7 + <link rel="stylesheet" href="..//css/base.css"> 8 + <link rel="stylesheet" href="..//css/syntax.css"> 9 + </head> 10 + <body> 11 + <hr /> 12 + <p>kanban-plugin: board</p> 13 + <hr /> 14 + <h2>PLANNED</h2> 15 + <h2>NOT STARTED</h2> 16 + <h2>BLOCKED</h2> 17 + <h2>IN PROGRESS</h2> 18 + <h2>IN TESTING</h2> 19 + <h2>DONE</h2> 20 + <p><strong>Complete</strong></p> 21 + <p>%% kanban:settings</p> 22 + <pre><code>{"kanban-plugin":"board","list-collapse":[true,true,true,true,true,true]} 23 + </code></pre> 24 + <p>%%</p> 25 + </body> 26 + </html>
+24
essay/index.html
··· 1 + <!DOCTYPE html> 2 + <html lang="en"> 3 + <head> 4 + <meta charset="utf-8"> 5 + <meta name="viewport" content="width=device-width, initial-scale=1"> 6 + <title>Language Overview</title> 7 + <link rel="stylesheet" href="./css/base.css"> 8 + <link rel="stylesheet" href="./css/syntax.css"> 9 + </head> 10 + <body> 11 + <h1>Index</h1> 12 + <ul> 13 + <li><a href="./entry/Language Overview.html">Language Overview.md</a></li> 14 + <li><a href="./entry/Untitled.html">Untitled.md</a></li> 15 + <li><a href="./entry/Logo.html">Logo.svg</a></li> 16 + <li><a href="./entry/todo!.html">todo!.md</a></li> 17 + <li><a href="./entry/Features/Effects.html">Features/Effects.md</a></li> 18 + <li><a href="./entry/Features/Allocator.html">Features/Allocator.md</a></li> 19 + <li><a href="./entry/Features/Traits.html">Features/Traits.md</a></li> 20 + <li><a href="./entry/README.md.html">README.md.md</a></li> 21 + <li><a href="./entry/Syntax Guide.html">Syntax Guide.md</a></li> 22 + </ul> 23 + </body> 24 + </html>
+287
grant_proposal.html
··· 1 + <!DOCTYPE html> 2 + <html lang="en"> 3 + <head> 4 + <meta charset="utf-8"> 5 + <meta name="viewport" content="width=device-width, initial-scale=1"> 6 + <title>grant_proposal</title> 7 + <style> 8 + /* CSS Reset */ 9 + *, *::before, *::after { 10 + box-sizing: border-box; 11 + margin: 0; 12 + padding: 0; 13 + } 14 + 15 + /* CSS Variables */ 16 + :root { 17 + --color-background: #ffffff; 18 + --color-foreground: #2b303b; 19 + --color-link: #0366d6; 20 + --color-link-hover: #0256b8; 21 + 22 + --font-body: IBM Plex, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; 23 + --font-heading: IBM Plex Sans, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; 24 + --font-mono: 'IBM Plex Mono', 'Berkeley Mono', 'Cascadia Code', 'Roboto Mono', Consolas, monospace; 25 + 26 + --spacing-base: 16px; 27 + --spacing-line-height: 1.6; 28 + --spacing-scale: 1.25; 29 + } 30 + 31 + /* Base Styles */ 32 + html { 33 + font-size: var(--spacing-base); 34 + line-height: var(--spacing-line-height); 35 + } 36 + 37 + body { 38 + font-family: var(--font-body); 39 + color: var(--color-foreground); 40 + background-color: var(--color-background); 41 + max-width: 65ch; 42 + margin: 0 auto; 43 + padding: 2rem 1rem; 44 + } 45 + 46 + /* Typography */ 47 + h1, h2, h3, h4, h5, h6 { 48 + font-family: var(--font-heading); 49 + margin-top: calc(1rem * var(--spacing-scale)); 50 + margin-bottom: 0.5rem; 51 + line-height: 1.2; 52 + } 53 + 54 + h1 { font-size: 2.5rem; } 55 + h2 { font-size: 2rem; } 56 + h3 { font-size: 1.5rem; } 57 + h4 { font-size: 1.25rem; } 58 + h5 { font-size: 1.125rem; } 59 + h6 { font-size: 1rem; } 60 + 61 + p { 62 + margin-bottom: 1rem; 63 + } 64 + 65 + a { 66 + color: var(--color-link); 67 + text-decoration: none; 68 + } 69 + 70 + a:hover { 71 + color: var(--color-link-hover); 72 + text-decoration: underline; 73 + } 74 + 75 + /* Lists */ 76 + ul, ol { 77 + margin-left: 2rem; 78 + margin-bottom: 1rem; 79 + } 80 + 81 + li { 82 + margin-bottom: 0.25rem; 83 + } 84 + 85 + /* Code */ 86 + code { 87 + font-family: var(--font-mono); 88 + background-color: rgba(0, 0, 0, 0.05); 89 + padding: 0.125rem 0.25rem; 90 + border-radius: 3px; 91 + font-size: 0.9em; 92 + } 93 + 94 + pre { 95 + overflow-x: auto; 96 + margin-bottom: 1rem; 97 + } 98 + 99 + pre code { 100 + display: block; 101 + padding: 1rem; 102 + background-color: rgba(0, 0, 0, 0.03); 103 + border-radius: 5px; 104 + } 105 + 106 + /* Math */ 107 + .math { 108 + font-family: var(--font-mono); 109 + } 110 + 111 + .math-display { 112 + display: block; 113 + margin: 1rem 0; 114 + text-align: center; 115 + } 116 + 117 + /* Blockquotes */ 118 + blockquote { 119 + border-left: 4px solid var(--color-link); 120 + padding-left: 1rem; 121 + margin: 1rem 0; 122 + font-style: italic; 123 + } 124 + 125 + /* Tables */ 126 + table { 127 + border-collapse: collapse; 128 + width: 100%; 129 + margin-bottom: 1rem; 130 + } 131 + 132 + th, td { 133 + border: 1px solid rgba(0, 0, 0, 0.1); 134 + padding: 0.5rem; 135 + text-align: left; 136 + } 137 + 138 + th { 139 + background-color: rgba(0, 0, 0, 0.05); 140 + font-weight: 600; 141 + } 142 + 143 + /* Footnotes */ 144 + .footnote-reference { 145 + font-size: 0.8em; 146 + } 147 + 148 + .footnote-definition { 149 + margin-top: 2rem; 150 + padding-top: 0.5rem; 151 + border-top: 1px solid rgba(0, 0, 0, 0.1); 152 + font-size: 0.9em; 153 + } 154 + 155 + .footnote-definition-label { 156 + font-weight: 600; 157 + margin-right: 0.5rem; 158 + } 159 + 160 + /* Horizontal Rule */ 161 + hr { 162 + border: none; 163 + border-top: 1px solid rgba(0, 0, 0, 0.1); 164 + margin: 2rem 0; 165 + } 166 + </style> 167 + <style> 168 + /* 169 + * theme "Rosé Pine" generated by syntect 170 + */ 171 + 172 + .wvrcode-code { 173 + color: #e0def4; 174 + background-color: #191724; 175 + } 176 + 177 + .wvrcode-comment { 178 + color: #908caa; 179 + font-style: italic; 180 + } 181 + .wvrcode-string, .wvrcode-punctuation.wvrcode-definition.wvrcode-string { 182 + color: #f6c177; 183 + } 184 + .wvrcode-constant.wvrcode-numeric { 185 + color: #f6c177; 186 + } 187 + .wvrcode-constant.wvrcode-language { 188 + color: #f6c177; 189 + font-weight: bold; 190 + } 191 + .wvrcode-constant.wvrcode-character, .wvrcode-constant.wvrcode-other { 192 + color: #f6c177; 193 + } 194 + .wvrcode-variable { 195 + color: #e0def4; 196 + font-style: italic; 197 + } 198 + .wvrcode-keyword { 199 + color: #31748f; 200 + } 201 + .wvrcode-storage { 202 + color: #9ccfd8; 203 + } 204 + .wvrcode-storage.wvrcode-type { 205 + color: #9ccfd8; 206 + } 207 + .wvrcode-entity.wvrcode-name.wvrcode-class { 208 + color: #31748f; 209 + font-weight: bold; 210 + } 211 + .wvrcode-entity.wvrcode-other.wvrcode-inherited-class { 212 + color: #31748f; 213 + font-style: italic; 214 + } 215 + .wvrcode-entity.wvrcode-name.wvrcode-function { 216 + color: #ebbcba; 217 + font-style: italic; 218 + } 219 + .wvrcode-variable.wvrcode-parameter { 220 + color: #c4a7e7; 221 + } 222 + .wvrcode-entity.wvrcode-name.wvrcode-tag { 223 + color: #31748f; 224 + font-weight: bold; 225 + } 226 + .wvrcode-entity.wvrcode-other.wvrcode-attribute-name { 227 + color: #c4a7e7; 228 + } 229 + .wvrcode-support.wvrcode-function { 230 + color: #ebbcba; 231 + font-weight: bold; 232 + } 233 + .wvrcode-support.wvrcode-constant { 234 + color: #f6c177; 235 + font-weight: bold; 236 + } 237 + .wvrcode-support.wvrcode-type, .wvrcode-support.wvrcode-class { 238 + color: #9ccfd8; 239 + font-weight: bold; 240 + } 241 + .wvrcode-support.wvrcode-other.wvrcode-variable { 242 + color: #eb6f92; 243 + font-weight: bold; 244 + } 245 + .wvrcode-invalid { 246 + color: #e0def4; 247 + background-color: #eb6f92; 248 + } 249 + .wvrcode-invalid.wvrcode-deprecated { 250 + color: #e0def4; 251 + background-color: #c4a7e7; 252 + } 253 + .wvrcode-punctuation, .wvrcode-keyword.wvrcode-operator { 254 + color: #908caa; 255 + } 256 + </style> 257 + </head> 258 + <body> 259 + <h1>In a short paragraph, tell us about your project and what you're building.</h1> 260 + <p>Weaver is designed to be a highly flexible platform for medium and long-form writing on atproto. I was inspired by how weaver birds build their own homes, and by the notebooks, physical and virtual, that I create in the course of my work, to ideate, to document, and to inform. The initial proof-of-concept is a static site generator, able to turn a Markdown text file or a folder of Markdown files, such as an Obsidian vault or git repository documentation, into a static "notebook" site. The file is uploaded to your PDS, where it can be accessed, either directly, via a minimal appview layer that provides a friendlier web address than an XRPC request or CDN link, or hosted on a platform of your choice, be that your own server or any other static site hosting service. The intermediate goal is an elegant and intuitive writing platform with collaborative editing and straightforward, immediate publishing via a web-app. The ultimate goal is to build a platform suitable for professional writers and journalists, an open alternative to platforms like Substack, with ways for readers to support writers, all on the AT protocol. Currently it is in the earliest stages of development, working on core components such as the parsing and rendering backend, command-line client, and initial appview. The plan is to have the proof-of-concept ready for testing in June, and to immediately begin using it for my own writing, as well as information and updates about the project.</p> 261 + <h1>How do you plan to use this grant? Feel free to be specific.</h1> 262 + <p>I plan to use the grant money to help with hosting and/or hardware costs (such as VPS rental fees or upgrades to my homelab, like a backup internet connection), and potentially to offset the costs of incorporation. If I'm not able to dedicate enough time to this or bring other people onto the project, it won't get off the ground, and some help with expenses makes that possible.</p> 263 + <h1>Who are you? Please provide a brief bio or background about yourself.</h1> 264 + <p>I'm Orual, an electronics designer and software engineer who routinely works across the entire stack from bare metal microcontrollers all the way up to web services, UX development, and AI. I grew up getting mail delivered by single-engine Cessna airplane to a grass airstrip outside a tiny village in Congo and listening to my parents talk with people half-way across the country on a short-wave radio, later using an early satellite phone to send email, the ultimate decentralized information network, maybe. I wrote my first line of code when I was ten, started building robots soon after, got into university for engineering, designed and built electronic musical instruments, dropped out of university, transitioned my sex, learned a ton about programming and electronics, went back to college and got into research.</p> 265 + <p>Currently, I work part-time as a principal investigator in a small applied research lab at a college, helping startups and other businesses with product development and prototyping. I'm a long-time enthusiast for blogging and other forms of extended online writing, but have always been dissatisfied with existing solutions, which is the impetus for Weaver, and because of my experience across the whole tech stack, I think I can deliver something really great.</p> 266 + <h1>What excites you about building in the ATProto/Bluesky ecosystem? This helps us understand what's driving you.</h1> 267 + <p>I'm a Utopian in the Terra Ignota sense. I want to see us flourish and go out into the universe. I want people to be free and able to create and build wonders, not beholden to any sovereigns, in whatever forms they wish. My vocation is engineering. It is the thing I cannot help but do, and I take great pleasure and pride in it. In the ATProto ecosystem I see a way to direct my skills toward creating the kinds of tools and platforms that empower people.</p> 268 + <p>I got onto Bluesky early and was immediately hooked for a number of reasons. The first is the actual protocol itself. How it does identity, how the user maintains control over their identity and data, largely independent of hosting and services, and how no single service needs to do it all, you can mix and match. It's the embodiment of a lot of the ideas I've had about how the social web should work for a long time.</p> 269 + <p>In addition to championing the atproto identity model and overall philosophy to clients at work, I’ve done some early explorations with private data and varied interaction modalities via embedded systems, such as a Rust XRPC client for microcontrollers like the ESP32. I've been watching projects like Whitewind and Leaflet explore the long-form atproto writing space, and I think there's room for a more flexible, extensible, and collaborative approach to the concept on the protocol.</p> 270 + <p>The other primary staying factor has been the community. The Bluesky dev team has been so enthusiastic and welcoming for those who want to work on and with the protocol. One personal example is that of Morpho, an Android Bluesky client, which received an ATProtocol microgrant. I’ve made a lot of friends on Bluesky, and I want to grow the ecosystem which allowed that to happen, to help it flourish and become more than just a grand dream behind a Twitter clone.</p> 271 + <h1>How does your project align with our goal of accelerating growth in the ATProto/Bluesky ecosystem with developer tools?</h1> 272 + <p>The initial alpha version of Weaver is targeted at developers and people otherwise comfortable with a terminal. It aims to bring the process of documenting your tools, educating people, and otherwise writing and publishing things that don’t fit well into a Bluesky post or thread onto the protocol in a way that is highly flexible. If that is all that it does, that’s excellent and meets a need that I see in the community. It would provide a consistent way to make a blog built on ATProto without everyone having to reinvent part or all of the wheel, or do programming they don't want to do.</p> 273 + <p>As Weaver develops further and targets a less technical audience, it will retain those more developer-focused modes of use, for people who want to do something more specialized with it, have a workflow they like which doesn’t mesh with the web editor (and if they want to write their own tooling on top of Weaver, more power to them), or just want to run it all themselves. Developers are also the initial audience because the alpha will inevitably be rough around the edges, and nobody provides quality feedback like other developers.</p> 274 + <h1>How does your project align with our goal of empowering communities with the tools to cultivate and sustain themselves?</h1> 275 + <p>Communities don’t just need microblogging posts and algorithmic feeds. They need places for longer-form content, less ephemeral works they can point to; stories, essays, rules, histories, articles, and so on. One of the biggest downsides of so many companies and communities moving onto closed platforms like Discord was the lack of durability of any content by default and the inability to easily access and search it from outside the platform, and one of the downsides of “identity-follower”-based platforms like Bluesky (where relationships are about following specific people) is that they produce communities highly focused on specific people as much as specific topics or interests. Weaver notebooks and entries within them can be throwaways, but they’re intended to stick around and remain accessible in a consistent way (unless taken down).</p> 276 + <p>There’s a need for better tools for that kind of thing on the protocol right now, as currently a lot of stuff is bespoke, feels incomplete as an experience, or is just not really connected to the protocol and so misses on some of the data ownership of ATProto.</p> 277 + <p>One aspect which makes Weaver as designed good for communities is simply that, unlike with Bluesky, where a follower is a follower and you only have one identity, you can have more than one notebook (and they can be shared between multiple authors), and more than one author profile. Someone might make a personal blog, or one for a project, or to write a piece of web fiction with a friend, either all under the same profile or under different ones, as fits their wants and needs. People have different contextual identities but don’t necessarily want to make alt accounts, and a writing platform for people should reflect that.</p> 278 + <p>Collaborative editing is a great feature for communities as well. People can workshop something with their friends and then publish it instantly. You could build a wiki for a fandom community on Weaver. Two journalists could publish a newsletter together, and bring on an editor to tighten up their articles. And over time, Weaver would ultimately support payments, helping creators fund their work.</p> 279 + <h1>How does your project align with our goal of giving people direct, unmediated access to their audiences?</h1> 280 + <p>The first and maybe most powerful thing I’m going to give people that sort of direct and durable access is building complete self-hosting into it from day 1, inverting the pattern Bluesky followed. Weaver is designed to outlive Bluesky and even to some extent the AT Protocol. The failure mode is much the same as a tool like Obsidian, which is a direct inspiration. Because the core document format is Markdown, which is fundamentally just a text file you can load up in any editor, and the basic tools are designed to work without any ATProto authentication, people can keep using them and easily port or host the contents however they wish. You can go where your audience is.</p> 281 + <p>Beyond that, the platform features are all about making the process of writing something and putting it out there for people to read as simple as possible, in a way that means you have ownership of that data, the same as anything else on the protocol, Even when collaborating on a document, you retain control, via much the same means that each person's repository uses to maintain consistency. And since it's designed to interoperate widely, you can easily bring notebooks and entries from Weaver to your audience on Bluesky or any other ATProto platform, and they can comment on them from Bluesky.</p> 282 + <h1>Other things to share?</h1> 283 + <p>Here's a bit more technical detail on what will underpin the collaborative features. A notebook entry on the protocol is a type of CRDT, a conflict-free replicated data type, built on top of Loro, stored as a series of your edit records on top of a root record in your own repository (with others’ edit records being stored in their own repositories), along with the contents of the most recently seen (and most recently published) versions.</p> 284 + <p>With the combination of those pieces, if one person deletes a notebook or entry, everyone else in the list of authors retains the contents and can recreate most of the edit history, even if the Weaver appview doesn't have the deleted records cached.</p> 285 + <p>The appview itself is a couple of components. One is a lightweight entryway service, which mostly provides that friendly external url for published notebooks, redirecting to an author's PDS or a CDN and handling some authentication (e.g. to ensure that, while an unpublished or controlled-audience notebook or entry does exist in one's PDS unencrypted, one cannot just navigate to it). The second component is the backend for the collaborative features and will host the web-based editing and navigation interface. All of this is designed to be used or run independently if desired.</p> 286 + </body> 287 + </html>