From 07584da73461b69043451ebe48fcac226202492a Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Wed, 24 Jan 2018 00:25:10 +0100 Subject: extract console, extract context --- console/console.go | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 console/console.go (limited to 'console') 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)) } -- cgit v1.2.3