@Override public void subscribeAll(Consumer<? super R> onNext, Consumer<? super Throwable> onError, Runnable onCompleteDs) { final Mutable<Seq<T>> list = Mutable.of(Seq.empty()); boolean[] sent = {false}; source.subscribeAll(e-> { try { list.mutate(var -> var.insertAt(Math.max(0, var.size()),e)); if(list.get().size()==windowSize) { onNext.accept(finalizer.apply(list.get())); sent[0] = true; for (int i = 0; i < increment && list.get() .size() > 0; i++) list.mutate(var -> var.removeAt(0)); }else{ sent[0]=false; if(!sent[0] && list.get().size()>0) onNext.accept(finalizer.apply(list.get())); onCompleteDs.run(); });
@Override public boolean tryAdvance(Consumer<? super R> action) { if(!canAdvance) return false; data = false; for (int i = 0; i < increment && list.get() .size() > 0; i++) list.mutate(var -> var.removeAt(0)); for (; list.get() .size() < windowSize && canAdvance;) { Mutable<T> box = Mutable.of(null); canAdvance = source.tryAdvance(t -> { box.accept(t); }); if (box.get()!=null) { data =true; list.mutate(var -> var.insertAt(Math.max(0, var.size()), box.get())); } } if(data) action.accept(finalizer.apply(list.get())); return canAdvance; }
@Override public void forEachRemaining(Consumer<? super R> action) { source.forEachRemaining(t->{ if(data==false) data = true; list.mutate(var -> var.insertAt(Math.max(0, var.size()), t)); if(list.get().size()==windowSize){ action.accept(finalizer.apply(list.get())); sent = true; for (int i = 0; i < increment && list.get() .size() > 0; i++) list.mutate(var -> var.removeAt(0)); }else{ sent =false; } }); if(!sent && data){ action.accept(finalizer.apply(list.get())); } } boolean canAdvance = true;
@Override public void accept(final T t) { set(t); }
@Override public R get() { return fn.apply(host.get()); }
public <T1> Mutable<T1> mapInput(final Function<T1, T> fn) { final Mutable<T> host = this; return new Mutable<T1>() { @Override public Mutable<T1> set(final T1 value) { host.set(fn.apply(value)); return this; } }; }
@Override public final void subscribe(final Subscriber<? super T> sub) { Mutable<Future<T>> future = Mutable.of(this); sub.onSubscribe(new Subscription() {
@Test public void externalMapInput(){ value = ""; Mutable<String> ext = Mutable.fromExternal(()->value,v->this.value=v) .mapInput(s->s+"!"); ext.set("hello"); assertThat(value,equalTo("hello!")); }
@Test public void externalMapOutputs(){ value = "world"; Mutable<String> ext = Mutable.fromExternal(()->value,v->this.value=v) .mapOutput(s->s+"?"); assertThat(ext.get(),equalTo("world?")); } }
@Override public void request(final long n) { if (n < 1) { sub.onError(new IllegalArgumentException( "3.9 While the Subscription is not cancelled, Subscription.request(long n) MUST throw a java.lang.IllegalArgumentException if the argument is <= 0.")); } if (!running.compareAndSet(true, false)) { return; } future.mutate(f -> f.peek(sub::onNext) .recover(t -> { sub.onError(t); return null; }) .peek(i -> sub.onComplete())); }
@Test public void externalGet(){ value = "world"; Mutable<String> ext = Mutable.fromExternal(()->value,v->this.value=v); assertThat(ext.get(),equalTo("world")); } @Test
@Test public void externalSet(){ value = ""; Mutable<String> ext = Mutable.fromExternal(()->value,v->this.value=v); ext.set("hello"); assertThat(value,equalTo("hello")); }
@Override public Mutable<T1> set(final T1 value) { host.set(fn.apply(value)); return this; }