#include <print>
#include <deque>
#include <string>
#include <algorithm>

int main()
{
    // Deque mit den Arbeitsauftraegen
    std::deque<std::string> workPackages;
    // Lambda-Funktion zur Ausgabe eines Arbeitsauftrags
    auto PData = [](std::string_view view)
    { std::println("{}", view); };

    // Drei Arbeitsauftraege ablegen
    workPackages.emplace_front("Arbeitsauftrag 1");
    workPackages.emplace_front("Arbeitsauftrag 2");
    workPackages.emplace_front("Arbeitsauftrag 3");

    // Alle Arbeitsauftraege ausgeben
    std::println("Anstehende Arbeiten:");
    std::ranges::for_each(workPackages, PData);

    // Zwei Arbeitsauftraege bearbeiten
    std::print("Bearbeite ");
    PData(workPackages.back());
    workPackages.pop_back();
    std::print("Bearbeite ");
    PData(workPackages.back());
    workPackages.pop_back();

    // Alle Arbeitsauftraege ausgeben
    std::println("Noch offene Arbeitsauftraege:");
    std::ranges::for_each(workPackages, PData);

    // Neuen Arbeitsauftrag hinzufuegen
    std::println("Neuer Arbeitsauftrag:");
    workPackages.emplace_front("Arbeitsauftrag 4");

    // Alle Arbeitsauftraege ausgeben
    std::println("Noch offene Arbeitsauftraege:");
    std::ranges::for_each(workPackages, PData);

    // Alle Arbeitsauftraege abarbeiten
    std::println("Alle Arbeitsauftraege abarbeiten:");
    while (!workPackages.empty())
    {
        std::print("Bearbeite ");
        PData(workPackages.back());
        workPackages.pop_back();
    }
}
