--- /dev/null
+from functools import wraps
+from typing import *
+
+UTF_8 = "utf-8"
+
+
+class Readable:
+ @classmethod
+ def decode(cls) -> Generator[Optional[object], bytes, None]:
+ raise NotImplementedError
+
+
+class Writable:
+ def encode(self) -> bytes:
+ raise NotImplementedError
+
+
+def generator(f):
+ O = TypeVar("O")
+ I = TypeVar("I")
+ R = TypeVar("R")
+
+ def prepare(g: Generator[O, I, R]) -> Generator[O, I, R]:
+ next(g)
+ return g
+
+ @wraps(f)
+ def w(*args, **kwargs):
+ return prepare(f(*args, **kwargs))
+
+ return w