package simulation.sieve.try1;

/*
 * Basic iterative Sieve of Eratosthenes
 */

class Sieve1
{
    def eratosthenes(a_limit)
    {
        def primes = []

        use (IntegerCatagory)
        {
            sieve(a_limit) { primeNumber ->
                   
                primes << primeNumber
            }
        }
       
        primes
    }
   
    def sieve(a_limit, a_foundPrime)
    {
        /*
         * Create initial list of numbers
         */

        def numbers = []
        a_limit.times { number ->
            numbers << number
        }

        /*
         * For each factor in list of numbers
         */

        (2..a_limit).each { factor ->

            (0..numbers.size()).each { index ->
               
                def number = numbers[index]
                if (numbers[index] > 0 && number.hasFactor(factor))
                {
                    numbers[index] = 0
                }
                else if (number == factor)
                {
                    a_foundPrime(factor)
                }
            }
        }
    }
}

class IntegerCatagory
{
    def static boolean hasFactor(Integer a_number, Integer a_factor)
    {
        a_number != a_factor && a_number % a_factor == 0
    }
}


...