/** * ioState :: IO a -> State IO a * * @param M\IO $io * * @return M\State */ function ioState(M\IO $io) { return M\State::of(function ($state) use($io) { list($key, $data) = $state; $value = $io->run(); $data[$key] = $value; $newState = [$key, $data]; return [$value, $newState]; }); }
/** * until :: (a -> Bool) -> (a -> b -> b) -> b -> IO a -> IO b * * @param callable $predicate (a -> Bool) * @param callable $do (a -> b -> a) * @param mixed $base b * @param M\IO $ioValue IO a * * @return M\IO */ function until(callable $predicate, callable $do, $base, M\IO $ioValue) { return M\IO::of(function () use($predicate, $do, $base, $ioValue) { do { $value = $ioValue->run(); $isFulfilled = $predicate($value); $base = $isFulfilled ? $base : call_user_func($do, $value, $base); } while (!$isFulfilled); return $base; }); }
/** * tryCatch :: Exception e => IO a -> (e -> IO a) -> IO a * * @param M\IO $io * @param callable $catchFunction * * @return M\IO */ function tryCatch(M\IO $io = null, callable $catchFunction = null) { return call_user_func_array(f\curryN(2, function (M\IO $io, callable $catchFunction) { return M\IO::of(function () use($io, $catchFunction) { try { return $io->run(); } catch (\Exception $e) { return call_user_func($catchFunction, $e); } }); }), func_get_args()); }