Skip to content

Commit b696011

Browse files
Marasystemic-engineer
authored andcommitted
♻️ rename crate: imperfect → terni (Latin: threefold)
The crate is terni. The type is Imperfect. The address changed. The name didn't.
1 parent a1eb137 commit b696011

8 files changed

Lines changed: 33 additions & 33 deletions

File tree

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
[package]
2-
name = "imperfect"
2+
name = "terni"
33
version = "0.1.0"
44
edition = "2021"
55
license = "Apache-2.0"

README.md

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
1-
# Imperfect
1+
# terni
22

33
> I wanna thank Brene Brown for her work.
44
55
Ternary error handling for Rust. Because computation is not binary.
66

7-
[![crates.io](https://img.shields.io/crates/v/imperfect.svg)](https://crates.io/crates/imperfect)
8-
[![docs.rs](https://docs.rs/imperfect/badge.svg)](https://docs.rs/imperfect)
9-
[![license](https://img.shields.io/crates/l/imperfect.svg)](https://github.com/systemic-engineering/prism/blob/main/imperfect/LICENSE)
7+
[![crates.io](https://img.shields.io/crates/v/terni.svg)](https://crates.io/crates/terni)
8+
[![docs.rs](https://docs.rs/terni/badge.svg)](https://docs.rs/terni)
9+
[![license](https://img.shields.io/crates/l/terni.svg)](https://github.com/systemic-engineering/prism/blob/main/imperfect/LICENSE)
1010

1111
## `eh`
1212

1313
The type. Three states instead of two.
1414

1515
```rust
16-
use imperfect::{Imperfect, ConvergenceLoss};
16+
use terni::{Imperfect, ConvergenceLoss};
1717

1818
let perfect: Imperfect<u32, String, ConvergenceLoss> = Imperfect::Success(42);
1919
let lossy = Imperfect::Partial(42, ConvergenceLoss::new(3));
@@ -24,7 +24,7 @@ assert!(lossy.is_partial());
2424
assert!(failed.is_err());
2525
```
2626

27-
[`Loss`](https://docs.rs/imperfect/latest/imperfect/trait.Loss.html) measures what didn't survive. It's a monoid: `zero()` identity, `combine` associative, `total()` absorbing.
27+
[`Loss`](https://docs.rs/terni/latest/terni/trait.Loss.html) measures what didn't survive. It's a monoid: `zero()` identity, `combine` associative, `total()` absorbing.
2828

2929
Three loss types ship with the crate:
3030
- **`ConvergenceLoss`** — distance to crystal. Combine: max.
@@ -38,7 +38,7 @@ Three loss types ship with the crate:
3838
The bind. Chain operations, accumulate loss.
3939

4040
```rust
41-
use imperfect::{Imperfect, ConvergenceLoss};
41+
use terni::{Imperfect, ConvergenceLoss};
4242

4343
let result = Imperfect::<i32, String, ConvergenceLoss>::Success(1)
4444
.eh(|x| Imperfect::Success(x * 2))
@@ -51,7 +51,7 @@ assert!(result.is_partial());
5151
For explicit context with loss accumulation:
5252

5353
```rust
54-
use imperfect::{Imperfect, Eh, ConvergenceLoss};
54+
use terni::{Imperfect, Eh, ConvergenceLoss};
5555

5656
let mut eh = Eh::new();
5757
let a = eh.eh(Imperfect::<i32, String, ConvergenceLoss>::Success(1)).unwrap();

docs/context.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ The `.eh()` pipeline is clean when every step returns `Imperfect`. But sometimes
1111
## Basic usage
1212

1313
```rust
14-
use imperfect::{Imperfect, Eh, ConvergenceLoss};
14+
use terni::{Imperfect, Eh, ConvergenceLoss};
1515

1616
fn process() -> Imperfect<i32, String, ConvergenceLoss> {
1717
let mut eh = Eh::new();
@@ -42,7 +42,7 @@ fn process() -> Imperfect<i32, String, ConvergenceLoss> {
4242
Creates a context with zero accumulated loss.
4343

4444
```rust
45-
use imperfect::{Eh, ConvergenceLoss};
45+
use terni::{Eh, ConvergenceLoss};
4646

4747
let eh: Eh<ConvergenceLoss> = Eh::new();
4848
assert!(eh.loss().is_none());
@@ -63,7 +63,7 @@ Aliases for `.eh()`, same as on `Imperfect` itself.
6363
Inspect accumulated loss without consuming the context. Returns `None` if no loss has accumulated (all steps were Success).
6464

6565
```rust
66-
use imperfect::{Imperfect, Eh, ConvergenceLoss};
66+
use terni::{Imperfect, Eh, ConvergenceLoss};
6767

6868
let mut eh: Eh<ConvergenceLoss> = Eh::new();
6969
assert!(eh.loss().is_none());
@@ -90,7 +90,7 @@ This is the exit point. It converts back from `Result`-land to `Imperfect`.
9090
`Eh` is the bridge between `Imperfect` and `Result`. Inside an `Eh` block, you can freely mix both:
9191

9292
```rust
93-
use imperfect::{Imperfect, Eh, ConvergenceLoss};
93+
use terni::{Imperfect, Eh, ConvergenceLoss};
9494
use std::num::ParseIntError;
9595

9696
fn parse_and_validate(input: &str) -> Imperfect<i32, String, ConvergenceLoss> {
@@ -132,7 +132,7 @@ The key insight: `Eh.eh()` returns `Result`, so you can match on it for early re
132132
## Example: payment verification
133133

134134
```rust
135-
use imperfect::{Imperfect, Eh, ConvergenceLoss};
135+
use terni::{Imperfect, Eh, ConvergenceLoss};
136136

137137
struct Payment { amount: u64, currency: String }
138138
struct VerifiedPayment { amount: u64, currency: String, risk_score: f64 }

docs/loss-types.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ Distance to crystal. How many steps remain before the result is fully converged.
3131
**Combine semantics:** `max`. The furthest-from-crystal step dominates. If one step is 3 iterations away and another is 7, the pipeline is 7 iterations away.
3232

3333
```rust
34-
use imperfect::{Imperfect, ConvergenceLoss};
34+
use terni::{Imperfect, ConvergenceLoss};
3535

3636
// Solver ran but didn't fully converge
3737
let step1 = Imperfect::<f64, String, ConvergenceLoss>::Partial(3.14, ConvergenceLoss::new(5));
@@ -55,7 +55,7 @@ Which dimensions were dark during observation. Tracks both which specific dimens
5555
**Combine semantics:** Union of dark dimensions, max of aperture fraction. If step A missed dims [1, 3] and step B missed dims [2, 3], the pipeline missed [1, 2, 3].
5656

5757
```rust
58-
use imperfect::{Imperfect, ApertureLoss};
58+
use terni::{Imperfect, ApertureLoss};
5959

6060
// Observed 8 of 10 dimensions — dims 2 and 7 were dark
6161
let step1 = Imperfect::<Vec<f64>, String, ApertureLoss>::Partial(
@@ -82,7 +82,7 @@ Decision uncertainty at a routing point. Measured as Shannon entropy of the rout
8282
**Combine semantics:** Max entropy (most uncertain routing dominates), min gap (tightest race dominates).
8383

8484
```rust
85-
use imperfect::{Imperfect, RoutingLoss};
85+
use terni::{Imperfect, RoutingLoss};
8686

8787
// Routed to model A with moderate confidence
8888
let step1 = Imperfect::<String, String, RoutingLoss>::Partial(
@@ -106,7 +106,7 @@ assert_eq!(result.loss().runner_up_gap(), 0.3);
106106
Implement `Loss` for any domain-specific measurement. The only requirements: `Clone + Default`, the four trait methods, and `combine` must be associative.
107107

108108
```rust
109-
use imperfect::{Loss, Imperfect};
109+
use terni::{Loss, Imperfect};
110110

111111
/// Tracks accumulated latency as loss.
112112
#[derive(Clone, Debug, PartialEq, Default)]

docs/migration.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ fn process(input: &str) -> Result<i32, String> {
3333
After:
3434

3535
```rust
36-
use imperfect::{Imperfect, ConvergenceLoss};
36+
use terni::{Imperfect, ConvergenceLoss};
3737

3838
fn process(input: &str) -> Imperfect<i32, String, ConvergenceLoss> {
3939
let n: i32 = match input.parse() {
@@ -68,7 +68,7 @@ fn run(a: &str, b: &str) -> Result<i32, String> {
6868
After:
6969

7070
```rust
71-
use imperfect::{Imperfect, Eh, ConvergenceLoss};
71+
use terni::{Imperfect, Eh, ConvergenceLoss};
7272

7373
# fn process(_: &str) -> Imperfect<i32, String, ConvergenceLoss> {
7474
# Imperfect::Success(1)
@@ -84,7 +84,7 @@ fn run(a: &str, b: &str) -> Imperfect<i32, String, ConvergenceLoss> {
8484
Or use the pipeline directly:
8585

8686
```rust
87-
use imperfect::{Imperfect, ConvergenceLoss};
87+
use terni::{Imperfect, ConvergenceLoss};
8888

8989
# fn process(_: &str) -> Imperfect<i32, String, ConvergenceLoss> {
9090
# Imperfect::Success(1)
@@ -99,7 +99,7 @@ fn run(a: &str, b: &str) -> Imperfect<i32, String, ConvergenceLoss> {
9999
`From` conversions let `Imperfect` and `Result` coexist:
100100

101101
```rust
102-
use imperfect::{Imperfect, ConvergenceLoss};
102+
use terni::{Imperfect, ConvergenceLoss};
103103

104104
// Result → Imperfect (Ok becomes Success, Err becomes Failure)
105105
let from_result: Imperfect<i32, String, ConvergenceLoss> =

docs/pipeline.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ Four rules. No exceptions.
1919
No loss on either side. The pipeline is perfect.
2020

2121
```rust
22-
use imperfect::{Imperfect, ConvergenceLoss};
22+
use terni::{Imperfect, ConvergenceLoss};
2323

2424
let result = Imperfect::<i32, String, ConvergenceLoss>::Success(1)
2525
.eh(|x| Imperfect::Success(x + 1));
@@ -32,7 +32,7 @@ assert_eq!(result, Imperfect::Success(2));
3232
The function introduced loss. It carries forward.
3333

3434
```rust
35-
use imperfect::{Imperfect, ConvergenceLoss};
35+
use terni::{Imperfect, ConvergenceLoss};
3636

3737
let result = Imperfect::<i32, String, ConvergenceLoss>::Success(1)
3838
.eh(|x| Imperfect::Partial(x + 1, ConvergenceLoss::new(3)));
@@ -46,7 +46,7 @@ assert_eq!(result.loss().steps(), 3);
4646
Both sides had loss. Losses combine.
4747

4848
```rust
49-
use imperfect::{Imperfect, ConvergenceLoss};
49+
use terni::{Imperfect, ConvergenceLoss};
5050

5151
let result = Imperfect::<i32, String, ConvergenceLoss>::Partial(1, ConvergenceLoss::new(3))
5252
.eh(|x| Imperfect::Partial(x + 1, ConvergenceLoss::new(5)));
@@ -60,7 +60,7 @@ assert_eq!(result.loss().steps(), 5); // max(3, 5) for ConvergenceLoss
6060
Failure short-circuits. If the input is Failure, `f` is never called. If `f` returns Failure, prior loss is discarded — the value is gone.
6161

6262
```rust
63-
use imperfect::{Imperfect, ConvergenceLoss};
63+
use terni::{Imperfect, ConvergenceLoss};
6464

6565
// Failure input: f is never called
6666
let result = Imperfect::<i32, String, ConvergenceLoss>::Failure("gone".into())
@@ -80,7 +80,7 @@ assert!(result.is_err());
8080
`.eh()` composes naturally. Each step sees the value from the previous step. Loss accumulates across the entire chain.
8181

8282
```rust
83-
use imperfect::{Imperfect, ConvergenceLoss};
83+
use terni::{Imperfect, ConvergenceLoss};
8484

8585
fn validate(input: &str) -> Imperfect<i32, String, ConvergenceLoss> {
8686
match input.parse::<i32>() {
@@ -123,7 +123,7 @@ assert_eq!(result.loss().steps(), 1); // max(1, 1) = 1 — sign corrected + cla
123123
Use whichever makes your code clearest. They compile to the same thing.
124124

125125
```rust
126-
use imperfect::{Imperfect, ConvergenceLoss};
126+
use terni::{Imperfect, ConvergenceLoss};
127127

128128
// All three are identical
129129
let a = Imperfect::<i32, String, ConvergenceLoss>::Success(1)

docs/terni-functor.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ For `.eh()` to be a genuine bind, it must satisfy three laws:
3737
`return a >>= f == f a`
3838

3939
```rust
40-
use imperfect::{Imperfect, ConvergenceLoss};
40+
use terni::{Imperfect, ConvergenceLoss};
4141

4242
fn f(x: i32) -> Imperfect<i32, String, ConvergenceLoss> {
4343
Imperfect::Partial(x * 2, ConvergenceLoss::new(1))
@@ -56,7 +56,7 @@ assert_eq!(left, right);
5656
`m >>= return == m`
5757

5858
```rust
59-
use imperfect::{Imperfect, ConvergenceLoss};
59+
use terni::{Imperfect, ConvergenceLoss};
6060

6161
let m = Imperfect::<i32, String, ConvergenceLoss>::Partial(5, ConvergenceLoss::new(3));
6262

@@ -72,7 +72,7 @@ Binding through `Success` (return) preserves the original value and loss.
7272
`(m >>= f) >>= g == m >>= (|x| f(x) >>= g)`
7373

7474
```rust
75-
use imperfect::{Imperfect, ConvergenceLoss};
75+
use terni::{Imperfect, ConvergenceLoss};
7676

7777
fn f(x: i32) -> Imperfect<i32, String, ConvergenceLoss> {
7878
Imperfect::Partial(x + 1, ConvergenceLoss::new(2))

src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
//! ### Pipeline
3333
//!
3434
//! ```rust
35-
//! use imperfect::{Imperfect, ConvergenceLoss};
35+
//! use terni::{Imperfect, ConvergenceLoss};
3636
//!
3737
//! let result = Imperfect::<i32, String, ConvergenceLoss>::Success(1)
3838
//! .eh(|x| Imperfect::Success(x * 2))
@@ -45,7 +45,7 @@
4545
//! ### Explicit Context
4646
//!
4747
//! ```rust
48-
//! use imperfect::{Imperfect, Eh, ConvergenceLoss};
48+
//! use terni::{Imperfect, Eh, ConvergenceLoss};
4949
//!
5050
//! let mut eh = Eh::new();
5151
//! let a = eh.imp(Imperfect::<i32, String, ConvergenceLoss>::Success(1)).unwrap();

0 commit comments

Comments
 (0)