use crate::prelude::*;
#[derive(Clone, Copy, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd, QuickCheck)]
pub struct Io<A>(A);
monad! {
Io<A>:
fn consume(b) {
Io(b)
}
fn bind(self, f) {
f(self.0)
}
}
#[must_use]
#[inline(always)]
pub fn get_line_stdin() -> Hazard<Io<String>, String> {
let mut s = String::new();
match std::io::stdin().read_line(&mut s) {
Ok(_) => Success(consume(s)),
Err(e) => Failure(e.to_string()),
}
}
#[inline(always)]
pub fn put<S: core::fmt::Display>(s: S) -> Io<()> {
#![allow(clippy::print_stdout)]
consume(print!("{s}"))
}
#[inline(always)]
pub fn put_line<S: core::fmt::Display>(s: S) -> Io<()> {
#![allow(clippy::print_stdout)]
consume(println!("{s}"))
}