empty_collections 1.0.0

  • README.md
  • Installing
  • Versions
  • 0


The package empty_collections contains const implementations for several collection classes that allow access to there remove-functionality:

const EmptyIterator, const EmptyIterable, const EmptySet, const EmptyMap, const EmptyList, const EmptyLinkedList and const EmptyQueue.

All these classes have been implemented as permanently empty collection classes with a const constructor. This makes these classes highly efficient and e.g. usable as default arguments for optional parameters. The difference from other unmodifiable implementations (e.g. const [], const {}, const UnmodifiableSetView.empty() from the collection package) is that these classes don't adhere to the unmodifiable convention that disallows both: adding methodes (like add(...), insert(...), putIfAbsent(...), []=, ...) and removing methodes (like remove(...), clear(), retainWhere(...), ...). The thing is for empty collections the normal remove semantic doesn't change the state of the collection! E.g. a call to emptySet.clear() does nothing on an empty set, a call to emptyList.remove(o) will just return false, because o wasn't an element of the empty list to start with.

So there is no harm in allowing remove-functionality while the adding-functionlity is still of limits.


A simple usage example:

import 'package:empty_collections/empty_collections.dart';

main() {
  // use empty collection as default values
  var args = const EmptyList();
  if(userProvidesArgs()) {
    args = getUserProvidedArgs();
  // remove-functionality doesn't throw exceptions!
  // in this specific case remove returns false
  // because "stupid option" wasn't an element of the empty list to start with
  args.remove("stupid option");
  // if you want to make sure you can add elements at some point, use toList(growable: true)
   args = args.toList(growable: true);
   args.add("important option");

// use empty collections as default values for optional parameters
void someMethodeWithOptionParameter([Map<String, String> environmentVariables = const EmptyMap, bool ignoreEnv = true]) {
  if(ignoreEnv) {
    // empty collections can be cleared without problems (because they are already empty to start with)

Features and bugs

Please file feature requests and bugs at the issue tracker.



  • Initial version supports const contructors for EmptyIterator, EmptyIterable, EmptySet, EmptyMap, EmptyList, EmptyLinkedList and EmptyQueue

Use this package as a library

1. Depend on it

Add this to your package's pubspec.yaml file:

  empty_collections: ^1.0.0

2. Install it

You can install packages from the command line:

with pub:

$ pub get

Alternatively, your editor might support pub get. Check the docs for your editor to learn more.

3. Import it

Now in your Dart code, you can use:

import 'package:empty_collections/empty_collections.dart';
Version Uploaded Documentation Archive
1.0.0 May 26, 2016 Go to the documentation of empty_collections 1.0.0 Download empty_collections 1.0.0 archive
Describes how popular the package is relative to other packages. [more]
Code health derived from static analysis. [more]
Reflects how tidy and up-to-date the package is. [more]
Weighted score of the above. [more]
Learn more about scoring.

We analyzed this package on Jul 20, 2018, and provided a score, details, and suggestions below. Analysis was completed with status completed using:

  • Dart: 2.0.0-dev.69.0
  • pana: 0.11.7


Detected platforms: unsure

Low code quality prevents platform classification.

Issues and suggestions

Fix lib/src/empty_collections_base.dart.

Analysis of lib/src/empty_collections_base.dart failed with 40 errors, 5 hints, including:

line 59 col 7: Missing concrete implementations of 'Iterable.cast', 'Iterable.followedBy' and 'Iterable.whereType'.

line 84 col 3: Invalid override. The type of 'EmptyIterable.expand' ('((E) → Iterable<dynamic>) → Iterable<dynamic>') isn't a subtype of 'Iterable<E>.expand' ('<T>((E) → Iterable<T>) → Iterable<T>').

line 103 col 3: Invalid override. The type of 'EmptyIterable.fold' ('(dynamic, (dynamic, E) → dynamic) → dynamic') isn't a subtype of 'Iterable<E>.fold' ('<T>(T, (T, E) → T) → T').

line 141 col 3: Invalid override. The type of 'EmptyIterable.map' ('((E) → dynamic) → Iterable<dynamic>') isn't a subtype of 'Iterable<E>.map' ('<T>((E) → T) → Iterable<T>').

line 156 col 3: Invalid override. The type of 'EmptyIterable.singleWhere' ('((E) → bool) → E') isn't a subtype of 'Iterable<E>.singleWhere' ('((E) → bool, {orElse: () → E}) → E').

Fix platform conflicts.

Low code quality prevents platform classification.

Support Dart 2 in pubspec.yaml.

The SDK constraint in pubspec.yaml doesn't allow the Dart 2.0.0 release. For information about upgrading it to be Dart 2 compatible, please see https://www.dartlang.org/dart-2#migration.

Package is too old.

The package was released more than two years ago.


Package Constraint Resolved Available
Direct dependencies
Dart SDK >=1.12.0 <2.0.0
Dev dependencies
test >=0.12.0 <0.13.0