// Copyright (c) 2016, the Dart 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 'dart:async';

import 'result.dart';
import 'error.dart';

/// A result representing a returned value.
class ValueResult<T> implements Result<T> {
  /// The result of a successful computation.
  final T value;

  @override
  bool get isValue => true;
  @override
  bool get isError => false;
  @override
  ValueResult<T> get asValue => this;
  @override
  ErrorResult get asError => null;

  ValueResult(this.value);

  @override
  void complete(Completer<T> completer) {
    completer.complete(value);
  }

  @override
  void addTo(EventSink<T> sink) {
    sink.add(value);
  }

  @override
  Future<T> get asFuture => Future.value(value);

  @override
  int get hashCode => value.hashCode ^ 0x323f1d61;

  @override
  bool operator ==(Object other) =>
      other is ValueResult && value == other.value;
}
