using System;
using System.Diagnostics;
using Implab.Parallels;
namespace Implab {
///
/// Класс для асинхронного получения результатов. Так называемое "обещание".
///
/// Тип получаемого результата
///
/// Сервис при обращении к его методу дает обещаиние о выполнении операции,
/// клиент получив такое обещание может установить ряд обратных вызово для получения
/// событий выполнения обещания, тоесть завершения операции и предоставлении результатов.
///
/// Обещение может быть как выполнено, так и выполнено с ошибкой. Для подписки на
/// данные события клиент должен использовать методы Then.
///
///
/// Сервис, в свою очередь, по окончанию выполнения операции (возможно с ошибкой),
/// использует методы Resolve либо Reject для оповещения клиетна о
/// выполнении обещания.
///
///
/// Если сервер успел выполнить обещание еще до того, как клиент на него подписался,
/// то в момент подписки клиента будут вызваны соответсвующие события в синхронном
/// режиме и клиент будет оповещен в любом случае. Иначе, обработчики добавляются в
/// список в порядке подписания и в этом же порядке они будут вызваны при выполнении
/// обещания.
///
///
/// Обрабатывая результаты обещания можно преобразовывать результаты либо инициировать
/// связанные асинхронные операции, которые также возвращают обещания. Для этого следует
/// использовать соответствующую форму методе Then.
///
///
/// Также хорошим правилом является то, что Resolve и Reject должен вызывать
/// только инициатор обещания иначе могут возникнуть противоречия.
///
///
public class Promise : AbstractPromise, IDeferred {
public static IPromise FromResult(T value) {
var p = new Promise();
p.Resolve(value);
return p;
}
public static IPromise FromException(Exception error) {
var p = new Promise();
p.Reject(error);
return p;
}
public virtual void Resolve(T value) {
SetResult(value);
}
public void Reject(Exception error) {
SetError(error);
}
}
}