1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
//! unsure.rs - implements a custom [`Unsure<T>`] enum which is essentially
//! [`Option<T>`] with an additional `Reject` variant, for handling values that
//! are deemed to be wholly negative rather than undefined.
//!
//! Uses Haskell variant names, so as to not conflict with Rust's `Option` enum,
//! which is defined globally across every Rust program.
//!
//! It's sort of like [`Option<T>`] with a [`Result<T, E>`] twist. Although it's
//! really just an [`Option<T>`] with two [`None`]-adjacent variants.
//!
//! This file is part of [unsure-rs](https://codeberg.org/AeriaVelocity/unsure-rs).
//!
//! (c) 2025 Arsalan "Aeri" Kazmi <https://aeriavelocity.dev>
//!
//! ```rust
//! // It's recommended to use the wildcard import so you don't have to type out
//! // `unsure::Unsure::` every single time you want to use a variant.
//! use unsure::Unsure::{self, *};
//!
//! fn main() {
//! let unsure_value: Unsure<i32> = some_function_that_might_fail();
//!
//! match unsure_value {
//! Just(value) => println!("Value: {}", value),
//! Nothing => eprintln!("The function returned nothing"),
//! Reject => eprintln!("The function rejected the request"),
//! }
//! }
//! ```
//!
//! unsure.rs is free software: you can redistribute it and/or modify
//! it under the terms of the GNU General Public License as published by
//! the Free Software Foundation, either version 3 of the License, or
//! (at your option) any later version.
//!
//! unsure.rs is distributed in the hope that it will be useful,
//! but WITHOUT ANY WARRANTY; without even the implied warranty of
//! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
//! GNU General Public License for more details.
//!
//! You should have received a copy of the GNU General Public License
//! along with unsure.rs. If not, see
//! <https://www.gnu.org/licenses/gpl-3.0.html>.
/// The `Unsure` type. Used to handle a potential failure where there would
/// otherwise be an `Option`.
use *;