#ifndef LIBWCCL_OPS_ACTIONS_DELETE_H
#define LIBWCCL_OPS_ACTIONS_DELETE_H

#include <libwccl/ops/action.h>
#include <libwccl/values/position.h>
#include <libwccl/values/bool.h>
#include <libwccl/ops/function.h>

namespace Wccl {

/**
 * Action to delete lexemes that meet a condition
 * (unless no lexemes would be left, in which case
 * token is left alone with no changes)
 */
class Delete : public Action
{
public:
	typedef boost::shared_ptr<Function<Position> > PosFunctionPtr;
	typedef boost::shared_ptr<Function<Bool> > BoolFunctionPtr;

	Delete(const BoolFunctionPtr& condition, const PosFunctionPtr& pos = detail::CurrentPos())
		: pos_(pos),
		  condition_(condition)
	{
		BOOST_ASSERT(pos_);
		BOOST_ASSERT(condition_);
	}

	/**
	 * @returns Name of the function.
	 */
	std::string name() const {
		return "delete";
	}

	/**
	 * @returns String representation of the Action
	 */
	std::string to_string(const Corpus2::Tagset& tagset) const;

protected:
	/**
	 * Writes string representation of the Action to
	 * an output stream.
	 * @returns Stream written to.
	 * @note May be incomplete and/or containt internal info.
	 */
	std::ostream& write_to(std::ostream& ostream) const;

	/**
	 * Executes the Action on given context: it deletes
	 * all lexemes of the token at given position that meet
	 * the condition, unless all of them meet the condition.
	 * In such case no action is commited to avoid a token
	 * that would otherwise have no lexemes remaining.
	 * Also, no action is done if position points outside sentence.
	 * @returns True if there were any changes made; False otherwise
	 */
	Bool execute(const ActionExecContext &context) const;

private:
	const PosFunctionPtr pos_;
	const BoolFunctionPtr condition_;
};

} /* end ns Wccl */

#endif // LIBWCCL_OPS_ACTIONS_DELETE_H