def pretty_tree(x, kids, show):
    """Return a pseudo-graphic tree representation of the object `x` similar to the
    `tree` command in Unix.

    Type: `(T, Callable[[T], List[T]], Callable[[T], str]) -> str`

    It applies the parameter `show` (which is a function of type `(T) -> str`) to get a
    textual representation of the objects to show.

    It applies the parameter `kids` (which is a function of type `(T) -> List[T]`) to
    list the children of the object to show.

    Examples:

    ```pycon
    >>> print(pretty_tree(
    ...     ["foo", ["bar", "baz"], "quux"],
    ...     lambda obj: obj if isinstance(obj, list) else [],
    ...     lambda obj: "[]" if isinstance(obj, list) else str(obj),
    ... ))
    []
    |-- foo
    |-- []
    |   |-- bar
    |   `-- baz
    `-- quux

    ```
    """
    (MID, END, CONT, LAST, ROOT) = ("|-- ", "`-- ", "|   ", "    ", "")

    def rec(obj, indent, sym):
        line = indent + sym + show(obj)
        obj_kids = kids(obj)
        if len(obj_kids) == 0:
            return line
        else:
            if sym == MID:
                next_indent = indent + CONT
            elif sym == ROOT:
                next_indent = indent + ROOT
            else:
                next_indent = indent + LAST
            chars = [MID] * (len(obj_kids) - 1) + [END]
            lines = [rec(kid, next_indent, sym) for kid, sym in zip(obj_kids, chars)]
            return "\n".join([line] + lines)

    return rec(x, "", ROOT)