// Copyright (c) 2015, Google Inc. 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. /// Built Collections bring the benefits of immutability to your Dart code via /// the [builder pattern](http://en.wikipedia.org/wiki/Builder_pattern). /// /// Each of the core SDK collections is split in two: a mutable builder class /// and an immutable "built" class. Builders are for computation, /// "built" classes are for safely sharing with no need to copy defensively. /// /// Built collections: /// /// * are immutable, if the elements/keys/values used are immutable; /// * are comparable; /// * are hashable; /// * reject nulls; /// * require generic type parameters; /// * reject wrong-type elements; /// * use copy-on-write to avoid copying unnecessarily. /// /// See below for details on each of these points. /// /// /// # Recommend Style /// /// A project can benefit greatly from using Built Collections throughout. /// Methods that will not mutate a collection can accept the "built" version, /// making it clear that no mutation will happen and completely avoiding /// the need for defensive copying. /// /// For code that is public to other projects or teams not using /// Built Collections, prefer to accept `Iterable` where possible. That way /// your code is compatible with SDK collections, Built Collections and any /// other collection implementation that builds on `Iterable`. /// /// It's okay to accept `List`, `Set` or `Map` if needed. Built Collections /// provide efficient conversion to their SDK counterparts via /// `BuiltList.toList`, `BuiltListMultimap.toMap`, `BuiltSet.toSet`, /// `BuiltMap.toMap` and `BuiltSetMultimap.toMap`. /// /// /// # Built Collections are Immutable /// /// Built Collections do not offer any methods that modify the collection. In /// order to make changes, first call `toBuilder` to get a mutable builder. /// /// In particular, Built Collections do not implement or extend their mutable /// counterparts. `BuiltList` implements `Iterable`, but not `List`. `BuiltSet` /// implements `Iterable`, but not `Set`. `BuiltMap`, `BuiltListMultimap` and /// `BuiltSetMultimap` share no interface with the SDK collections. /// /// Built Collections can contain mutable elements. However, this use is not /// recommended, as mutations to the elements will break comparison and /// hashing. /// /// /// # Built Collections are Comparable /// /// Core SDK collections do not offer equality checks by default. /// /// Built Collections do a deep comparison against other Built Collections /// of the same type, only. Hashing is used to make repeated comparisons fast. /// /// /// # Built Collections are Hashable /// /// Core SDK collections do not compute a deep hashCode. /// /// Built Collections do compute, and cache, a deep hashCode. That means they /// can be stored inside collections that need hashing, such as hash sets and /// hash maps. They also use the cached hash code to speed up repeated /// comparisons. /// /// /// # Built Collections Reject Nulls /// /// A `null` in a collection is usually a bug, so Built Collections and their /// builders throw if given a `null` element, key or value. /// /// /// # Built Collections Require Generic Type Parameters /// /// A `List` is error-prone because it can be assigned to a `List` of /// any type without warning. So, all Built Collections must be created with /// explicit element, key or value types. /// /// /// # Built Collections Reject Wrong-type Elements, Keys and Values /// /// Collections that happen to contain elements, keys or values that are not of /// the right type can lead to difficult-to-find bugs. So, all Built /// Collections and their builders are aggressive about validating types, even /// with checked mode disabled. /// /// /// # Built Collections Avoid Copying Unnecessarily /// /// Built Collections and their builder and helper types collaborate to avoid /// copying unless it's necessary. /// /// In particular, `BuiltList.toList`, `BuiltListMultimap.toMap`, /// `BuiltSet.toSet`, `BuiltMap.toMap` and `BuiltSetMultimap.toMap` do not make /// a copy, but return a copy-on-write wrapper. So, Built Collections can be /// efficiently and easily used with code that needs core SDK collections but /// does not mutate them. export 'src/list.dart' hide OverriddenHashcodeBuiltList; export 'src/list_multimap.dart' hide OverriddenHashcodeBuiltListMultimap; export 'src/map.dart' hide OverriddenHashcodeBuiltMap; export 'src/set.dart' hide OverriddenHashcodeBuiltSet; export 'src/set_multimap.dart' hide OverriddenHashcodeBuiltSetMultimap;