# Copyright 2014 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.

import collections
import os


class PathSet(collections.MutableSet):
  """A set of paths.

  All mutation methods can take both directories or individual files, but the
  iterator yields the individual files. All paths are automatically normalized.
  """
  def __init__(self, iterable=None):
    self._paths = set()
    if iterable:
      self |= iterable

  def __contains__(self, path):
    return os.path.realpath(path) in self._paths

  def __iter__(self):
    return iter(self._paths)

  def __len__(self):
    return len(self._paths)

  def add(self, path):
    path = os.path.realpath(path)
    if os.path.isfile(path):
      self._paths.add(path)
    for root, _, files in os.walk(path):
      for basename in files:
        file_path = os.path.join(root, basename)
        if os.path.isfile(file_path):
          self._paths.add(file_path)

  def discard(self, path):
    path = os.path.realpath(path)
    self._paths.discard(path)
    for root, _, files in os.walk(path):
      for basename in files:
        self._paths.discard(os.path.join(root, basename))