module IOMcn ( IOMcn, runIOMcn, (>>>), arr, app, getLn, getInt, putLn, isEven) where import Data.Time newtype IOMcn a b = IOMcn { getIOMcn :: a -> IO b } runIOMcn :: IOMcn () a -> IO a runIOMcn m = getIOMcn m () (>>>) :: IOMcn a b -> IOMcn b c -> IOMcn a c m1 >>> m2 = IOMcn $ \x -> getIOMcn m1 x >>= getIOMcn m2 arr :: (a -> b) -> IOMcn a b arr f = IOMcn $ return . f app :: IOMcn (IOMcn a b, a) b app = IOMcn $ uncurry getIOMcn getLn :: IOMcn () String getLn = IOMcn $ const getLine getInt :: IOMcn () Int getInt = IOMcn . const $ read <$> getLine putLn :: IOMcn String () putLn = IOMcn putStrLn isEven :: IOMcn () Bool isEven = IOMcn . const $ even . floor . utctDayTime <$> getCurrentTime