let { Functor } = import! std.functor
let { Applicative } = import! std.applicative
let { Monad } = import! std.monad
let io_prim @ { IO } = import! std.io.prim
let functor : Functor IO = {
map = \f -> io_prim.flat_map (\x -> io_prim.wrap (f x)),
}
let applicative : Applicative IO =
let wrap = io_prim.wrap
let apply f x = io_prim.flat_map (\g -> io_prim.flat_map (\y -> wrap (g y)) x) f
{ functor, apply, wrap }
let monad : Monad IO = {
applicative = applicative,
flat_map = io_prim.flat_map,
}
{ IO, functor, applicative, monad }