Skip to main content

libpetri_core/
lib.rs

1//! # libpetri-core — Core Types for Coloured Time Petri Nets
2//!
3//! This crate defines the structural model: places, tokens, transitions, arcs,
4//! and timing constraints. It contains no execution logic — see
5//! [`libpetri-runtime`](https://docs.rs/libpetri-runtime) for that.
6//!
7//! ## Concepts
8//!
9//! | Type | Description |
10//! |------|-------------|
11//! | [`Place<T>`](place::Place) | Typed, named token container. Identity by name. |
12//! | [`Token<T>`](token::Token) | Immutable value + timestamp. |
13//! | [`Transition`](transition::Transition) | Consumes/produces tokens via arcs. Optional timing and priority. |
14//! | [`PetriNet`](petri_net::PetriNet) | Immutable net definition built via builder pattern. |
15//!
16//! ## Arc Types
17//!
18#![doc = include_str!("../doc/arc_types.svg")]
19//!
20//! | Arc | Module | Semantics |
21//! |-----|--------|-----------|
22//! | **Input** | [`input`] | Consume tokens (one, exactly N, at least N, all) |
23//! | **Output** | [`output`] | Produce tokens (single, AND-fork, XOR-split, timeout) |
24//! | **Inhibitor** | [`arc`] | Block firing when place has tokens |
25//! | **Read** | [`arc`] | Require token without consuming |
26//! | **Reset** | [`arc`] | Clear all tokens from place on firing |
27//!
28//! ## Timing Modes
29//!
30#![doc = include_str!("../doc/timing_modes.svg")]
31//!
32//! | Mode | Interval | Factory |
33//! |------|----------|---------|
34//! | Immediate | \[0, ∞) | [`timing::immediate()`] |
35//! | Deadline | \[0, d\] | [`timing::deadline(ms)`](timing::deadline) |
36//! | Delayed | \[d, ∞) | [`timing::delayed(ms)`](timing::delayed) |
37//! | Window | \[a, b\] | [`timing::window(a, b)`](timing::window) |
38//! | Exact | \[t, t\] | [`timing::exact(ms)`](timing::exact) |
39//!
40//! ## Quick Example
41//!
42//! ```rust
43//! use libpetri_core::place::Place;
44//! use libpetri_core::token::Token;
45//! use libpetri_core::transition::Transition;
46//! use libpetri_core::petri_net::PetriNet;
47//! use libpetri_core::input::one;
48//! use libpetri_core::output::out_place;
49//! use libpetri_core::action::fork;
50//! use libpetri_core::timing::delayed;
51//!
52//! let inbox = Place::<String>::new("inbox");
53//! let outbox = Place::<String>::new("outbox");
54//!
55//! let send = Transition::builder("send")
56//!     .input(one(&inbox))
57//!     .output(out_place(&outbox))
58//!     .timing(delayed(100))
59//!     .action(fork())
60//!     .build();
61//!
62//! let net = PetriNet::builder("mailer")
63//!     .transition(send)
64//!     .build();
65//!
66//! assert_eq!(net.transitions().len(), 1);
67//! ```
68
69pub mod action;
70pub mod arc;
71pub mod context;
72pub mod input;
73pub mod output;
74pub mod petri_net;
75pub mod place;
76pub mod timing;
77pub mod token;
78pub mod transition;