/*
    ZADANIE:

    W koszyku piknikowym (kolekcja elementów) znajdują się owoce i napoje
    butelkowane. Każdy element koszyka ma jakąś cenę, a napoje butelkowane 
    oprócz tego mają jeszcze kaucję. Zaproponuj i zaimplementuj sposób 
    reprezentacji zawartości koszyka oraz funkcję, która pobierze zawartość 
    koszyka i zwróci sumaryczną wartość tego koszyka z uwzględnieniem kaucji 
    za butelki.

    Uwaga! W rozwiązaniu nie można użyć pętli for, while ani std::for_each.
*/

// student dostaje w zadaniu:
struct Fruit {
  int value;
};

struct Drink {
    int value;
    int deposit;
};

// przykładowe rozwiązanie:

#include <numeric>
#include <variant>
#include <vector>

using Item = std::variant<Fruit, Drink>;

struct Func {
    int operator()(Fruit f) { return f.value; }
    int operator()(Drink d) { return d.value + d.deposit; }
};

int totalValue(std::vector<Item> collection) {
    return std::accumulate(collection.begin(), collection.end(), 0, [](int result, auto item) {
        return result + std::visit(Func{}, item);
    });
}
