From 4f07f821e0d04e0cb6ec62d1d5bc3999dd7ba89a Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Mon, 15 Jan 2018 00:06:40 +0100 Subject: use context for cancelation --- console.go | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 51 insertions(+), 5 deletions(-) (limited to 'console.go') diff --git a/console.go b/console.go index 5c63fbb..3b15a48 100644 --- a/console.go +++ b/console.go @@ -1,15 +1,61 @@ package j1 import ( + "context" + "fmt" "io" "os" ) -type Console struct { - io.Reader - io.Writer +type console struct { + r io.Reader + w io.Writer + ich, och chan uint16 } -func NewConsole() *Console { - return &Console{Reader: os.Stdin, Writer: os.Stdout} +func NewConsole(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)) } -- cgit v1.2.3