Index: packages/quiver/lib/src/core/optional.dart |
diff --git a/packages/quiver/lib/src/core/optional.dart b/packages/quiver/lib/src/core/optional.dart |
index 6802229282e1520bb4b59f9f118ea9525972e941..d7496cce446fd66f0e4913207072c04c3756591c 100644 |
--- a/packages/quiver/lib/src/core/optional.dart |
+++ b/packages/quiver/lib/src/core/optional.dart |
@@ -14,47 +14,35 @@ |
part of quiver.core; |
-/** |
- * A value that might be absent. |
- * |
- * Use Optional as an alternative to allowing fields, parameters or return |
- * values to be null. It signals that a value is not required and provides |
- * convenience methods for dealing with the absent case. |
- */ |
-class Optional<T> { |
+/// A value that might be absent. |
+/// |
+/// Use Optional as an alternative to allowing fields, parameters or return |
+/// values to be null. It signals that a value is not required and provides |
+/// convenience methods for dealing with the absent case. |
+class Optional<T> extends IterableBase<T> { |
final T _value; |
- /** |
- * Constructs an empty Optional. |
- */ |
+ /// Constructs an empty Optional. |
const Optional.absent() : _value = null; |
- /** |
- * Constructs an Optional of the given [value]. |
- * |
- * Throws [ArgumentError] if [value] is null. |
- */ |
+ /// Constructs an Optional of the given [value]. |
+ /// |
+ /// Throws [ArgumentError] if [value] is null. |
Optional.of(T value) : this._value = value { |
if (this._value == null) throw new ArgumentError('Must not be null.'); |
} |
- /** |
- * Constructs an Optional of the given [value]. |
- * |
- * If [value] is null, returns [absent()]. |
- */ |
+ /// Constructs an Optional of the given [value]. |
+ /// |
+ /// If [value] is null, returns [absent()]. |
const Optional.fromNullable(T value) : this._value = value; |
- /** |
- * Whether the Optional contains a value. |
- */ |
+ /// Whether the Optional contains a value. |
bool get isPresent => _value != null; |
- /** |
- * Gets the Optional value. |
- * |
- * Throws [StateError] if [value] is null. |
- */ |
+ /// Gets the Optional value. |
+ /// |
+ /// Throws [StateError] if [value] is null. |
T get value { |
if (this._value == null) { |
throw new StateError('value called on absent Optional.'); |
@@ -62,31 +50,25 @@ class Optional<T> { |
return _value; |
} |
- /** |
- * Executes a function if the Optional value is present. |
- */ |
+ /// Executes a function if the Optional value is present. |
void ifPresent(void ifPresent(T value)) { |
if (isPresent) { |
ifPresent(_value); |
} |
} |
- /** |
- * Execution a function if the Optional value is absent. |
- */ |
+ /// Execution a function if the Optional value is absent. |
void ifAbsent(void ifAbsent()) { |
if (!isPresent) { |
ifAbsent(); |
} |
} |
- /** |
- * Gets the Optional value with a default. |
- * |
- * The default is returned if the Optional is [absent()]. |
- * |
- * Throws [ArgumentError] if [defaultValue] is null. |
- */ |
+ /// Gets the Optional value with a default. |
+ /// |
+ /// The default is returned if the Optional is [absent()]. |
+ /// |
+ /// Throws [ArgumentError] if [defaultValue] is null. |
T or(T defaultValue) { |
if (defaultValue == null) { |
throw new ArgumentError('defaultValue must not be null.'); |
@@ -94,32 +76,28 @@ class Optional<T> { |
return _value == null ? defaultValue : _value; |
} |
- /** |
- * Gets the Optional value, or [null] if there is none. |
- */ |
+ /// Gets the Optional value, or [null] if there is none. |
T get orNull => _value; |
- /** |
- * Transforms the Optional value. |
- * |
- * If the Optional is [absent()], returns [absent()] without applying the transformer. |
- * |
- * The transformer must not return [null]. If it does, an [ArgumentError] is thrown. |
- */ |
- Optional transform(dynamic transformer(T value)) { |
+ /// Transforms the Optional value. |
+ /// |
+ /// If the Optional is [absent()], returns [absent()] without applying the transformer. |
+ /// |
+ /// The transformer must not return [null]. If it does, an [ArgumentError] is thrown. |
+ Optional<S> transform<S>(S transformer(T value)) { |
return _value == null |
? new Optional.absent() |
: new Optional.of(transformer(_value)); |
} |
- /** |
- * Delegates to the underlying [value] hashCode. |
- */ |
+ @override |
+ Iterator<T> get iterator => |
+ isPresent ? <T>[_value].iterator : new Iterable<T>.empty().iterator; |
+ |
+ /// Delegates to the underlying [value] hashCode. |
int get hashCode => _value.hashCode; |
- /** |
- * Delegates to the underlying [value] operator==. |
- */ |
+ /// Delegates to the underlying [value] operator==. |
bool operator ==(o) => o is Optional && o._value == _value; |
String toString() { |