misc: remove dependency on pkg:tuple (and transitively quiver_hashcode)
diff --git a/lib/dartdoc.dart b/lib/dartdoc.dart
index ee2104a..4d4311f 100644
--- a/lib/dartdoc.dart
+++ b/lib/dartdoc.dart
@@ -22,12 +22,12 @@
 import 'package:dartdoc/src/logging.dart';
 import 'package:dartdoc/src/model.dart';
 import 'package:dartdoc/src/package_meta.dart';
+import 'package:dartdoc/src/tuple.dart';
 import 'package:dartdoc/src/utils.dart';
 import 'package:dartdoc/src/warnings.dart';
 import 'package:html/dom.dart' show Element, Document;
 import 'package:html/parser.dart' show parse;
 import 'package:path/path.dart' as pathLib;
-import 'package:tuple/tuple.dart';
 
 export 'package:dartdoc/src/dartdoc_options.dart';
 export 'package:dartdoc/src/element_type.dart';
diff --git a/lib/src/line_number_cache.dart b/lib/src/line_number_cache.dart
index a2cdc49..966d77a 100644
--- a/lib/src/line_number_cache.dart
+++ b/lib/src/line_number_cache.dart
@@ -7,7 +7,7 @@
 import 'dart:collection';
 import 'dart:io';
 
-import 'package:tuple/tuple.dart';
+import 'package:dartdoc/src/tuple.dart';
 
 String _getNewlineChar(String contents) {
   if (contents.contains("\r\n")) {
diff --git a/lib/src/markdown_processor.dart b/lib/src/markdown_processor.dart
index 13c6c25..2c1640a 100644
--- a/lib/src/markdown_processor.dart
+++ b/lib/src/markdown_processor.dart
@@ -13,10 +13,10 @@
 import 'package:dartdoc/src/element_type.dart';
 import 'package:dartdoc/src/model.dart';
 import 'package:dartdoc/src/model_utils.dart';
+import 'package:dartdoc/src/tuple.dart';
 import 'package:dartdoc/src/warnings.dart';
 import 'package:html/parser.dart' show parse;
 import 'package:markdown/markdown.dart' as md;
-import 'package:tuple/tuple.dart';
 
 const validHtmlTags = const [
   "a",
diff --git a/lib/src/model.dart b/lib/src/model.dart
index db4b9f1..3bf13e8 100644
--- a/lib/src/model.dart
+++ b/lib/src/model.dart
@@ -45,13 +45,13 @@
 import 'package:dartdoc/src/model_utils.dart';
 import 'package:dartdoc/src/package_meta.dart' show PackageMeta, FileContents;
 import 'package:dartdoc/src/special_elements.dart';
+import 'package:dartdoc/src/tuple.dart';
 import 'package:dartdoc/src/utils.dart';
 import 'package:dartdoc/src/warnings.dart';
 import 'package:front_end/src/byte_store/byte_store.dart';
 import 'package:front_end/src/base/performance_logger.dart';
 import 'package:path/path.dart' as pathLib;
 import 'package:pub_semver/pub_semver.dart';
-import 'package:tuple/tuple.dart';
 import 'package:package_config/discovery.dart' as package_config;
 
 int byName(Nameable a, Nameable b) =>
diff --git a/lib/src/tuple.dart b/lib/src/tuple.dart
new file mode 100644
index 0000000..78d1b9d
--- /dev/null
+++ b/lib/src/tuple.dart
@@ -0,0 +1,87 @@
+// Copied from source at github.com/kseo/tuple/blob/470ed3aeb/lib/src/tuple.dart
+
+// Original copyright:
+// Copyright (c) 2014, the tuple 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.
+
+import 'package:quiver/core.dart';
+
+/// Represents a 2-tuple, or pair.
+class Tuple2<T1, T2> {
+  /// Returns the first item of the tuple
+  final T1 item1;
+
+  /// Returns the second item of the tuple
+  final T2 item2;
+
+  /// Creates a new tuple value with the specified items.
+  const Tuple2(this.item1, this.item2);
+
+  @override
+  String toString() => '[$item1, $item2]';
+
+  @override
+  bool operator ==(o) => o is Tuple2 && o.item1 == item1 && o.item2 == item2;
+
+  @override
+  int get hashCode => hash2(item1.hashCode, item2.hashCode);
+}
+
+/// Represents a 3-tuple, or triple.
+class Tuple3<T1, T2, T3> {
+  /// Returns the first item of the tuple
+  final T1 item1;
+
+  /// Returns the second item of the tuple
+  final T2 item2;
+
+  /// Returns the third item of the tuple
+  final T3 item3;
+
+  /// Creates a new tuple value with the specified items.
+  const Tuple3(this.item1, this.item2, this.item3);
+
+  @override
+  String toString() => '[$item1, $item2, $item3]';
+
+  @override
+  bool operator ==(o) =>
+      o is Tuple3 && o.item1 == item1 && o.item2 == item2 && o.item3 == item3;
+
+  @override
+  int get hashCode => hash3(item1.hashCode, item2.hashCode, item3.hashCode);
+}
+
+/// Represents a 4-tuple, or quadruple.
+class Tuple4<T1, T2, T3, T4> {
+  /// Returns the first item of the tuple
+  final T1 item1;
+
+  /// Returns the second item of the tuple
+  final T2 item2;
+
+  /// Returns the third item of the tuple
+  final T3 item3;
+
+  /// Returns the fourth item of the tuple
+  final T4 item4;
+
+  /// Creates a new tuple value with the specified items.
+  const Tuple4(this.item1, this.item2, this.item3, this.item4);
+
+  @override
+  String toString() => '[$item1, $item2, $item3, $item4]';
+
+  @override
+  bool operator ==(o) =>
+      o is Tuple4 &&
+      o.item1 == item1 &&
+      o.item2 == item2 &&
+      o.item3 == item3 &&
+      o.item4 == item4;
+
+  @override
+  int get hashCode =>
+      hash4(item1.hashCode, item2.hashCode, item3.hashCode, item4.hashCode);
+}
diff --git a/lib/src/warnings.dart b/lib/src/warnings.dart
index e7e182a..62857c7 100644
--- a/lib/src/warnings.dart
+++ b/lib/src/warnings.dart
@@ -5,7 +5,7 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:dartdoc/src/logging.dart';
 import 'package:dartdoc/src/model.dart';
-import 'package:tuple/tuple.dart';
+import 'package:dartdoc/src/tuple.dart';
 
 class PackageWarningHelpText {
   final String warningName;
diff --git a/pubspec.lock b/pubspec.lock
index 52285ad..8770531 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -358,13 +358,6 @@
       url: "https://pub.dartlang.org"
     source: hosted
     version: "2.0.0+1"
-  quiver_hashcode:
-    dependency: transitive
-    description:
-      name: quiver_hashcode
-      url: "https://pub.dartlang.org"
-    source: hosted
-    version: "1.0.0"
   resource:
     dependency: "direct main"
     description:
@@ -463,13 +456,6 @@
       url: "https://pub.dartlang.org"
     source: hosted
     version: "1.3.0"
-  tuple:
-    dependency: "direct main"
-    description:
-      name: tuple
-      url: "https://pub.dartlang.org"
-    source: hosted
-    version: "1.0.1"
   typed_data:
     dependency: transitive
     description:
diff --git a/pubspec.yaml b/pubspec.yaml
index 01d7534..25b6b43 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -25,7 +25,6 @@
   quiver: ^2.0.0
   resource: ^2.1.2
   stack_trace: ^1.4.2
-  tuple: ^1.0.1
   yaml: ^2.1.0
 
 dev_dependencies: