from time import perf_counter

class SequentialTimer:
    def __init__(self, make_print=False):
        self.timings = []
        self.make_print = make_print
        
    def time(self, message: str):
        if self.make_print:
            print(message)
        self.timings.append((perf_counter(), message))

    def to_str(self) -> str:
        s = ""
        if len(self.timings) <= 1:
            s = "No timings"
            return s
        t0 = self.timings[0][0]
        for ((t1, m1), (t2, _)) in zip(self.timings, self.timings[1:]):
            s += f"TIME: step: {t2 - t1:06.3f} | cum {t2 - t0:06.3f} - {m1}\n"
        s += f"ALL TIME: {self.timings[-1][0] - self.timings[0][0]:07.3f}\n"
        return s        
        
    def printall(self):
        print(self.to_str())