#ifndef __LL_H__
#define __LL_H__

#include <iostream>
#include <cassert>
#include "Factory.h"

using namespace std;

struct node {
    int value;
    node * next;
    node(int value): value(value), next(NULL) {};

    friend ostream & operator<<(ostream &, const node &);
};

class ll : public LinkedListInterface
{
    private:
        int _size;
    public:
        ll();
        ~ll();

        node * head;
        node * tail;

        void insertHead(int value);
        void insertTail(int value);
        void insertAfter(int value, int insertionNode);
        void remove(int value);
        void clear();
        int at(int index);
        int size();

        node * find(int value);

        friend ostream & operator<<(ostream & os, const ll & i);
};

#endif
