1# (C) Copyright David Abrahams 2002. Permission to copy, use, modify, sell and 2# distribute this software is granted provided this copyright notice appears in 3# all copies. This software is provided "as is" without express or implied 4# warranty, and with no claim as to its suitability for any purpose. 5 6import operator 7 8from b2.util import is_iterable 9 10 11def unique (values, stable=False): 12 assert is_iterable(values) 13 if stable: 14 s = set() 15 r = [] 16 for v in values: 17 if not v in s: 18 r.append(v) 19 s.add(v) 20 return r 21 else: 22 return list(set(values)) 23 24def max_element (elements, ordered = None): 25 """ Returns the maximum number in 'elements'. Uses 'ordered' for comparisons, 26 or '<' is none is provided. 27 """ 28 assert is_iterable(elements) 29 assert callable(ordered) or ordered is None 30 if not ordered: ordered = operator.lt 31 32 max = elements [0] 33 for e in elements [1:]: 34 if ordered (max, e): 35 max = e 36 37 return max 38 39def select_highest_ranked (elements, ranks): 40 """ Returns all of 'elements' for which corresponding element in parallel 41 list 'rank' is equal to the maximum value in 'rank'. 42 """ 43 assert is_iterable(elements) 44 assert is_iterable(ranks) 45 if not elements: 46 return [] 47 48 max_rank = max_element (ranks) 49 50 result = [] 51 while elements: 52 if ranks [0] == max_rank: 53 result.append (elements [0]) 54 55 elements = elements [1:] 56 ranks = ranks [1:] 57 58 return result 59