# Pipecircuit
> **HERE BE DRAGONS**
>
> You probably shouldn't be using this, yet.
Correct. Robust. Fast. Portable.\
Pick four.
A Rust framework for software development that's strict enough to hand to an
agent, with performance you'll be proud to ship.
The `storage` feature provides bounded primary-indexed structure-of-arrays
through `pipecircuit::storage::warp_table`. The default
`secondary-indexes` feature adds declared Roaring-backed secondary indexes,
fluent set-algebra queries over opaque selections, and ordered selections
ranked by bit-sliced range indexes. Query results resolve to
flat generated row references containing `id` beside the declared row fields;
internal stable membership and bitmap representations never enter the public
query surface.
The present storage and secondary-query implementation uses `alloc`. A future
feature boundary should let consumers select fixed-capacity and alloc-backed
storage/query facilities independently; the current API does not pre-empt that
design.
A `Pipe` names independent inbound and outbound semantic families. An
`InstalledPipe<Protocol, Transport>` installs concrete access to that contract.
A local implementation can be a core machine that does not implement `Pipe`:
```rust
use pipecircuit::{Inline, InstalledPipe, Pipe, StateMachine, StepInputOf};
struct Counter(u8);
impl StateMachine for Counter {}
struct Read;
impl StepInputOf<Counter> for Read {
type Outcome = u8;
fn step(self, counter: &mut Counter) -> u8 { counter.0 }
}
struct Counting;
impl Pipe for Counting {
type In<'message> = Read;
type Out<'message> = u8;
}
let mut installed = InstalledPipe::<Counting, _>::new(Inline::for_pipe(Counter(7)));
assert_eq!(installed.send(Read), 7);
```
`Inline` proves one synchronous step returns exactly the pipe's output.
Other transports implement `TransportTo` and `TransportFrom` independently:
submission is a physical fact, not a promise of an immediate semantic response.
A foreign program can fulfill the contract without running Pipecircuit.
The 0.0.17 API renames `Participant` to `Pipe`, the former installed `Pipe`
to `InstalledPipe`, and `DuplexFitting` to `DuplexTransport`. `PipeIn` and
`PipeOut` select directional codec families. `Inline::new` retains the direct
machine-as-contract form; `Inline::for_pipe` selects a separate contract.