collect__child__animals = 1
collect__child__chimp = 2
collect__child__food = 3
collect__child__type__text__text = 4

class Doer:
    def __init__(self, ARG=None, arg1=None, arg2=None):
        self.ARG = ARG
        self.arg1 = arg1
        self.arg2 = arg2
    def do(self, subdoc, doc):
        return []

class xPath(Doer):
    def do(self, subdoc, doc):
        return self.arg1.do([], doc)

class dCollect(Doer):
    def do(self, subdoc, doc):
        result = []
        for r in self.arg1.do(subdoc, doc):
            if self.ARG == collect__child__animals:
                result.append(r)
            elif self.ARG == collect__child__chimp:
                for el in r:
                    if el.tag == 'chimp':
                        result.append(el)
            elif self.ARG == collect__child__food:
                for el in r:
                    if el.tag == 'food':
                        result.append(el)
            elif self.ARG == collect__child__type__text__text:
                result.append(r.text)
            else:
                raise Exception("dCollect: Unknown ARG " + str(self.ARG))
        return result

class dRoot(Doer):
    def do(self, subdoc, doc):
        return [doc.root]

class dSort(Doer):
    def do(self, subdoc, doc):
        result = self.arg1.do(subdoc, doc)
        if len(result) == 0:
            return []
        if type(result[0]) == str:
            result.sort()
            return result
        raise Exception("dSort: Unable to sort " + str(type(result[0])))
