-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfilehandler.py
36 lines (25 loc) · 1.16 KB
/
filehandler.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
from utils import pmts
from dsn.s_expr.clef import Note, BecomeList
def all_notes_from_stream(byte_stream):
while True:
yield Note.from_stream(byte_stream) # Transparently yields the StopIteration at the lower level
class FileWriter(object):
"""For lack of a better name: Handles the writing of Notes objects to files."""
def __init__(self, channel, filename):
# LATER: proper file-closing too! In the status quo there's 2 (related) open ends:
# 1] we don't do any file closing ourselves at any point
# 2] we don't have an implementation for closing channels yet
self.file_ = open(filename, 'ab')
# receive-only connection: FileWriters are ChannelReaders
channel.connect(self.receive)
def receive(self, data):
# Receives: Note writes it to the connected file
pmts(data, Note)
self.file_.write(data.as_bytes())
self.file_.flush()
def read_from_file(filename, channel):
byte_stream = iter(open(filename, 'rb').read())
for note in all_notes_from_stream(byte_stream):
channel.broadcast(note)
def initialize_history(channel):
channel.broadcast(BecomeList())