@Override default BankersQueue<T> emptyUnit(){ return empty(); }
static <T> BankersQueue<T> of(T... values) { BankersQueue<T> result = empty(); for(T next : values){ result = result.enqueue(next); } return result; } <R> R foldBankersQueue(Function<? super Cons<T>, ? extends R> fn1, Function<? super Nil<T>, ? extends R> fn2);
static <T> BankersQueue<T> fromIterable(Iterable<T> iterable){ if(iterable instanceof BankersQueue) return (BankersQueue<T>)iterable; Iterator<T> it = iterable.iterator(); BankersQueue<T> res = empty(); while(it.hasNext()){ res = res.enqueue(it.next()); } return res; } static <T> BankersQueue<T> fromIterator(Iterator<T> it){
@Override public <T> ImmutableQueue<T> empty() { return BankersQueue.empty(); }
@Override public StreamSubscription subscribe(Consumer<? super IN> onNext, Consumer<? super Throwable> onError, Runnable onComplete) { BankersQueue<StreamSubscription> subs = BankersQueue.empty(); int index[] = {0}; boolean[] finished = {false}; Concat[] ref = {null}; StreamSubscription sub = new StreamSubscription() { @Override public void request(long n) { if (n <= 0) { onError.accept(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.")); return; } super.request(n); ref[0].request(n); } @Override public void cancel() { ref[0].cancel(); super.cancel(); } }; Concat c = new Concat(sub,operators,onNext,onError,onComplete); ref[0]=c; return sub; }
static <T> Monoid<BankersQueue<T>> bankersQueueConcat() { return Monoid.of(BankersQueue.empty(),Semigroups.persistentCollectionConcat()); } static <T> Monoid<LazyString> lazyStringConcat() {
/** * * <pre> * {@code * PersistentQueue<Integer> q = Reducers.toPersistentQueue() .foldMap(Stream.of(1,2,3,4)); * * } * </pre> * @return Reducer to PQueue types */ public static <T> Reducer<PersistentQueue<T>,T> toPersistentQueue() { return Reducer.fromMonoid(Monoids.<T,PersistentQueue<T>>concatPersistentCollection(BankersQueue.empty()), a -> BankersQueue.of(a)); } /**
@Override default BankersQueue<T> drop(long num) { if(num<=0) return this; if(num>=size()) return empty(); return this.foldBankersQueue(c -> { ImmutableList<T> newFront = c.front.drop(num); ImmutableList<T> newBack = c.back.dropRight((int) num - c.front.size()); if (newFront.size() > 0 || newBack.size() > 0) return new Cons<>(newFront, newBack); return empty(); }, nil -> nil); }
@Test public void testMapA(){ assertThat(of(1,2,3).map(i->i*2),equalTo(BankersQueue.of(2,4,6))); assertThat(this.<Integer>empty().map(i->i*2),equalTo(BankersQueue.empty())); } @Test
@Test public void testFlatMapA(){ assertThat(of(1,2,3).flatMap(i-> of(i*2)),equalTo(BankersQueue.of(2,4,6))); assertThat(this.<Integer>empty().concatMap(i-> of(i*2)),equalTo(BankersQueue.empty())); }
public BankersQueue<T> tail() { if(size()==1) return empty(); if(sizeFront==0){ return BankersQueue.ofAll(back.fold(s->s.fold((h, t)->t), n->n)); } if(sizeFront==1){ return ofAll(back); } return new BankersQueue.Cons<>(sizeFront-1,front.fold(s->s.fold((h, t)->t), n->n),sizeBack,back); } public BankersQueue<T> replace(T currentElement, T newElement) {
@Override default BankersQueue<T> emptyUnit(){ return empty(); }
static <T> BankersQueue<T> of(T... values) { BankersQueue<T> result = empty(); for(T next : values){ result = result.enqueue(next); } return result; } <R> R foldBankersQueue(Function<? super Cons<T>, ? extends R> fn1, Function<? super Nil<T>, ? extends R> fn2);
static <T> BankersQueue<T> fromIterable(Iterable<T> iterable){ if(iterable instanceof BankersQueue) return (BankersQueue<T>)iterable; Iterator<T> it = iterable.iterator(); BankersQueue<T> res = empty(); while(it.hasNext()){ res = res.enqueue(it.next()); } return res; } static <T> BankersQueue<T> fromIterator(Iterator<T> it){
@Override public StreamSubscription subscribe(Consumer<? super IN> onNext, Consumer<? super Throwable> onError, Runnable onComplete) { BankersQueue<StreamSubscription> subs = BankersQueue.empty(); int index[] = {0}; boolean[] finished = {false}; Concat[] ref = {null}; StreamSubscription sub = new StreamSubscription() { @Override public void request(long n) { if (n <= 0) { onError.accept(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.")); return; } super.request(n); ref[0].request(n); } @Override public void cancel() { ref[0].cancel(); super.cancel(); } }; Concat c = new Concat(sub,operators,onNext,onError,onComplete); ref[0]=c; return sub; }
static <T> Monoid<BankersQueue<T>> bankersQueueConcat() { return Monoid.of(BankersQueue.empty(),Semigroups.persistentCollectionConcat()); } static <T> Monoid<LazyString> lazyStringConcat() {
/** * * <pre> * {@code * PersistentQueue<Integer> q = Reducers.toPersistentQueue() .foldMap(Stream.of(1,2,3,4)); * * } * </pre> * @return Reducer to PQueue types */ public static <T> Reducer<PersistentQueue<T>,T> toPersistentQueue() { return Reducer.fromMonoid(Monoids.<T,PersistentQueue<T>>concatPersistentCollection(BankersQueue.empty()), a -> BankersQueue.of(a)); } /**
@Override default BankersQueue<T> drop(long num) { if(num<=0) return this; if(num>=size()) return empty(); return this.foldBankersQueue(c -> { ImmutableList<T> newFront = c.front.drop(num); ImmutableList<T> newBack = c.back.dropRight((int) num - c.front.size()); if (newFront.size() > 0 || newBack.size() > 0) return new Cons<>(newFront, newBack); return empty(); }, nil -> nil); }
public BankersQueue<T> tail() { if(size()==1) return empty(); if(sizeFront==0){ return BankersQueue.ofAll(back.fold(s->s.fold((h, t)->t), n->n)); } if(sizeFront==1){ return ofAll(back); } return new BankersQueue.Cons<>(sizeFront-1,front.fold(s->s.fold((h, t)->t), n->n),sizeBack,back); } public BankersQueue<T> replace(T currentElement, T newElement) {