aboutsummaryrefslogtreecommitdiff
path: root/console/console.go
diff options
context:
space:
mode:
Diffstat (limited to 'console/console.go')
-rw-r--r--console/console.go53
1 files changed, 53 insertions, 0 deletions
diff --git a/console/console.go b/console/console.go
new file mode 100644
index 0000000..4fe9680
--- /dev/null
+++ b/console/console.go
@@ -0,0 +1,53 @@
+package console
+
+import (
+ "context"
+ "fmt"
+ "io"
+ "os"
+)
+
+type Console struct {
+ r io.Reader
+ w io.Writer
+ ich, och chan uint16
+}
+
+func New(ctx context.Context) *Console {
+ c := &Console{
+ r: os.Stdin,
+ w: os.Stdout,
+ ich: make(chan uint16, 1),
+ och: make(chan uint16, 1),
+ }
+ go c.read(ctx)
+ go c.write(ctx)
+ return c
+}
+
+func (c *Console) read(ctx context.Context) {
+ var v uint16
+ for {
+ fmt.Fscanf(c.r, "%c", &v)
+ select {
+ case <-ctx.Done():
+ return
+ case c.ich <- v:
+ }
+ }
+}
+
+func (c *Console) write(ctx context.Context) {
+ for {
+ select {
+ case <-ctx.Done():
+ return
+ case v := <-c.och:
+ fmt.Fprintf(c.w, "%c", v)
+ }
+ }
+}
+
+func (c *Console) Read() uint16 { return <-c.ich }
+func (c *Console) Write(v uint16) { c.och <- v }
+func (c *Console) Len() uint16 { return uint16(len(c.ich)) }