예제 #1
0
    def _run(self, xs: exactly(tuple), *, depth):
        if depth == self.max_depth:
            return self.ref(xs)

        elems = [self.run(x, depth=depth + 1) for x in xs]
        if len(xs) == 1:
            elems.append(H.atom(""))
        return H.bracketed(elems, start="(", end=")", delimiter=", ")
예제 #2
0
    def _run(self, xs: exactly(list), *, depth):
        if depth == self.max_depth:
            return self.ref(xs)

        return H.bracketed(
            [self.run(x, depth=depth + 1) for x in xs],
            start="[",
            end="]",
            delimiter=", ",
        )
예제 #3
0
    def _run(self, xs: exactly(set), *, depth):
        if depth == self.max_depth:
            return self.ref(xs)

        if not xs:
            return H.atom("set()")
        else:
            return H.bracketed(
                [self.run(x, depth=depth + 1) for x in xs],
                start="{",
                end="}",
                delimiter=",",
            )
예제 #4
0
    def _run(self, obj: object, *, depth):
        d = getattr(obj, "__dict__", None)
        if depth == self.max_depth or not isinstance(d, dict):
            return self.ref(obj)

        call = f"sktk.mod({self.ref(type(obj), wrap=str)})"
        return H.bracketed(
            [
                H.pair(k, self.run(v, depth=depth + 1), delimiter="=")
                for k, v in d.items()
            ],
            start=f"{call}(",
            end=")",
            delimiter=", ",
        )

        return self.ref(obj)
예제 #5
0
    def _run(self, d: exactly(dict), *, depth):
        if depth == self.max_depth:
            return self.ref(d)

        items = list(d.items())
        return H.bracketed(
            [
                H.pair(
                    self.run(k, depth=depth + 1),
                    self.run(v, depth=depth + 1),
                    delimiter=": ",
                ) for k, v in items
            ],
            start="{",
            end="}",
            delimiter=", ",
        )