rustfst 1.3.0

Library for constructing, combining, optimizing, and searching weighted finite-state transducers (FSTs).
Documentation
use anyhow::Result;
use serde::{Deserialize, Serialize};

use crate::algorithms::queues::AutoQueue;
use crate::algorithms::tr_filters::AnyTrFilter;
use crate::algorithms::Queue;
use crate::fst_impls::VectorFst;
use crate::semirings::{SerializableSemiring, WeaklyDivisibleSemiring, WeightQuantize};
use crate::tests_openfst::FstTestData;
use crate::StateId;

#[derive(Serialize, Deserialize, Debug, Clone)]
struct QueueOperation {
    op_type: String,
    state: StateId,
}

#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct QueueOperationResult {
    result: Vec<QueueOperation>,
}

pub fn test_queue<W>(test_data: &FstTestData<W, VectorFst<W>>) -> Result<()>
where
    W: SerializableSemiring + WeightQuantize + WeaklyDivisibleSemiring,
{
    let mut queue = AutoQueue::new(&test_data.raw, None, &AnyTrFilter {})?;

    for op in &test_data.queue.result {
        match op.op_type.as_str() {
            "enqueue" => {
                queue.enqueue(op.state);
            }
            "dequeue" => {
                assert!(!queue.is_empty());
                assert_eq!(op.state, queue.head().unwrap());
                queue.dequeue();
            }
            _ => panic!("Unknown op_type : {:?}", op.op_type.as_str()),
        };
    }

    assert!(queue.is_empty());
    Ok(())
}