from cppy.cp_util import *

#
# 框架类
#
class TFFlowAll:
    def __init__(self, func):
        self._funcs = [func]

    def bind(self, func):
        self._funcs.append(func)
        return self
    
    def execute(self):  
        def is_callable(obj):  
            """Check if an object is callable."""  
            return hasattr(obj, '__call__')  
    
        def call_if_possible(obj):  
            """Call the object if it's callable, otherwise return it as is."""  
            return obj() if is_callable(obj) else obj  
    
        # Initialize the value to a no-op lambda function  
        value = lambda: None              
        for func in self._funcs:              
            value = call_if_possible(func(value))              
        print(call_if_possible(value))

#
# 工具函数
#
def get_input(arg):
    def _f():
        return testfilepath
    return _f

def extractwords(path_to_file):
    def _f():
        return extract_file_words(path_to_file)
    return _f

def frequencies(word_list):
    def _f():
        return get_frequencies(word_list)
    return _f

def sort(word_freq):
    def _f():
        return sort_dict(word_freq)
    return _f

def top10_freqs(word_freqs):
    def _f():
        return '\n'.join(f"{word} - {freq}" for word, freq in word_freqs[:10])
    return _f


if __name__ == "__main__":
    TFFlowAll(get_input)\
    .bind(extractwords)\
    .bind(frequencies)\
    .bind(sort)\
    .bind(top10_freqs)\
    .execute()