# Copyright 2013 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.


class HostFileSystemIterator(object):
  '''Provides methods for iterating through host file systems, in both
  ascending (oldest to newest version) and descending order.
  '''

  def __init__(self, file_system_provider, branch_utility):
    self._file_system_provider = file_system_provider
    self._branch_utility = branch_utility

  def _ForEach(self, channel_info, callback, get_next):
    '''Iterates through a sequence of file systems defined by |get_next| until
    |callback| returns False, or until the end of the sequence of file systems
    is reached. Returns the BranchUtility.ChannelInfo of the last file system
    for which |callback| returned True.
    '''
    last_true = None
    while channel_info is not None:
      if channel_info.branch == 'trunk':
        file_system = self._file_system_provider.GetTrunk()
      else:
        file_system = self._file_system_provider.GetBranch(channel_info.branch)
      if not callback(file_system, channel_info):
        return last_true
      last_true = channel_info
      channel_info = get_next(channel_info)
    return last_true

  def Ascending(self, channel_info, callback):
    return self._ForEach(channel_info, callback, self._branch_utility.Newer)

  def Descending(self, channel_info, callback):
    return self._ForEach(channel_info, callback, self._branch_utility.Older)
