portion_rs/
lib.rs

1//! [![ci-badge][]][ci] [![docs-badge][]][docs] [![crate-version]][crate-link]
2//!
3//! # portion-rs
4//!
5//! A simple interval library inspired by Python's `portion`.
6//!
7//! [ci]: https://github.com/Elinvynia/portion-rs/actions?query=workflow%3ARust
8//! [ci-badge]: https://img.shields.io/github/workflow/status/Elinvynia/portion-rs/Rust/master?style=flat-square
9//! [docs]: https://docs.rs/portion-rs
10//! [docs-badge]: https://img.shields.io/badge/docs-online-5023dd.svg?style=flat-square
11//! [crate-link]: https://crates.io/crates/portion-rs
12//! [crate-version]: https://img.shields.io/crates/v/portion-rs.svg?style=flat-square
13
14#![forbid(unsafe_code)]
15#![warn(missing_docs)]
16
17pub use interval::Interval;
18pub use ops::Operations;
19
20use crate::impls::Item;
21use crate::interval::IntervalType;
22use std::marker::PhantomData;
23
24pub(crate) mod helpers;
25pub(crate) mod impls;
26pub mod interval;
27pub(crate) mod iter;
28pub mod ops;
29
30/// Blank type used for interval creation.
31pub struct Portion<T: Item> {
32    data: PhantomData<T>,
33}
34
35impl<T: Item> Portion<T> {
36    /// Creates an open interval.
37    pub fn open(lower: T, upper: T) -> Interval<T> {
38        Interval {
39            lower: Some(lower),
40            upper: Some(upper),
41            itype: IntervalType::Open,
42        }
43    }
44
45    /// Creates a closed interval.
46    pub fn closed(lower: T, upper: T) -> Interval<T> {
47        Interval {
48            lower: Some(lower),
49            upper: Some(upper),
50            itype: IntervalType::Closed,
51        }
52    }
53
54    /// Creates an empty interval.
55    pub fn empty() -> Interval<T> {
56        Interval {
57            lower: None,
58            upper: None,
59            itype: IntervalType::Empty,
60        }
61    }
62
63    /// Creates a singleton interval.
64    pub fn singleton(value: T) -> Interval<T> {
65        Interval {
66            lower: Some(value),
67            upper: None,
68            itype: IntervalType::Singleton,
69        }
70    }
71
72    /// Creates an open-closed interval.
73    pub fn openclosed(lower: T, upper: T) -> Interval<T> {
74        Interval {
75            lower: Some(lower),
76            upper: Some(upper),
77            itype: IntervalType::OpenClosed,
78        }
79    }
80
81    /// Creates a closed-open interval.
82    pub fn closedopen(lower: T, upper: T) -> Interval<T> {
83        Interval {
84            lower: Some(lower),
85            upper: Some(upper),
86            itype: IntervalType::ClosedOpen,
87        }
88    }
89}