// types — error union, mode/whence enums, reader/writer/closer // fn-type aliases. Project #94 fold-eFinal; the fn-aliases target // `stream` (= `*vtable`, the single io surface). // // Hare splits the io module across stream.ha + types.ha and ww does // the same: lib/io/io.ww owns the `eof` and `underread` tags; // lib/io/stream.ww owns the vtable surface (`vtable`, `stream`, // `read`/`write`/`close` dispatch); this file owns the surrounding // port. The three files share `package io;` so cross-file refs // resolve via the dir-enum concat order (io.ww < stream.ww < types.ww // — `stream` lands before the reader/writer/closer aliases below). // // Deferrals (drew-signed): `handle`, `seeker`, `copier`, `strerror` // land with io fold-2 (#5; need the `handle` sum). Hare's `EOF = done` // stays as `io.eof` until the `done` singleton ships (#93). package io; import errors; // ref/hare/io/types.ha:29-34. RDWR is spelled `3` rather than Hare's // `READ | WRITE` because the ww parser doesn't fold expressions in // enum value positions; the value SSoT stays the same bitfield. export type mode = enum u8 { NONE = 0, READ = 1, WRITE = 2, RDWR = 3, }; // ref/hare/io/types.ha:37-41. Hare leaves the underlying implicit; // ww requires one. i32 matches the off type that fold-e2 will plug // into the seeker signature. export type whence = enum i32 { SET = 0, CUR = 1, END = 2, }; // ref/hare/io/types.ha:11 spreads `...errors::error` into the union; // ww enumerates the tags explicitly (ken's #204-block — spread of an // errors-side tagged into this union triggers a wrapper-vs-flatten // layout mismatch; #199b layout-extension is the deferred fix). The // read/write dispatchers in stream.ww return `errors.unsupported` // when the matching vtable slot is unset, so the variant lands here // directly. export type error = !(errors.unsupported | underread | nomem); // ref/hare/io/types.ha:46. `eof` (not Hare's `done`) per the io.ww // rationale; lifts to `done` with #93. `stream` forward-refs the // `*vtable` alias in stream.ww — the dispatcher receives the vtable // pointer directly (Hare's stream.ha:33 + types.ha:46 collapse). export type reader = fn(s: stream, buf: []u8) (size | eof | error); // ref/hare/io/types.ha:51. No `const` qualifier — ww has none, and // lib/sort/sort.ww:18 drops it the same way. export type writer = fn(s: stream, buf: []u8) (size | error); // ref/hare/io/types.ha:55. export type closer = fn(s: stream) (void | error);