hypersteeldb 0.5.3

A database that compiles questions instead of guessing answers: typed vocabulary discovered from your documents, queries type-checked before they run, roaring-bitmap set algebra over reified hyperedges, and Dempster-Shafer evidence with an explicit conflict guard.
Documentation
//! The README's opening example, kept as a runnable example so it cannot drift from reality.
//!
//! `cargo run --example quickstart`
use steeldb::SteelDb;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let docs = [
        "Morty Shade defeated Wallace Gale at Ecruteak City during the Indigo Invitational in 2025.",
        "Bea Strike defeated Iris Draco at Ecruteak City during the Indigo Invitational in 2025.",
        "Juan Tide defeated Cynthia Ward at Ecruteak City during the Indigo Invitational in 2026.",
        "A habitat survey recorded Aggron near Sootopolis City at an elevation of 1082 m.",
        "A habitat survey recorded Salamence near Sootopolis City at an elevation of 2369 m.",
        "A habitat survey recorded Milotic near Sootopolis City at an elevation of 340 m.",
        "Milotic is not permitted in Series 1 play for the 2025 season.",
        "Metagross is permitted in Series 4 play for the 2026 season.",
    ];

    let db = SteelDb::ingest(docs)?;
    println!("indexed {} situations", db.len());

    println!("\nyou can ask about:");
    for c in db.categories() {
        println!("  {:<14} {}", c.wildcard(), c.words.iter().take(4).cloned().collect::<Vec<_>>().join(", "));
    }

    // use a category the corpus actually produced — see the list printed above
    let q = "(and elevation/* (not state/negated))";
    match db.query(q) {
        Ok(a) => {
            println!("\n{q}  ->  {} situations", a.len());
            for (id, text) in db.resolve(&a).take(2) {
                // chars(), not a byte slice: `&text[..n]` panics mid-character
                println!("  [{id}] {}", text.chars().take(56).collect::<String>());
            }
        }
        Err(r) => println!("\n{r}"),
    }

    // a category this corpus does not have — refused, not answered with an empty list
    match db.query("survey/*") {
        Ok(_) => println!("\nunexpected: survey is not a category here"),
        Err(r) => println!("\n{r}"),
    }

    match db.query("gene/brca1") {
        Ok(_) => println!("\nunexpected: that should not exist"),
        Err(r) => println!("\n{r}"),
    }

    println!("\nbelief in a denied claim: {}", db.belief("state/negated"));
    Ok(())
}