package org.shedlang.compiler.util; import org.pcollections.*; import java.util.Map; import java.util.stream.Collector; public class PCollectors { private PCollectors() { } public static Collector, PMapCollector, PMap> toMap() { return Collector.of( PMapCollector::new, PMapCollector::add, PMapCollector::addAll, PMapCollector::toMap ); } private static class PMapCollector { private PMap map = Empty.map(); void add(Map.Entry entry) { map = map.plus(entry.getKey(), entry.getValue()); } PMapCollector addAll(PMapCollector other) { map = map.plusAll(other.map); return this; } PMap toMap() { return map; } } public static Collector, POrderedMapCollector, POrderedMap> toOrderedMap() { return Collector.of( POrderedMapCollector::new, POrderedMapCollector::add, POrderedMapCollector::addAll, POrderedMapCollector::toOrderedMap ); } private static class POrderedMapCollector { private POrderedMap map = POrderedMap.empty(); void add(Map.Entry entry) { map = map.plus(entry.getKey(), entry.getValue()); } POrderedMapCollector addAll(POrderedMapCollector other) { map = map.plusAll(other.map); return this; } POrderedMap toOrderedMap() { return map; } } public static Collector, OrderedPMapCollector, OrderedPMap> toOrderedPMap() { return Collector.of( OrderedPMapCollector::new, OrderedPMapCollector::add, OrderedPMapCollector::addAll, OrderedPMapCollector::toOrderedMap ); } private static class OrderedPMapCollector { private OrderedPMap map = OrderedPMap.empty(); void add(Map.Entry entry) { map = map.plus(entry.getKey(), entry.getValue()); } OrderedPMapCollector addAll(OrderedPMapCollector other) { map = map.plusAll(other.map); return this; } OrderedPMap toOrderedMap() { return map; } } public static Collector, OrderedPSet> toOrderedSet() { return Collector.of( OrderedPSetCollector::new, OrderedPSetCollector::add, OrderedPSetCollector::addAll, OrderedPSetCollector::toSet ); } private static class OrderedPSetCollector { private OrderedPSet set = OrderedPSet.empty(); void add(T value) { set = set.plus(value); } OrderedPSetCollector addAll(OrderedPSetCollector other) { set = set.plusAll(other.set); return this; } OrderedPSet toSet() { return set; } } public static Collector, PVector> toVector() { return Collector.of( PVectorCollector::new, PVectorCollector::add, PVectorCollector::addAll, PVectorCollector::toVector ); } private static class PVectorCollector { private PVector vector = Empty.vector(); void add(T value) { vector = vector.plus(value); } PVectorCollector addAll(PVectorCollector other) { vector = vector.plusAll(other.vector); return this; } PVector toVector() { return vector; } } }