Ranides Atterwim 10 lat temu
rodzic
commit
bc12b35a54

+ 152 - 0
assira/pom.xml.orig

@@ -0,0 +1,152 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>net.ranides</groupId>
+		<artifactId>assira.common</artifactId>
+		<version>2.0.1</version>
+	</parent>
+	<name>assira</name>
+	<groupId>net.ranides</groupId>
+	<artifactId>assira</artifactId>
+	<version>2.0.1</version>
+	<packaging>jar</packaging>
+	
+	<properties>
+		<assira.junit.debug>false</assira.junit.debug>
+	</properties>
+
+	<profiles>
+		<profile>
+			<id>recent-coverage</id>
+			<build>
+				<plugins>
+					<plugin>
+						<groupId>org.jacoco</groupId>
+						<artifactId>jacoco-maven-plugin</artifactId>
+						<version>0.7.5.201505241946</version>
+						<configuration>
+                            <includes>
+                                <include>net/ranides/assira/annotations/Meta*</include>
+                                <include>net/ranides/assira/annotations/javac/**</include>
+                                
+                                <include>net/ranides/assira/awt/ImageLoader*</include>
+                                <include>net/ranides/assira/awt/AWTInvoker*</include>
+                                
+                                <include>net/ranides/assira/collection/arrays/NativeArrayUtils</include>
+                                <include>net/ranides/assira/collection/arrays/ArrayUtils</include>
+                                <include>net/ranides/assira/collection/iterators/ForwardIterator*</include>
+                                <include>net/ranides/assira/collection/iterators/IteratorUtils*</include>
+                                <include>net/ranides/assira/collection/iterators/IntIteratorUtils*</include>
+                                <include>net/ranides/assira/collection/lists/ListUtils</include>
+<<<<<<< HEAD
+                                <include>net/ranides/assira/collection/sets/Bitmask*</include>
+                                <include>net/ranides/assira/lexer/**</include>
+                                
+                                <include>net/ranides/assira/reflection/IAnnotations.class</include>
+                                <include>net/ranides/assira/reflection/IArgument.class</include>
+                                <include>net/ranides/assira/reflection/IArguments.class</include>
+                                <include>net/ranides/assira/reflection/IClass.class</include>
+                                <include>net/ranides/assira/reflection/IClasses.class</include>
+                                <include>net/ranides/assira/reflection/IElement.class</include>
+                                <include>net/ranides/assira/reflection/IElements.class</include>
+                                <include>net/ranides/assira/reflection/IField.class</include>
+                                <include>net/ranides/assira/reflection/IFields.class</include>
+                                <include>net/ranides/assira/reflection/IHints.class</include>
+                                <include>net/ranides/assira/reflection/IMethod.class</include>
+                                <include>net/ranides/assira/reflection/IMethods.class</include>
+                                <include>net/ranides/assira/reflection/IVariable.class</include>
+                                <include>net/ranides/assira/reflection/IVariables.class</include>
+                                
+=======
+                                <include>net/ranides/assira/collection/sets/BitMask*</include>
+                                
+                                <include>net/ranides/assira/lexer/**</include>
+                                
+                                <include>net/ranides/assira/generic/SerializationUtils*</include>
+                                <include>net/ranides/assira/generic/TypeToken*</include>
+                                <include>net/ranides/assira/generic/Wrapper*</include>
+                                
+                                <include>net/ranides/assira/io/IOStreams*</include>
+                                <include>net/ranides/assira/io/IOEvents*</include>
+                                <include>net/ranides/assira/io/StringInput</include>
+                                <include>net/ranides/assira/io/StringOutput*</include>
+                                
+                                <include>net/ranides/assira/math/LSFR*</include>
+                                <include>net/ranides/assira/math/MathUtils*</include>
+                                
+                                <include>net/ranides/assira/reflection/*</include>
+>>>>>>> 9b4a21476445b1d46e695f1131b66ea0e0c244df
+                                <include>net/ranides/assira/reflection/impl/*</include>
+                                <include>net/ranides/assira/reflection/util/ReflectUtils*</include>
+                                
+                                <include>net/ranides/assira/text/StrBuffer*</include>
+                                <include>net/ranides/assira/text/StrBuffer*</include>
+                            </includes>
+						</configuration>
+					</plugin>
+					<plugin>
+						<groupId>org.apache.maven.plugins</groupId>
+						<artifactId>maven-surefire-plugin</artifactId>
+						<configuration>
+							<excludes>
+								<exclude>**/EventLockTest.java</exclude>
+								<exclude>**/EventJoinerTest.java</exclude>
+								<exclude>**/EventDispatcherTest.java</exclude>
+								<exclude>**/EventProactorTest.java</exclude>
+								<exclude>**/EventReactorTest.java</exclude>
+								<exclude>**/LazyReferenceTest.java</exclude>
+							</excludes>
+						</configuration>
+					</plugin>
+				</plugins>
+			</build>
+		</profile>
+	</profiles>
+	
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.jacoco</groupId>
+				<artifactId>jacoco-maven-plugin</artifactId>
+				<version>0.7.5.201505241946</version>
+				<configuration>
+					<excludes>
+						<exclude>net/ranides/assira/test/**</exclude>
+					</excludes>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
+    
+	<repositories>
+		<repository>
+			<id>ranides.net</id>
+			<name>ranides.net</name>
+			<url>http://maven.ranides.net</url>
+		</repository>
+	</repositories>
+    
+	<dependencies>
+		<dependency>
+			<groupId>net.ranides</groupId>
+			<artifactId>assira.asm</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>net.ranides</groupId>
+			<artifactId>assira.junit</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-api</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>com.google.code.findbugs</groupId>
+			<artifactId>annotations</artifactId>
+		</dependency>
+	</dependencies>
+</project>

+ 8 - 0
assira/src/main/java/net/ranides/assira/collection/sets/AVLTreeSet.java

@@ -105,6 +105,14 @@ public class AVLTreeSet<K> extends ASortedSet<K> implements java.io.Serializable
             add(values.next());
         }
     }
+    
+    public AVLTreeSet(Iterator<? extends K> values, Comparator<? super K> comparator) {
+		this(comparator);
+        while (values.hasNext()) {
+            add(values.next());
+        }
+    }
+
 
     /**
      * Creates a new tree set and fills it with the elements of a given array

+ 7 - 0
assira/src/main/java/net/ranides/assira/collection/sets/RBTreeSet.java

@@ -106,6 +106,13 @@ public class RBTreeSet<K> extends ASortedSet<K> implements java.io.Serializable
             add(values.next());
         }
     }
+    
+    public RBTreeSet(Iterator<? extends K> values, Comparator<? super K> comparator) {
+		this(comparator);
+        while (values.hasNext()) {
+            add(values.next());
+        }
+    }
 
     /**
      * Creates a new tree set and fills it with the elements of a given array

+ 96 - 0
assira/src/main/java/net/ranides/assira/streams/IStream.java

@@ -0,0 +1,96 @@
+/*
+ * @author Ranides Atterwim <ranides@gmail.com>
+ * @copyright Ranides Atterwim
+ * @license WTFPL
+ * @url http://ranides.net/projects/assira
+ */
+
+package net.ranides.assira.streams;
+
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.Spliterator;
+import java.util.function.BiPredicate;
+import java.util.function.BinaryOperator;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.function.IntFunction;
+import java.util.function.Predicate;
+import java.util.stream.Collector;
+import java.util.stream.Stream;
+import net.ranides.assira.collection.HashFunction;
+
+/**
+ *
+ * @author Ranides Atterwim <ranides@gmail.com>
+ */
+public interface IStream<T> {
+    
+    Iterator<T> iterator();
+    
+    Spliterator<T> spliterator();
+    
+    Stream<T> stream();
+
+    <A,R> R collect(Collector<T,A,R> collector);
+    
+    Object[] array();
+    
+    <A> A[] array(IntFunction<A[]> generator);
+    
+    List<T> list();
+    
+    Set<T> set();
+    
+    <K> Map<K,T> group(Function<T,K> key);
+    
+    <K,V> Map<K,V> group(Function<T,K> key, Function<T,V> value);
+    
+    int size();
+    
+    boolean isEmpty();
+    
+    IStream<T> limit(int n);
+    
+    IStream<T> skip(int n);
+
+    IStream<T> filter(Predicate<T> p);
+    
+    <R> IStream<R> map(Function<T,R> f);
+    
+    <R> IStream<R> unfold(Function<T,IStream<R>> f);
+    
+    T fold(T identity, BinaryOperator<T> accumulator);
+    
+    T fold(BinaryOperator<T> accumulator);
+    
+    T min(Comparator<T> cmp);
+    
+    T max(Comparator<T> cmp);
+    
+    T first();
+    
+    T last();
+    
+    IStream<T> distinct();
+    
+    IStream<T> distinct(HashFunction<T> eq);
+    
+    IStream<T> distinct(Comparator<T> cmp);
+    
+    IStream<T> sort();
+    
+    IStream<T> sort(Comparator<T> cmp);
+    
+    void each(Consumer<T> consumer);
+    
+    boolean matchAny(Predicate<T> predicate);
+    
+    boolean matchAll(Predicate<T> predicate);
+    
+    boolean matchNone(Predicate<T> predicate);
+    
+}

+ 397 - 0
assira/src/main/java/net/ranides/assira/streams/IStreams.java

@@ -0,0 +1,397 @@
+/*
+ * @author Ranides Atterwim <ranides@gmail.com>
+ * @copyright Ranides Atterwim
+ * @license WTFPL
+ * @url http://ranides.net/projects/assira
+ */
+
+package net.ranides.assira.streams;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.Set;
+import java.util.Spliterator;
+import java.util.function.BiPredicate;
+import java.util.function.BinaryOperator;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.function.IntFunction;
+import java.util.function.IntSupplier;
+import java.util.function.Predicate;
+import java.util.function.Supplier;
+import java.util.stream.Collector;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
+import net.ranides.assira.collection.ACollection;
+import net.ranides.assira.collection.HashFunction;
+import net.ranides.assira.collection.arrays.ArraySort;
+import net.ranides.assira.collection.arrays.NativeArraySort;
+import net.ranides.assira.collection.iterators.IteratorUtils;
+import net.ranides.assira.collection.lists.JoinList;
+import net.ranides.assira.collection.lists.ListUtils;
+import net.ranides.assira.collection.sets.CustomSet;
+import net.ranides.assira.collection.sets.HashSet;
+import net.ranides.assira.collection.sets.RBTreeSet;
+import net.ranides.assira.functional.Fold;
+import net.ranides.assira.generic.LazyReference;
+
+/**
+ *
+ * @author Ranides Atterwim <ranides@gmail.com>
+ */
+public final class IStreams {
+    
+    private IStreams() {
+        /* utility class */
+    }
+
+    public static <T> IStream<T> wrap(Iterable<T> source) {
+        return new SIterable<>(source);
+    }
+    
+    public static <T> IStream<T> wrap(Collection<T> source) {
+        return new SCollection<>(source);
+    }
+    
+    @SafeVarargs
+    public static <T> IStream<T> wrap(T... source) {
+        return new SCollection<>(Arrays.asList(source));
+    }
+    
+    private static abstract class SAbstract<T> implements IStream<T> {
+
+        @Override
+        public final <A, R> R collect(Collector<T, A, R> collector) {
+            return stream().collect(collector);
+        }
+
+        @Override
+        public final Object[] array() {
+            return stream().toArray();
+        }
+
+        @Override
+        public final <A> A[] array(IntFunction<A[]> generator) {
+            return stream().toArray(generator);
+        }
+
+        @Override
+        public final List<T> list() {
+            return stream().collect(Collectors.toList());
+        }
+
+        @Override
+        public final Set<T> set() {
+            return stream().collect(Collectors.toSet());
+        }
+
+        @Override
+        public final <K> Map<K,T> group(Function<T, K> key) {
+            return stream().collect(Collectors.toMap(key, v -> v));
+        }
+
+        @Override
+        public final <K, V> Map<K, V> group(Function<T, K> key, Function<T, V> value) {
+            return stream().collect(Collectors.toMap(key, value));
+        }
+
+        @Override
+        public final boolean isEmpty() {
+            return !iterator().hasNext();
+        }
+
+        @Override
+        public final IStream<T> filter(Predicate<T> p) {
+            return new SIterable<>(() -> IteratorUtils.filter(iterator(), p));
+        }
+
+        @Override
+        public final <R> IStream<R> map(Function<T, R> f) {
+            return new SIterable<>(() -> IteratorUtils.map(iterator(), f), this::size);
+        }
+
+        @Override
+        public final <R> IStream<R> unfold(Function<T, IStream<R>> f) {
+            return new SIterable<R>(() ->
+                IteratorUtils.flat(IteratorUtils.map(iterator(), v -> f.apply(v).iterator()))
+            );
+        }
+
+        @Override
+        public final T fold(T identity, BinaryOperator<T> accumulator) {
+            Iterator<T> i = iterator();
+            return i.hasNext() ? Fold.apply(i, accumulator::apply) : identity;
+        }
+
+        @Override
+        public final T fold(BinaryOperator<T> accumulator) {
+            return fold(null, accumulator);
+        }
+
+        @Override
+        public final T min(Comparator<T> cmp) {
+            return fold((a,b) -> cmp.compare(a, b)<0 ? a : b);
+        }
+
+        @Override
+        public final T max(Comparator<T> cmp) {
+            return fold((a,b) -> cmp.compare(a, b)>0 ? a : b);
+        }
+
+        @Override
+        public final T first() {
+            return IteratorUtils.first(iterator());
+        }
+
+        @Override
+        public final T last() {
+            return IteratorUtils.last(iterator());
+        }
+
+        @Override
+        public final IStream<T> distinct() {
+            return new SSupplier<>(() -> new HashSet<>(iterator()));
+        }
+        
+        @Override
+        public final IStream<T> distinct(HashFunction<T> eq) {
+            return new SSupplier<>(() -> new CustomSet<>(iterator(), eq));
+        }
+    
+        @Override
+        public final IStream<T> distinct(Comparator<T> cmp) {
+            return new SSupplier<>(() -> new RBTreeSet<>(iterator(), cmp));
+        }
+        
+        @Override
+        public final IStream<T> sort() {
+            return new SSupplier<>(() -> {
+                List<T> list = list();
+                ArraySort.mergeSort(list);
+                return list;
+            });
+        }
+
+        @Override
+        public final IStream<T> sort(Comparator<T> cmp) {
+            return new SSupplier<>(() -> {
+                List<T> list = list();
+                ArraySort.mergeSort(list, cmp);
+                return list;
+            });
+        }
+
+        @Override
+        public final void each(Consumer<T> consumer) {
+            stream().forEach(consumer);
+        }
+
+        @Override
+        public final boolean matchAny(Predicate<T> predicate) {
+            return stream().anyMatch(predicate);
+        }
+
+        @Override
+        public final boolean matchAll(Predicate<T> predicate) {
+            return stream().allMatch(predicate);
+        }
+
+        @Override
+        public final boolean matchNone(Predicate<T> predicate) {
+            return stream().noneMatch(predicate);
+        }
+        
+        @Override
+        public IStream<T> limit(int n) {
+            return new SLimit<>(this, 0, n);
+        }
+
+        @Override
+        public IStream<T> skip(int n) {
+            return new SLimit<>(this, n, Integer.MAX_VALUE);
+        }
+        
+    }
+    
+    private static final class SCollection<T> extends SAbstract<T> {
+        
+        private final Collection<T> source;
+        
+        
+        public SCollection(Collection<T> source) {
+            this.source = source;
+        }
+
+        @Override
+        public Iterator<T> iterator() {
+            return source.iterator();
+        }
+
+        @Override
+        public Spliterator<T> spliterator() {
+            return source.spliterator();
+        }
+
+        @Override
+        public Stream<T> stream() {
+            return source.stream();
+        }
+
+        @Override
+        public int size() {
+            return source.size();
+        }
+        
+    }
+    
+    private static final class SIterable<T> extends SAbstract<T> {
+        
+        private final Iterable<T> source;
+        
+        private final IntSupplier size;
+        
+        public SIterable(Iterable<T> source) {
+            this.source = source;
+            this.size = () -> IteratorUtils.size(source.iterator());
+        }
+        
+        public SIterable(Iterable<T> source, IntSupplier size) {
+            this.source = source;
+            this.size = size;
+        }
+
+        @Override
+        public Iterator<T> iterator() {
+            return source.iterator();
+        }
+
+        @Override
+        public Spliterator<T> spliterator() {
+            return source.spliterator();
+        }
+
+        @Override
+        public Stream<T> stream() {
+            return StreamSupport.stream(spliterator(), false);
+        }
+
+        @Override
+        public int size() {
+            return size.getAsInt();
+        }
+        
+        
+    }
+    
+    private static final class SSupplier<T> extends SAbstract<T> {
+        
+        private final Supplier<Collection<T>> source;
+
+        public SSupplier(Supplier<Collection<T>> source) {
+            this.source = source;
+        }
+
+        @Override
+        public Iterator<T> iterator() {
+            return source.get().iterator();
+        }
+
+        @Override
+        public Spliterator<T> spliterator() {
+            return source.get().spliterator();
+        }
+
+        @Override
+        public Stream<T> stream() {
+            return source.get().stream();
+        }
+
+        @Override
+        public int size() {
+            return source.get().size();
+        }
+       
+    }
+    
+    private static final class SLimit<T> extends SAbstract<T> {
+        
+        private final IStream<T> stream;
+        private final int begin;
+        private final int size;
+
+        public SLimit(IStream<T> stream, int begin, int size) {
+            this.stream = stream;
+            this.begin = begin;
+            this.size = size;
+        }
+        
+        @Override
+        public IStream<T> limit(int n) {
+            return new SLimit<>(stream, begin, Math.min(n, size));
+        }
+
+        @Override
+        public IStream<T> skip(int n) {
+            return new SLimit<>(stream, begin+n, size);
+        }
+
+        @Override
+        public Iterator<T> iterator() {
+            Iterator<T> i = stream.iterator();
+            IteratorUtils.next(i, begin);
+            return new LimitIterator<>(i, size);
+        }
+
+        @Override
+        public Spliterator<T> spliterator() {
+            return stream().spliterator();
+        }
+
+        @Override
+        public Stream<T> stream() {
+            return stream.stream().skip(begin).limit(size);
+        }
+
+        @Override
+        public int size() {
+            return Math.min(stream.size(), size);
+        }
+        
+    }
+    
+    private static final class LimitIterator<T> implements Iterator<T> {
+        
+        private final Iterator<T> src;
+        private final int limit;
+        private int count;
+
+        public LimitIterator(Iterator<T> src, int limit) {
+            this.src = src;
+            this.limit = limit;
+        }
+
+        @Override
+        public boolean hasNext() {
+            return count<limit && src.hasNext();
+        }
+
+        @Override
+        public T next() {
+            if(count>=limit) {
+                throw new NoSuchElementException();
+            }
+            count++;
+            return src.next();
+        }
+        
+        
+        
+    }
+    
+}