use perdix::{Buffer, AgentType};
use std::thread;
use std::time::Duration;
fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("=== Perdix Basic Usage Example ===\n");
simple_usage()?;
threaded_usage()?;
batch_processing()?;
Ok(())
}
fn simple_usage() -> Result<(), Box<dyn std::error::Error>> {
println!("Example 1: Simple Single-Threaded Usage");
println!("---------------------------------------");
let mut buffer = Buffer::new(256)?;
let (mut producer, mut consumer) = buffer.split_mut();
let messages = [
(b"System initializing..." as &[u8], AgentType::System),
(b"User query received", AgentType::User),
(b"Processing request...", AgentType::Assistant),
(b"Task completed successfully!", AgentType::Info),
];
for (text, agent_type) in messages.iter() {
producer.try_produce(text, *agent_type);
println!("Produced: {:?} - {}", agent_type, std::str::from_utf8(text)?);
}
println!("\nConsuming messages:");
while let Some(message) = consumer.try_consume() {
println!("Consumed: Type {:?} - \"{}\"",
message.agent_type(),
message.as_str());
}
println!("\n");
Ok(())
}
fn threaded_usage() -> Result<(), Box<dyn std::error::Error>> {
println!("Example 2: Multi-Threaded Producer-Consumer");
println!("-------------------------------------------");
let buffer = Buffer::new(1024)?;
let (producer, consumer) = buffer.split();
let producer_handle = thread::spawn(move || {
let mut producer = producer;
for i in 0..10 {
let message = format!("Message #{} from producer thread", i);
producer.try_produce(message.as_bytes(), AgentType::Assistant);
thread::sleep(Duration::from_millis(10));
}
println!("Producer thread finished");
});
let consumer_handle = thread::spawn(move || {
let mut consumer = consumer;
let mut count = 0;
while count < 10 {
if let Some(message) = consumer.try_consume() {
println!("Consumer received: \"{}\"", message.as_str());
count += 1;
} else {
thread::sleep(Duration::from_millis(5));
}
}
println!("Consumer thread finished");
});
producer_handle.join().unwrap();
consumer_handle.join().unwrap();
println!("\n");
Ok(())
}
fn batch_processing() -> Result<(), Box<dyn std::error::Error>> {
println!("Example 3: Batch Processing");
println!("---------------------------");
let mut buffer = Buffer::new(512)?;
let (mut producer, mut consumer) = buffer.split_mut();
let batch_size = 32;
println!("Producing batch of {} messages...", batch_size);
for i in 0..batch_size {
let agent_type = match i % 4 {
0 => AgentType::System,
1 => AgentType::User,
2 => AgentType::Assistant,
_ => AgentType::Info,
};
let message = format!("Batch message {}", i);
producer.try_produce(message.as_bytes(), agent_type);
}
println!("Consuming messages in batches of 8:");
let mut total_consumed = 0;
while total_consumed < batch_size {
let mut batch_consumed = 0;
while batch_consumed < 8 {
if let Some(message) = consumer.try_consume() {
batch_consumed += 1;
total_consumed += 1;
} else {
break; }
}
if batch_consumed > 0 {
println!(" Consumed batch of {} messages", batch_consumed);
}
}
println!("Total messages processed: {}\n", total_consumed);
Ok(())
}