3 changed files with 63 additions and 10 deletions
@ -0,0 +1,51 @@ |
|||||
|
import six |
||||
|
|
||||
|
from six.moves import filter, map |
||||
|
from collections import defaultdict |
||||
|
from UserDict import IterableUserDict |
||||
|
|
||||
|
|
||||
|
class HashMap(IterableUserDict): |
||||
|
def items(self): |
||||
|
return six.iteritems(self.data) |
||||
|
|
||||
|
def keys(self): |
||||
|
return six.iterkeys(self.data) |
||||
|
|
||||
|
def values(self): |
||||
|
return six.itervalues(self.data) |
||||
|
|
||||
|
def find(self, predicate): |
||||
|
if not callable(predicate): |
||||
|
raise TypeError('predicate must be callable') |
||||
|
|
||||
|
for obj in self.values(): |
||||
|
if predicate(obj): |
||||
|
yield obj |
||||
|
|
||||
|
def find_one(self, predicate): |
||||
|
return next(self.find(predicate), None) |
||||
|
|
||||
|
def select(self, **kwargs): |
||||
|
for obj in self.values(): |
||||
|
for k, v in six.iteritems(kwargs): |
||||
|
if getattr(obj, k) != v: |
||||
|
continue |
||||
|
yield obj |
||||
|
|
||||
|
def select_one(self, **kwargs): |
||||
|
return next(self.select(**kwargs), None) |
||||
|
|
||||
|
def filter(self, predicate): |
||||
|
if not callable(predicate): |
||||
|
raise TypeError('predicate must be callable') |
||||
|
return filter(self.values(), predicate) |
||||
|
|
||||
|
def map(self, predicate): |
||||
|
if not callable(predicate): |
||||
|
raise TypeError('predicate must be callable') |
||||
|
return map(self.values(), predicate) |
||||
|
|
||||
|
|
||||
|
class DefaultHashMap(defaultdict, HashMap): |
||||
|
pass |
Loading…
Reference in new issue