#!/usr/bin/env python2.5

"""Pretty-printing Python data structures.

This is a sample testcase for function overloading.

"""

import sys

from overloading import overloaded

__metaclass__ = type

class PrettyPrinter:

    def __init__(self, stream=None, width=80):
        self.stream = stream if stream is not None else sys.stdout
        self.width = width
        self.indent = 0

    def write(self, text):
        for line in text.splitlines(True):
            self.stream.write(line)
            if self.indent and line.endswith("\n"):
                self.stream.write(" "*self.indent)

    @overloaded
    def pprint(self, obj):
        self.write(repr(obj))

    @pprint.register(object, list)
    def pprint_list(self, obj):
        if not obj:
            self.write("[]")
            return
        sep = "["
        self.indent += 1
        for item in obj:
            self.write(sep)
            self.pprint(item)
            sep = ",\n"
        self.indent -= 1
        self.write("]")

class HexPrettyPrinter(PrettyPrinter):

    @overloaded
    def pprint(self, obj):
        PrettyPrinter.pprint(self, obj)

    @pprint.register(object, int)
    @pprint.register(object, long)
    def pprint_hex(self, obj):
        self.write(hex(obj))

PrettyPrinter().pprint([1, 2, [3, 4], 5, 6])
print
HexPrettyPrinter().pprint([1, 2, [3, 4], 5, 6])
