@Override public ListMonadic<A> reverse() { final List<A> target = newListBuilder(as); java.util.Collections.reverse(target); return mlist(target); }
@Override public <B> IteratorMonadic<B> fmap(final Function<A, B> f) { return mlazy(new Iter<B>() { @Override public boolean hasNext() { return as.hasNext(); } @Override public B next() { return f.apply(as.next()); } }); }
/** Constructor for collections. */ public static <A> ListMonadic<A> mlist(final Collection<A> as) { return mlist(new ArrayList<A>(as)); }
/** Constructor function. */ public static <A> IteratorMonadic<A> mlazy(final Iterable<A> as) { return mlazy(as.iterator()); }
/** Constructor function optimized for lists. */ public static <A> IteratorMonadic<A> mlazy(final List<A> as) { return mlazy(as.iterator()); }
/** Constructor function optimized for arrays. */ public static <A> IteratorMonadic<A> mlazy(A... as) { return mlazy(iterator(as)); }
@Override public ListMonadic<A> drop(int n) { int count = n; while (as.hasNext() && count > 0) { as.next(); count--; } return mlist(as); }
@Override public ListMonadic<A> sort(Comparator<A> c) { final List<A> target = newListBuilder(as.size()); target.addAll(as); java.util.Collections.sort(target, c); return mlist(target); }
@Override public <B> ListMonadic<B> fmap(Function<? super A, ? extends B> f) { final List<B> target = newListBuilder(as.size()); for (A a : as) target.add(f.apply(a)); return mlist(target); }
@Override public <B> ListMonadic<Tuple<A, B>> zip(Iterator<B> bs) { final List<Tuple<A, B>> target = newListBuilder(as.size()); final Iterator<A> asi = as.iterator(); while (asi.hasNext() && bs.hasNext()) { target.add(tuple(asi.next(), bs.next())); } return mlist(target); }
@Override public ListMonadic<A> filter(Function<? super A, Boolean> p) { List<A> target = newListBuilder(as.length); for (A a : as) { if (p.apply(a)) { target.add(a); } } return mlist(target); }
@Override public <B, M extends Iterable<B>> ListMonadic<Tuple<A, B>> zip(M m) { final List<Tuple<A, B>> target = newListBuilder(); int i = 0; final Iterator<B> mi = m.iterator(); while (i < as.length && mi.hasNext()) { target.add(tuple(as[i++], mi.next())); } return mlist(target); }
@Override public <B> ListMonadic<Tuple<A, B>> zip(Iterator<B> bs) { final List<Tuple<A, B>> target = newListBuilder(); while (as.hasNext() && bs.hasNext()) { target.add(tuple(as.next(), bs.next())); } return mlist(target); }
/** * Split a comma separated request param into a list of trimmed strings discarding any blank parts. * <p> * x=comma,separated,,%20value -> ["comma", "separated", "value"] */ public static Monadics.ListMonadic<String> splitCommaSeparatedParam(Option<String> param) { for (String p : param) return mlist(CSV_SPLIT.apply(p)).bind(trimToNil); return mlist(); }
/** Find multiple objects with pagination wrapped in the list monad. */ public <A> Monadics.ListMonadic<A> findAllM(final EntityManager em, final String q, final int offset, final int limit, final P... params) { return mlist(this.<A>findAll(em, q, offset, limit, params)); }
@Override protected void run() { mlist(es).each(run); } };
/** * Returns the main suffix for this mime type, that identifies files containing data of this flavor. * <p> * For example, files with the suffix <code>mj2</code> will contain data of type <code>video/mj2</code>. * * @return the file suffix */ public Option<String> getSuffix() { return mlist(suffixes).headOpt(); }
@Override public ListMonadic<A> sort(Comparator<A> c) { final List<A> target = list(as); java.util.Collections.sort(target, c); return mlist(target); }