#ifndef FWDLIB_HPP
#define FWDLIB_HPP

#include <string>
#include <optional>
#include <iostream>
#include <functional>
#include <unordered_map>
#include <unordered_set>

using namespace std;

static void fwd_getline(auto next)
{
	if (cin.eof())
		return next(optional<string>{});

	if (string line; getline(cin, line))
		return next(optional<string>{line});
	else
		return next(optional<string>{});
}

static void fwd_foreach(auto container, auto next)
{
	for (auto &n : container)
		next(n);
}

static void fwd_some(auto option, auto ok, auto fail)
{
	if (option)
		return ok(std::move(option.value()));
	else
		return fail();
}

static void fwd_insert(auto container, auto elem, auto next)
{
	container.insert(std::move(elem));
	return next(std::move(container));
}

static void fwd_println(auto elem)
{
	cout << elem << endl;
}

#endif /* FWDLIB_HPP */