Files
enso/src/enso.nim
2025-12-26 17:36:30 -08:00

50 lines
1.2 KiB
Nim

import std/sugar
# Declarations
type
FileDesc* = enum STDIN, STDOUT, STDERR
IO*[T] = proc(): T
func flatmap*[T, U](io: IO[T], fn: T -> IO[U]): IO[U]
func lift*(fn: proc(): void): IO[void]
func lift*[T](fn: proc(): T): IO[T]
func join*[T](io: IO[IO[T]]): IO[T]
func map*[T, U](io: IO[T], fn: T -> U): IO[U]
func readstr*(stream: FileDesc): IO[string]
func run*[T](io: IO[T]): T
func strput*(str: string): IO[void]
func to_IO*[T](val: T): IO[T]
# Definitions
func flatmap*[T, U](io: IO[T], fn: T -> IO[U]): IO[U] = join(map(io, fn))
func lift*(fn: proc(): void): IO[void] =
proc(): void = fn()
func lift*[T](fn: proc(): T): IO[T] =
proc(): T = fn()
func join*[T](io: IO[IO[T]]): IO[T] = map(io, run)
func map*[T, U](io: IO[T], fn: T -> U): IO[U] =
proc(): U = fn(run(io))
func readstr*(stream: FileDesc): IO[string] =
case stream:
of STDIN:
lift proc(): string = readLine(stdin)
of STDOUT:
lift proc(): string = readLine(stdout)
of STDERR:
lift proc(): string = readLine(stderr)
func run*[T](io: IO[T]): T = io()
func strput*(str: string): IO[void] =
proc(): void = echo str
func to_IO*[T](val: T): IO[T] =
proc(): T = val