#pragma once

namespace panda {

template <typename Begin, typename End = Begin>
struct IteratorPair {
    Begin first;
    End   second;

    IteratorPair (Begin begin, End end) : first(std::move(begin)), second(std::move(end)) {}

    const Begin& begin () const { return first; }
    const End&   end   () const { return second; }

    Begin& begin () { return first; }
    End&   end   () { return second; }
};

template <typename Begin, typename End = Begin>
auto make_iterator_pair(Begin&& begin, End&& end) {
    return IteratorPair<std::decay_t<Begin>, std::decay_t<End>>(std::forward<Begin>(begin), std::forward<End>(end));
}

}