def make_pairs_single_elimination(self, round, ranking): previous_round = round.previous_round if previous_round and previous_round.type == Round.TYPE_SINGLE_ELIM: previous_winners = [m.winner for m in previous_round.matches] # this is expected to return items from ranking... players = [{'player': p} for p in previous_winners] if odd(players): # something's wrong, abort return [] return split(players, 2) else: playoff_rounds_count = (round.tournament.rounds .filter(type=Round.TYPE_SINGLE_ELIM) .count()) player_count = 2 ** playoff_rounds_count players = ranking[:player_count] half = player_count / 2 pairs = zip(players[:half], reversed(players[half:])) for i in range(1, playoff_rounds_count - 1): half = len(pairs) / 2 / i pairs = merge(merge(map( lambda x, y: [x, y], split(pairs, i)[:half], reversed(split(pairs, i)[half:]) ))) return pairs
def trigger(self, obj, action): keys = [(obj.__class__, action), (obj.__class__, ANY), (ANY, ANY),] for fn in merge([self._registry.get(key, []) for key in keys]): fn(obj.__class__, obj, action)