#![no_std]
#![doc(test(
no_crate_inject,
attr(
deny(warnings, rust_2018_idioms, single_use_lifetimes),
allow(dead_code, unused_variables)
)
))]
#![forbid(unsafe_code)]
#![warn(
missing_debug_implementations,
missing_docs,
rust_2018_idioms,
single_use_lifetimes,
unreachable_pub
)]
#![warn(
clippy::pedantic,
// lints for public library
clippy::alloc_instead_of_core,
clippy::exhaustive_enums,
clippy::exhaustive_structs,
// clippy::std_instead_of_alloc, // alloc requires Rust 1.36
clippy::std_instead_of_core,
)]
#![allow(
clippy::cast_lossless,
clippy::cast_possible_truncation,
clippy::cast_precision_loss,
clippy::cast_sign_loss,
clippy::manual_map, // Option::map is not const
clippy::module_name_repetitions,
clippy::must_use_candidate,
clippy::redundant_pattern_matching, // const Option::is_some requires Rust 1.48
)]
#![cfg_attr(docsrs, feature(doc_cfg))]
#[cfg(doc)]
extern crate self as easytime;
#[cfg(feature = "std")]
extern crate std;
#[cfg(feature = "std")]
#[cfg(test)]
#[path = "gen/assert_impl.rs"]
mod assert_impl;
mod duration;
pub use crate::duration::Duration;
#[cfg(feature = "std")]
mod instant;
#[cfg(feature = "std")]
pub use crate::instant::Instant;
mod error;
pub use crate::error::TryFromTimeError;
#[inline]
fn pair_and_then<A, B, C, F>(x: Option<A>, y: Option<B>, f: F) -> Option<C>
where
F: FnOnce(A, B) -> Option<C>,
{
match (x, y) {
(Some(x), Some(y)) => f(x, y),
_ => None,
}
}