import example1.Filter;
import example1.*;
import example2.*;
import iterator1.safeCollections.Iterator;
import iterator1.safeCollections.NaturalList;
import sun.reflect.generics.reflectiveObjects.NotImplementedException;

class Program {

    public interface I {

        void X();
    }

    abstract class A implements I {

        @Override
        public abstract void X();

        public void Test() {
            System.out.println("A");
        }
    }

    class B extends A {

        @Override
        public void Test() {
            super.Test();
            System.out.println("B");
        }

        @Override
        public void X() {
            throw new NotImplementedException();
        }
    }

    public static void main(String[] args) {

//        B b = new B();
//        b.Test();
        ///Example 1 test
        //Iterator<int> iterator = new Lesson2.SafeCollections.NaturalList();
        //Iterator<int> iterator = new Filter<int>(new Lesson2.SafeCollections.NaturalList(), value => value % 2 == 0);
        
        Iterator<String> iterator = new Map<Integer, String>(new Filter<Integer>(new NaturalList(), value -> value % 2 == 0), elem -> elem + " :)");

        for (int i = 0; i < 10; i++) {
            iterator.getNext().visit(() -> {
                System.out.println("Done");
                return null;
            }, v -> {
                System.out.println(v);
                return null;
            });
        }

        ///Example 2 test
        System.out.println("***\r\nBegin program\r\n");

        //IRepository<Customer> customerRepository = new Repository<Customer>();
        IRepository<Customer> customerRepository = new LoggerRepository<Customer>(new Repository<Customer>());

        Customer customer = new Customer(1, "Customer 1", "Address 1");

        customerRepository.add(customer);
        customerRepository.update(customer);
        customerRepository.delete(customer);

        System.out.println("\r\nEnd program \r\n***");

    }
}