// Copyright 2016 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.

/// Indexes a list of `enum` values by simple name.
///
/// In Dart enum names are prefixed with enum class name. For example, for
/// `enum Vote { yea, nay }`, `Vote.yea.toString()` produces `"Vote.yea"`
/// rather than just `"yea"` - the simple name. This class provides methods for
/// getting and looking up by simple names.
///
/// Example:
///
///     enum Vote { yea, nay }
///     final index = new EnumIndex(Vote.values);
///     index.lookupBySimpleName('yea');  // returns Vote.yea
///     index.toSimpleName(Vote.nay); // returns 'nay'
class EnumIndex<E> {
  /// Creates an index of [enumValues].
  EnumIndex(List<E> enumValues)
    : _nameToValue = new Map<String, E>.fromIterable(
        enumValues,
        key: _getSimpleName
      ),
      _valueToName = new Map<E, String>.fromIterable(
        enumValues,
        value: _getSimpleName
      );

  final Map<String, E> _nameToValue;
  final Map<E, String> _valueToName;

  /// Given a [simpleName] finds the corresponding enum value.
  E lookupBySimpleName(String simpleName) => _nameToValue[simpleName];

  /// Returns the simple name for [enumValue].
  String toSimpleName(E enumValue) => _valueToName[enumValue];
}

String _getSimpleName(dynamic enumValue) {
  return enumValue.toString().split('.').last;
}