From d4b2f27cd4e2f754196ed3b6fd1c8fd9f9fa8c92 Mon Sep 17 00:00:00 2001 From: Bel LaPointe Date: Sun, 18 Sep 2022 12:24:16 -0600 Subject: [PATCH] reader can read inputs and emit a pretty steady signal --- src/input.py | 17 ---------- src/main.py | 8 ++++- src/reader.py | 63 ++++++++++++++++++++++++++++++++++++ src/{output.py => writer.py} | 7 ++-- 4 files changed, 74 insertions(+), 21 deletions(-) delete mode 100644 src/input.py create mode 100644 src/reader.py rename src/{output.py => writer.py} (86%) diff --git a/src/input.py b/src/input.py deleted file mode 100644 index 410c247..0000000 --- a/src/input.py +++ /dev/null @@ -1,17 +0,0 @@ -class Input: - def __init__(self, reader): - self.reader = reader - - def get(self): - return self.reader.read() - -class StdinReader: - def read(self): - return input() - -class FileReader: - def __init__(self, path): - self.f = open(path, "r") - - def read(self): - return self.f.readline() diff --git a/src/main.py b/src/main.py index 0d49abf..d95ae8e 100644 --- a/src/main.py +++ b/src/main.py @@ -1,5 +1,11 @@ +import reader +import writer + def main(): - raise Exception("not impl") + r = reader.Reader(reader.StdinReader()) + w = writer.Writer() + for line in r.read(): + w.write(line) if __name__ == "__main__": main() diff --git a/src/reader.py b/src/reader.py new file mode 100644 index 0000000..06a27d6 --- /dev/null +++ b/src/reader.py @@ -0,0 +1,63 @@ +import threading +import queue +import time +import sys +import select + +__interval__ = .1 + +class Reader: + def __init__(self, reader): + self.reader = reader + + def read(self): + q = queue.Queue(maxsize=1) + + class async_reader(threading.Thread): + def __init__(self, q, foo): + threading.Thread.__init__(self) + self.q = q + self.foo = foo + self.stopping = False + + def stop(self): + self.stopping = True + + def run(self): + while not self.stopping: + try: + self.q.put_nowait(self.foo()) + except queue.Full: + pass + time.sleep(__interval__/2.0) + + reader = async_reader(q, self.reader.read) + reader.start() + try: + while not reader.stopping: + try: + yield q.get(timeout=__interval__) + except queue.Empty: + yield None + pass + except KeyboardInterrupt as e: + reader.stop() + reader.join() + raise e + +class StdinReader: + def read(self): + try: + if select.select([sys.stdin,],[],[],__interval__/2.0)[0]: + line = sys.stdin.readline() + return line.strip() + except Exception as e: + pass + return None + +class FileReader: + def __init__(self, path): + self.f = open(path, "r") + + def read(self): + return self.f.readline() diff --git a/src/output.py b/src/writer.py similarity index 86% rename from src/output.py rename to src/writer.py index ad9a74f..6b9f788 100644 --- a/src/output.py +++ b/src/writer.py @@ -1,10 +1,11 @@ import time -class Output: +class Writer: def __init__(self): - self.previous = None + self.previous = Line(None) - def write(self, latest): + def write(self, v): + latest = Line(v) chosen = Line.choose(self.previous, latest) if chosen.v != self.previous.v: print(chosen)