#!/usr/bin/env bx use io use string use sched use channel main() sched_init() ch(char) in ; ch_init(in) ch(string) out ; ch_init(out) reader r ; reader_init(&r, stdin, &in) tokenizer t ; tokenizer_init(&t, &in, &out) writer w ; writer_init(&w, &out, stdout) start(t) ; start(w) ; start(r) run() coro tokenizer(ch(char) *in, ch(string) *out) buffer token buffer_init(&token, 256) repeat char c rd(in, c) which c '\n' wr(out, str("\n")) '\t' . # switch to tab state _ wr(out, string_from_char(c)) # XXX should string_free this # # buffer_cat_char(c) coro reader(FILE *in, ch(char) *out) repeat int c = Fgetc(in) if c == EOF break wr(out, (char)c) coro writer(ch(string) *in, FILE *out) repeat string s rd(in, s) Fwrite_string(out, s) # the reader and writer block - need a select-based framework # should be renamed char_reader and string_writer channel(char) channel(string)