package com.luticate.utils.business; import com.luticate.utils.dbo.LuPromiseError; import java.util.List; import java.util.Vector; /** * * Created by robin on 11/27/15. */ public class LuPromise { public enum LuPromiseStatus { Running, Resolved, Failed } private List> _onSuccess = new Vector<>(); private List> _onFailed = new Vector<>(); protected LuPromiseStatus _status = LuPromiseStatus.Running; protected T _data = null; protected LuPromiseError _error = null; public LuPromiseStatus getStatus() { return _status; } public T getData() { return _data; } public LuPromiseError getError() { return _error; } public LuPromise then(LuConsumer onSuccess, LuConsumer onFailed) { _onFailed.add(onFailed); if (_status == LuPromiseStatus.Failed) { if (onFailed != null) { onFailed.execute(_error); } } return then(onSuccess); } public LuPromise then(LuConsumer onSuccess) { _onSuccess.add(onSuccess); if (_status == LuPromiseStatus.Resolved) { if (onSuccess != null) { onSuccess.execute(_data); } } return this; } public LuPromise resolve(T data) { if (_status == LuPromiseStatus.Running) { _data = data; _error = null; _status = LuPromiseStatus.Resolved; onSuccess(); } return this; } public LuPromise reject(LuPromiseError error) { if (_status == LuPromiseStatus.Running) { _data = null; _error = error; _status = LuPromiseStatus.Failed; onFailed(); } return this; } public LuPromise map(final LuConverter converter) { final LuPromise promise = new LuPromise<>(); then(new LuConsumer() { @Override public void execute(T data) { promise.resolve(converter.convert(data)); } }, getRejectConsumer()); return promise; } public LuConsumer getRejectConsumer() { return new LuConsumer() { @Override public void execute(LuPromiseError error) { reject(error); } }; } protected void onSuccess() { for (LuConsumer c : _onSuccess) { if (c != null) { c.execute(_data); } } } protected void onFailed() { for (LuConsumer c : _onFailed) { if (c != null) { c.execute(_error); } } } }