﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace StringParsingLibrary
{
    public class ParsePrimeIntegers : IEnumerable<int>
    {
        private ParseIntegers _pointer { get; set; }
        public ParsePrimeIntegers(string Input)
        {
            this._pointer = new ParseIntegers(Input);
        }

        public IEnumerator<int> GetEnumerator()
        {

            foreach(int i in this._pointer)
            {
                if (IsPrime(i))
                {
                    yield return i;
                }
            }
        }

        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }

        //https://en.wikipedia.org/wiki/Primality_test
//function is_prime(n : integer)
//    if n ≤ 1
//        return false
//    else if n ≤ 3
//        return true
//    else if n mod 2 = 0 or n mod 3 = 0
//        return false
//    let i ← 5
//    while i×i ≤ n
//        if n mod i = 0 or n mod (i + 2) = 0
//            return false
//        i ← i + 6
//    return true
        private bool IsPrime(int n)
        {
            if (n <1)
            {
                return false;
            }
            else if( n<=3 )
            {
                return true;
            }
            else if(n % 2 == 0 || n % 3 == 0)
            {
                return false;
            }
            else
            {
                var i = 5;
                while( i*i <= n)
                {
                    if(n % i == 0 || n % (i + 2) == 0)
                    {
                        return false;
                    }
                    i = i + 6;
                }
                return true;
            }
        }
    }
}
