#include <libwccl/ops/formatters.h>
#include <sstream>

namespace Wccl {

// ------ UnaryFunctionFormatter -----

std::string UnaryFunctionFormatter::to_raw_string(
	const FunctionBase& f,
	const FunctionBase& arg_expr,
	const char* open_bracket,
	const char* close_bracket)
{
	std::stringstream ss;
	ss << f.raw_operator_name() << open_bracket << arg_expr.to_raw_string()
		<< close_bracket;
	return ss.str();
}

std::string UnaryFunctionFormatter::to_string(
	const Corpus2::Tagset& tagset,
	const FunctionBase& f,
	const FunctionBase& arg_expr,
	const char* open_bracket,
	const char* close_bracket)
{
	std::stringstream ss;
	ss << f.operator_name(tagset) << open_bracket << arg_expr.to_string(tagset)
		<< close_bracket;
	return ss.str();
}

// ----- BinaryFunctionFormatter ------

std::string BinaryFunctionFormatter::to_string(
	const Corpus2::Tagset& tagset,
	const FunctionBase& f,
	const FunctionBase& arg1_expr,
	const FunctionBase& arg2_expr)
{
	std::stringstream ss;
	ss << f.operator_name(tagset) << "(" << arg1_expr.to_string(tagset)
		<< ", " << arg2_expr.to_string(tagset) << ")";
	return ss.str();
}

std::string BinaryFunctionFormatter::to_raw_string(
	const FunctionBase& f,
	const FunctionBase& arg1_expr,
	const FunctionBase& arg2_expr)
{
	std::stringstream ss;
	ss << f.raw_operator_name() << "(" << arg1_expr.to_raw_string()
		<< ", " << arg2_expr.to_raw_string() << ")";
	return ss.str();
}

} /* end ns Wccl */