package ru.job4j.set;

import java.util.Iterator;
import java.util.NoSuchElementException;

/**
 * Class SimpleLinkedListSet.
 * создание Set на базе LinkedList.
 *
 * @author Alexey Rastorguev (rastorguev00@gmail.com)
 * @version 0.1
 * @since 18.12.17
 */
public class SimpleLinkedListSet<T> implements SimpleContainerSet<T> {
    private Node<T> first;  // первый элемент в set на базе связанного списке
    private Node<T> end;    // последний элемент в set на базе связанного списке
    private int key = 0;  //

    /**
     * метод добавления в set лементов.
     * @param value значение элемента
     */
    @Override
    public void add(T value) {

        /**
         * добавление элемента если к set-е нет такого элемента
         */
        if (enlarge(value)) {
            end.next = new Node<T>(key++, value);
            end = end.next;
        }
    }

    @Override
    public Iterator<T> iterator() {
        return new Iter();
    }

    private class Iter implements Iterator<T> {
        private Node<T> position = first;

        @Override
        public boolean hasNext() {
            return (position != null);
        }

        @Override
        public T next() {
            T rezult = null;
            if (hasNext()) {
                rezult = position.tDate;
                position = position.next;
            } else {
                throw new NoSuchElementException();
            }
            return rezult;
        }
    }

    /**
     * ячейка  связанного списка
     * @param <T> обобщенный тип
     */
    private class Node<T> {
        private int key;
        private T tDate;
        private Node<T> next;

        public Node(int key, T tDate) {
            this.key = key;
            this.tDate = tDate;
        }
    }

    /**
     * в цикле проверяем  есть ли елемент который мы хотим добавить,
     * @param value искомое значение в списке
     * @return true - не найден, иначе - false.
     */
    private boolean enlarge(T value) {
        boolean isEmpty = true;
        Node<T> current = first;
        while (isEmpty) {
            if (first == null) {
                first = new Node<>(key++, value);
                end = new Node<>(key++, value);
                isEmpty = false;
            } else if ((current.tDate).equals(value)) {
                isEmpty = false;
                break;
            } else if (current.next == null) {
                break;
            } else {
                current = current.next;
            }
        }
        return isEmpty;
    }
}

@@ -755,26 +755,163 @@
 if (
-enlarge(value)) %7B%0A
+isFind(value)) %7B%0A            if (first == null) %7B%0A                first = new Node%3CT%3E(key++, value);%0A                end = first;%0A            %7D else %7B%0A    
     
@@ -964,24 +964,28 @@
             
+    
 end = end.ne
@@ -984,24 +984,39 @@
 = end.next;%0A
+            %7D%0A%0A
         %7D%0A  
@@ -2125,15 +2125,14 @@
 ean 
-enlarge
+isFind
 (T v
@@ -2223,42 +2223,17 @@
 le (
-isEmpty) %7B%0A            if (first =
+current !
 = nu
@@ -2254,285 +2254,77 @@
     
-    first = new Node%3C%3E(key++, value);%0A                end = new Node%3C%3E(key++, value);%0A                isEmpty = false;%0A            %7D else if ((current.tDate).equals(value)) %7B%0A                isEmpty = false;%0A                break;%0A            %7D else if (current.next == null) %7B
+if ((current.tDate).equals(value)) %7B%0A                isEmpty = false;
 %0A   

modify SimpleLinkedListSet method isFind and add [task #997].