import os, sys, UserList
import finder, tocfilter, resource

class lTOC(UserList.UserList):
    """ A class for managing lists of resources.
        Should be a UserList subclass. Doh. 
        Like a list, but has merge(other) and filter() methods """
    def __init__(self, reslist=None, filters=None):
        UserList.UserList.__init__(self, reslist)
        self.filters = []
        if filters is not None:
            self.filters = filters[:]
    def prepend(self, res):
        self.resources.insert(0, res)
    def merge(self, other):
        ' merge in another ltoc, discarding dups and preserving order '
        tmp = {}
        for res in self.data:
            tmp[res.name] = 0
        for res in other:
            if tmp.get(res.name, 1):
                self.data.append(res)
                tmp[res.name] = 0
    def filter(self):
        ' invoke all filters '
        for i in range(len(self.data)):
            res = self.data[i]
            if res:
                for f in self.filters:
                    if f.matches(res):
                        self.data[i] = None
                        break
        self.data = filter(None, self.data)
        return self
    def unique(self):
        ' remove all duplicate entries, preserving order '
        new = self.__class__()
        new.merge(self)
        self.data = new.data
    def toList(self):
        ' return self as a list of (name, path, typ) '
        tmp = []
        for res in self.data:
            tmp.append((res.name, res.path, res.typ))
        return tmp
    def addFilter(self, filter):
        if type(filter) == type(''):
            self.filters.append(finder.makeresource(filter).asFilter())
        else:
            if type(filter) == type(self):
                if isinstance(filter, tocfilter._Filter):
                    self.filters.append(filter)
                elif isinstance(filter, resource.resource):
                    self.filters.append(filter.asFilter())
                else:
                    raise ValueError, "can't make filter from %s", repr(filter)
            else:
                raise ValueError, "can't make filter from %s", repr(filter)
        print " added filter", repr(self.filters[-1])             
            
   
if __name__ == '__main__':
    sys.path.insert(0, '.')
    import finder
    import pprint
    s = finder.scriptresource('finder.py', './finder.py')
    ##    pyltoc = lTOC(s.modules)
    ##    l1 = pyltoc.toList()
    ##    print "Raw py ltoc:", pprint.pprint(l1)
    ##    f1 = ModFilter(['dospath', 'macpath', 'posixpath'])
    ##    l2 = lTOC(s.modules).filter(f1).toList()
    ##    print "Filter out dospath, macpath, posixpath:", pprint.pprint(l2)
    ##    f2 = DirFilter(['.'])
    ##    l3 = lTOC(s.modules).filter(f2).toList()
    ##    print "Filter out current dir:", pprint.pprint(l3)
    ##    f3 = StdLibFilter()
    ##    l4 = lTOC(s.modules).filter(f3).toList()
    ##    print "Filter out stdlib:", pprint.pprint(l4)
    ##    #print "Filter out current dir and stdlib:", lTOC(s.modules).filter(f2, f3).toList()
    binltoc = lTOC(s.binaries)
    print "Raw bin ltoc:", pprint.pprint(binltoc.toList())
    binltoc.addFilter('c:/winnt/system32')
    pprint.pprint(binltoc.filter().toList())