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

/// Jenkins hash function, optimized for small integers.
//
// Borrowed from the dart sdk: sdk/lib/math/jenkins_smi_hash.dart.
class _Jenkins {
  static int combine(final int h, Object o) {
    assert(o is! Iterable);
    int hash = h;
    hash = 0x1fffffff & (hash + o.hashCode);
    hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
    return hash ^ (hash >> 6);
  }

  static int finish(final int h) {
    int hash = h;
    hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
    hash = hash ^ (hash >> 11);
    return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
  }
}

/// Combine the [Object.hashCode] values of an arbitrary number of objects from
/// an [Iterable] into one value. This function will return the same value if
/// given null as if given an empty list.
int deepHash(Iterable<Object> arguments) {
  int result = 0;
  if (arguments != null) {
    for (Object argument in arguments) {
      if (argument is Iterable) {
        argument = deepHash(argument);
      }
      result = _Jenkins.combine(result, argument);
    }
  }
  return _Jenkins.finish(result);
}

/// Deep equality helper function.
bool deepEquals(dynamic a, dynamic b) {
  // iterable
  if (a is Iterable) {
    // ignore: avoid_bool_literals_in_conditional_expressions
    return (b is Iterable) ?
        _deepEqualsOfIterable(a, b) :
        false;
  }

  // map
  if (a is Map) {
    // ignore: avoid_bool_literals_in_conditional_expressions
    return (b is Map) ?
        _deepEqualsOfMap(a, b) :
        false;
  }

  // default
  return a == b;
}

/// Deep equality helper function for Iterables.
bool _deepEqualsOfIterable(Iterable<Object> a, Iterable<Object> b) {
  if (a.length != b.length) {
    return false;
  }
  final ai = a.iterator;
  final bi = b.iterator;
  while (ai.moveNext() && bi.moveNext()) {
    if (!deepEquals(ai.current, bi.current)) {
      return false;
    }
  }
  return true;
}

/// Deep equality helper function for Maps.
bool _deepEqualsOfMap(Map a, Map b) {
  if (a.length != b.length) {
    return false;
  }
  for (var key in a.keys) {
    if (!b.containsKey(key)) {
      return false;
    }
    final aCurrent = a[key];
    final bCurrent = b[key];
    if (!deepEquals(aCurrent, bCurrent)) {
      return false;
    }
  }
  return true;
}
