diff --git a/src/main/java/_4/_2/Filter.java b/src/main/java/_4/_2/Filter.java new file mode 100644 index 0000000..dad2a99 --- /dev/null +++ b/src/main/java/_4/_2/Filter.java @@ -0,0 +1,9 @@ +package _4._2; + +public abstract class Filter implements Sequence { + protected Sequence sequence; + + public Filter(Sequence sequence) { + this.sequence = sequence; + } +} diff --git a/src/main/java/_4/_2/Naturals.java b/src/main/java/_4/_2/Naturals.java new file mode 100644 index 0000000..1dec394 --- /dev/null +++ b/src/main/java/_4/_2/Naturals.java @@ -0,0 +1,10 @@ +package _4._2; + +public class Naturals implements Sequence { + private int last; + + @Override + public int getNext() { + return ++this.last; + } +} diff --git a/src/main/java/_4/_2/Primes.java b/src/main/java/_4/_2/Primes.java new file mode 100644 index 0000000..c2c51d8 --- /dev/null +++ b/src/main/java/_4/_2/Primes.java @@ -0,0 +1,15 @@ +package _4._2; + +public class Primes extends Filter { + public Primes() { + super(new Naturals()); + this.sequence.getNext(); // remove 1 form the sequence + } + + @Override + public int getNext() { + int ret = this.sequence.getNext(); // also removes ret form the sequence + this.sequence = new ZapMultiples(ret, this.sequence); + return ret; + } +} diff --git a/src/main/java/_4/_2/Sequence.java b/src/main/java/_4/_2/Sequence.java new file mode 100644 index 0000000..c9a3cdd --- /dev/null +++ b/src/main/java/_4/_2/Sequence.java @@ -0,0 +1,5 @@ +package _4._2; + +public interface Sequence { + int getNext(); +} diff --git a/src/main/java/_4/_2/ZapMultiples.java b/src/main/java/_4/_2/ZapMultiples.java new file mode 100644 index 0000000..3a31a47 --- /dev/null +++ b/src/main/java/_4/_2/ZapMultiples.java @@ -0,0 +1,19 @@ +package _4._2; + +public class ZapMultiples extends Filter { + private final int divisor; + + public ZapMultiples(int divisor, Sequence sequence) { + super(sequence); + if(divisor < 2) { + throw new IllegalArgumentException("divisor must be >= 2"); + } + this.divisor = divisor; + } + + @Override + public int getNext() { + int next = this.sequence.getNext(); + return next % divisor == 0 ? this.getNext() : next; + } +}