################ 待整理 
'''
注册者 = 观察者

每个组件提供注册消息接口和注册消息动作

在其它单元上注册自己对于特定事件（消息）的响应函数
同时负责自己的注册队列的序贯调用
Python 中有一个Callable类型，可以用来判断是否是可以回调类型
from typing import Callable

这是一个示例性质的原型，具体分布式环境下需要调整
'''

from collections import defaultdict
from cppy.cp_util import *

#
#  event_manager
#
class EventManager:
    def __init__(self):
        self.load_handlers = []  # 用于加载文件的事件处理器
        self.process_handlers = []  # 用于处理数据的事件处理器
        self.end_handlers = []  # 用于结束流程的事件处理器        

    def register_load_event(self, handler):
        self.load_handlers.append(handler)

    def register_process_event(self, handler):
        self.process_handlers.append(handler)

    def register_end_event(self, handler):
        self.end_handlers.append(handler)
    
    # 运行框架，按顺序执行注册的事件处理器
    def run(self, file_path):
        for handler in self.load_handlers:        handler(file_path)
        for handler in self.process_handlers:     handler()
        for handler in self.end_handlers:         handler()


#
# 功能组件
#
# 定义数据存储类，用于模拟文件内容的加载和处理
class TextData:        
    _word_event_handlers = []

    def __init__( self, event_manager ):
        self._stop_words = get_stopwords()                
        event_manager.register_load_event(self.__load)
        event_manager.register_process_event(self.__process_words)

    def __load(self, path_to_file):        
        self._data = re_split( read_file(path_to_file) )    

    def __process_words(self):
        for word in self._data:            
            if word not in self._stop_words:
                for handler in self._word_event_handlers:
                    handler(word)

    def register_word_event(self, handler):
        self._word_event_handlers.append(handler)


class WordFrequencyCounter:
    def __init__(self, event_manager, data_storage):
        self._word_freqs = defaultdict(int) # 存储单词频率
        data_storage.register_word_event(self.__increment_count) # 注册单词事件
        event_manager.register_end_event(self.__print_freqs) # 注册结束事件

    def __increment_count(self, word):
        self._word_freqs[word] += 1

    def __print_freqs(self):
        print_word_freqs ( sort_dict (self._word_freqs) )       


if __name__ == '__main__':
    em = EventManager()    
    data_storage = TextData(em)
    word_freq_counter = WordFrequencyCounter(em, data_storage)

    em.run(testfilepath)