All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.github.vipcxj.jasync.ng.runtime.schedule.PortalTask Maven / Gradle / Ivy

package io.github.vipcxj.jasync.ng.runtime.schedule;

import io.github.vipcxj.jasync.ng.spec.*;
import io.github.vipcxj.jasync.ng.spec.functional.JAsyncPortalTask1;

public class PortalTask implements Task {

    private final JAsyncPortalTask1 jumperTask;
    private JPortal portal;
    private JDisposable disposable;
    private int repeated;
    private boolean disposed;


    public PortalTask(JAsyncPortalTask1 jumperTask) {
        this.jumperTask = jumperTask;
        this.disposed = false;
    }

    public void bindPortal(JPortal portal) {
        this.portal = portal;
    }

    private void doSchedule(JThunk thunk, JContext context) {
        if (!disposed) {
            ++repeated;
            try {
                JPromise next = jumperTask.invoke(portal, context);
                next = next != null ? next : JPromise.empty();
                next.onError(thunk::reject)
                        .onSuccess(thunk::resolve)
                        .async(context);
            } catch (Throwable t) {
                thunk.reject(t, context);
            }
        }
    }

    @Override
    public void schedule(JThunk thunk, JContext context) {
        if (!disposed) {
            if (repeated % 150 == 0) {
                this.disposable = context.getScheduler().schedule(() -> {
                    doSchedule(thunk, context);
                });
                if (disposed) {
                    this.disposable.dispose();
                }
            } else {
                doSchedule(thunk, context);
            }
        }
    }

    @Override
    public void cancel() {
        if (!disposed) {
            this.disposed = true;
            if (disposable != null) {
                disposable.dispose();
            }
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy