// La lista doble: insertar y borrar en cualquier punto, hacia adelante y hacia atrás.
#include <iostream>

#include "dlist.h"

namespace {

void print(const DList<int>& list) {
    std::cout << "adelante:";
    for (int value : list) {
        std::cout << " " << value;
    }
    std::cout << "\natrás:   ";
    auto it = list.end();
    while (it != list.begin()) {
        --it;
        std::cout << " " << *it;
    }
    std::cout << "\n";
}

}  // namespace

int main() {
    DList<int> list;
    list.push_back(20);
    list.push_back(40);
    list.push_front(10);
    print(list);

    // Inserta antes del tercer elemento.
    auto it = list.begin();
    ++it;
    ++it;
    auto thirty = list.insert(it, 30);
    print(list);

    // Borra el 30 y sigue desde el siguiente.
    auto after = list.erase(thirty);
    std::cout << "después de borrar: " << *after << "\n";
    print(list);

    list.pop_front();
    list.pop_back();
    list.pop_back();
    std::cout << "tamaño " << list.size() << ", vacía: " << (list.empty() ? "sí" : "no") << "\n";
    list.check_invariants();
    return 0;
}
