// Path: actors/src/main/java/com/droidkit/actors/ActorTime.java
// public class ActorTime {
//     /**
//      * Getting current actor system time
//      *
//      * @return actor system time
//      */
//     public static long currentTime() {
//         return System.nanoTime() / 1000000;
//     }
// }
// 
// Path: actors/src/main/java/com/droidkit/actors/dispatch/AbstractDispatchQueue.java
// public abstract class AbstractDispatchQueue<T> {
// 
//     /**
//      * Value used for result of waitDelay when dispatcher need to wait forever
//      */
//     protected static final long FOREVER = 5 * 60 * 1000L;
// 
//     private QueueListener listener;
// 
//     /**
//      * <p>Fetch message for dispatching and removing it from dispatch queue</p>
//      * You might provide most accurate delay as you can,
//      * this will minimize unnecessary thread work.
//      * For example, if you will return zero here then thread will
//      * loop continuously and consume processor time.
//      *
//      * @param time current time from ActorTime
//      * @return message or delay information
//      */
//     public abstract DispatchResult dispatch(long time);
// 
//     /**
//      * Notification about queue change.
//      */
//     protected void notifyQueueChanged() {
//         QueueListener lListener = listener;
//         if (lListener != null) {
//             lListener.onQueueChanged();
//         }
//     }
// 
//     protected DispatchResult result(T obj) {
//         return DispatchResult.result(obj);
//     }
// 
//     protected DispatchResult delay(long delay) {
//         return DispatchResult.delay(delay);
//     }
// 
//     /**
//      * Getting of current queue listener
//      *
//      * @return queue listener
//      */
//     public QueueListener getListener() {
//         return listener;
//     }
// 
//     /**
//      * Setting queue listener
//      *
//      * @param listener queue listener
//      */
//     public void setListener(QueueListener listener) {
//         this.listener = listener;
//     }
// 
// 
// }
// 
// Path: actors/src/main/java/com/droidkit/actors/dispatch/AbstractDispatcher.java
// public abstract class AbstractDispatcher<T, Q extends AbstractDispatchQueue<T>> {
//     final private Q queue;
//     final Dispatch<T> dispatch;
// 
//     protected AbstractDispatcher(Q queue, Dispatch<T> dispatch) {
//         this.queue = queue;
//         this.dispatch = dispatch;
//         this.queue.setListener(new QueueListener() {
//             @Override
//             public void onQueueChanged() {
//                 notifyDispatcher();
//             }
//         });
//     }
// 
//     /**
//      * Queue used for dispatching
//      *
//      * @return queue
//      */
//     public Q getQueue() {
//         return queue;
//     }
// 
//     /**
//      * Actual execution of action
//      *
//      * @param message action
//      */
//     protected void dispatchMessage(T message) {
//         if (dispatch != null) {
//             dispatch.dispatchMessage(message);
//         }
//     }
// 
//     /**
//      * Notification about queue change
//      */
//     protected void notifyDispatcher() {
// 
//     }
// }
// 
// Path: actors/src/main/java/com/droidkit/actors/dispatch/Dispatch.java
// public interface Dispatch<T> {
//     void dispatchMessage(T message);
// }
// 
// Path: actors/src/main/java/com/droidkit/actors/dispatch/DispatchResult.java
// public class DispatchResult {
// 
//     private static ThreadLocal<DispatchResult> FREE_RESULTS = new ThreadLocal<DispatchResult>();
// 
//     public static DispatchResult result(Object res) {
//         DispatchResult result = FREE_RESULTS.get();
//         if (result != null) {
//             FREE_RESULTS.remove();
//             result.update(true, res, 0);
//         } else {
//             result = new DispatchResult(true, res, 0);
//         }
//         return result;
//     }
// 
//     public static DispatchResult delay(long delay) {
//         DispatchResult result = FREE_RESULTS.get();
//         if (result != null) {
//             FREE_RESULTS.remove();
//             result.update(false, null, delay);
//         } else {
//             result = new DispatchResult(false, null, delay);
//         }
//         return result;
//     }
// 
// 
//     private boolean isResult;
//     private Object res;
//     private long delay;
// 
//     DispatchResult(boolean isResult, Object res, long delay) {
//         this.isResult = isResult;
//         this.res = res;
//         this.delay = delay;
//     }
// 
//     void update(boolean isResult, Object res, long delay) {
//         this.isResult = isResult;
//         this.res = res;
//         this.delay = delay;
//     }
// 
//     public boolean isResult() {
//         return isResult;
//     }
// 
//     public Object getRes() {
//         return res;
//     }
// 
//     public long getDelay() {
//         return delay;
//     }
// 
//     public void recycle() {
//         FREE_RESULTS.set(this);
//     }
// }


import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import com.droidkit.actors.ActorTime;
import com.droidkit.actors.dispatch.AbstractDispatchQueue;
import com.droidkit.actors.dispatch.AbstractDispatcher;
import com.droidkit.actors.dispatch.Dispatch;
import com.droidkit.actors.dispatch.DispatchResult;
package com.droidkit.actors.android;



/**
 * Thread Dispatcher that dispatches messages on UI Thread
 */
public class UiDispatcher<T, Q extends AbstractDispatchQueue<T>> extends AbstractDispatcher<T, Q> {
    private Handler handler = new Handler(Looper.getMainLooper()) {
        @Override
        public void dispatchMessage(Message msg) {
// Path: actors/src/main/java/com/droidkit/actors/ActorTime.java
// public class ActorTime {
//     /**
//      * Getting current actor system time
//      *
//      * @return actor system time
//      */
//     public static long currentTime() {
//         return System.nanoTime() / 1000000;
//     }
// }
// 
// Path: actors/src/main/java/com/droidkit/actors/dispatch/AbstractDispatchQueue.java
// public abstract class AbstractDispatchQueue<T> {
// 
//     /**
//      * Value used for result of waitDelay when dispatcher need to wait forever
//      */
//     protected static final long FOREVER = 5 * 60 * 1000L;
// 
//     private QueueListener listener;
// 
//     /**
//      * <p>Fetch message for dispatching and removing it from dispatch queue</p>
//      * You might provide most accurate delay as you can,
//      * this will minimize unnecessary thread work.
//      * For example, if you will return zero here then thread will
//      * loop continuously and consume processor time.
//      *
//      * @param time current time from ActorTime
//      * @return message or delay information
//      */
//     public abstract DispatchResult dispatch(long time);
// 
//     /**
//      * Notification about queue change.
//      */
//     protected void notifyQueueChanged() {
//         QueueListener lListener = listener;
//         if (lListener != null) {
//             lListener.onQueueChanged();
//         }
//     }
// 
//     protected DispatchResult result(T obj) {
//         return DispatchResult.result(obj);
//     }
// 
//     protected DispatchResult delay(long delay) {
//         return DispatchResult.delay(delay);
//     }
// 
//     /**
//      * Getting of current queue listener
//      *
//      * @return queue listener
//      */
//     public QueueListener getListener() {
//         return listener;
//     }
// 
//     /**
//      * Setting queue listener
//      *
//      * @param listener queue listener
//      */
//     public void setListener(QueueListener listener) {
//         this.listener = listener;
//     }
// 
// 
// }
// 
// Path: actors/src/main/java/com/droidkit/actors/dispatch/AbstractDispatcher.java
// public abstract class AbstractDispatcher<T, Q extends AbstractDispatchQueue<T>> {
//     final private Q queue;
//     final Dispatch<T> dispatch;
// 
//     protected AbstractDispatcher(Q queue, Dispatch<T> dispatch) {
//         this.queue = queue;
//         this.dispatch = dispatch;
//         this.queue.setListener(new QueueListener() {
//             @Override
//             public void onQueueChanged() {
//                 notifyDispatcher();
//             }
//         });
//     }
// 
//     /**
//      * Queue used for dispatching
//      *
//      * @return queue
//      */
//     public Q getQueue() {
//         return queue;
//     }
// 
//     /**
//      * Actual execution of action
//      *
//      * @param message action
//      */
//     protected void dispatchMessage(T message) {
//         if (dispatch != null) {
//             dispatch.dispatchMessage(message);
//         }
//     }
// 
//     /**
//      * Notification about queue change
//      */
//     protected void notifyDispatcher() {
// 
//     }
// }
// 
// Path: actors/src/main/java/com/droidkit/actors/dispatch/Dispatch.java
// public interface Dispatch<T> {
//     void dispatchMessage(T message);
// }
// 
// Path: actors/src/main/java/com/droidkit/actors/dispatch/DispatchResult.java
// public class DispatchResult {
// 
//     private static ThreadLocal<DispatchResult> FREE_RESULTS = new ThreadLocal<DispatchResult>();
// 
//     public static DispatchResult result(Object res) {
//         DispatchResult result = FREE_RESULTS.get();
//         if (result != null) {
//             FREE_RESULTS.remove();
//             result.update(true, res, 0);
//         } else {
//             result = new DispatchResult(true, res, 0);
//         }
//         return result;
//     }
// 
//     public static DispatchResult delay(long delay) {
//         DispatchResult result = FREE_RESULTS.get();
//         if (result != null) {
//             FREE_RESULTS.remove();
//             result.update(false, null, delay);
//         } else {
//             result = new DispatchResult(false, null, delay);
//         }
//         return result;
//     }
// 
// 
//     private boolean isResult;
//     private Object res;
//     private long delay;
// 
//     DispatchResult(boolean isResult, Object res, long delay) {
//         this.isResult = isResult;
//         this.res = res;
//         this.delay = delay;
//     }
// 
//     void update(boolean isResult, Object res, long delay) {
//         this.isResult = isResult;
//         this.res = res;
//         this.delay = delay;
//     }
// 
//     public boolean isResult() {
//         return isResult;
//     }
// 
//     public Object getRes() {
//         return res;
//     }
// 
//     public long getDelay() {
//         return delay;
//     }
// 
//     public void recycle() {
//         FREE_RESULTS.set(this);
//     }
// }


// Path: actors-android/src/main/java/com/droidkit/actors/android/UiDispatcher.java
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import com.droidkit.actors.ActorTime;
import com.droidkit.actors.dispatch.AbstractDispatchQueue;
import com.droidkit.actors.dispatch.AbstractDispatcher;
import com.droidkit.actors.dispatch.Dispatch;
import com.droidkit.actors.dispatch.DispatchResult;

package com.droidkit.actors.android;



/**
 * Thread Dispatcher that dispatches messages on UI Thread
 */
public class UiDispatcher<T, Q extends AbstractDispatchQueue<T>> extends AbstractDispatcher<T, Q> {
    private Handler handler = new Handler(Looper.getMainLooper()) {
        @Override
        public void dispatchMessage(Message msg) {
            doIteration();