// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// @dart = 2.5

part of dart._vmservice;

/// Set like containes which automatically generated String ids for its items
class NamedLookup<E> extends Object with IterableMixin<E> {
  final IdGenerator _generator;
  final Map<String, E> _elements = new Map<String, E>();
  final Map<E, String> _ids = new Map<E, String>();

  NamedLookup({String prologue = ''})
      : _generator = new IdGenerator(prologue: prologue);

  void add(E e) {
    final id = _generator.newId();
    _elements[id] = e;
    _ids[e] = id;
  }

  void remove(E e) {
    final id = _ids.remove(e);
    _elements.remove(id);
    _generator.release(id);
  }

  E operator [](String id) => _elements[id];
  String keyOf(E e) => _ids[e];

  Iterator<E> get iterator => _ids.keys.iterator;
}

/// Generator for unique ids which recycles expired ones
class IdGenerator {
  /// Fixed initial part of the id
  final String prologue;
  // Ids in use
  final Set<String> _used = new Set<String>();

  /// Ids that has been released (use these before generate new ones)
  final Set<String> _free = new Set<String>();

  /// Next id to generate if no one can be recycled (first use _free);
  int _next = 0;

  IdGenerator({this.prologue = ''});

  /// Returns a new Id (possibly recycled)
  String newId() {
    var id;
    if (_free.isEmpty) {
      id = prologue + (_next++).toString();
    } else {
      id = _free.first;
    }
    _free.remove(id);
    _used.add(id);
    return id;
  }

  /// Releases the id and mark it for recycle
  void release(String id) {
    if (_used.remove(id)) {
      _free.add(id);
    }
  }
}
