#include <eepp/ui/doc/languages/bend.hpp>
#include <eepp/ui/doc/syntaxdefinitionmanager.hpp>

namespace EE { namespace UI { namespace Doc { namespace Language {

SyntaxDefinition& addBend() {

	auto& sd = SyntaxDefinitionManager::instance()->add(

		{ "Bend",
		  { "%.bend$" },
		  {
			  { { "#.*" }, "comment" },
			  { { "\"", "\"" }, "string" },
			  { { "'", "'" }, "string" },
			  { { "[%a_][%w_]*%f[(]" }, "function" },
			  { { "[%a_][%w_]*" }, "symbol" },
			  { { "[%+%-=/%*%^%%<>!|&]" }, "operator" },
			  { { "(def)(%s+)([%a_][%w_]*)" }, { "normal", "keyword", "normal", "literal" } },
			  { { "(data)(%s+)([%a_][%w_]*)" }, { "normal", "keyword", "normal", "literal" } },
			  { { "(let)(%s+)([%a_][%w_]*)" }, { "normal", "keyword", "normal", "literal" } },
			  { { "(Some)(%s+)([%a_][%w_]*)" }, { "normal", "keyword", "normal", "literal" } },
			  { { "(bend)(%s+)([%a_][%w_]*)" }, { "normal", "keyword", "normal", "literal" } },
			  { { "(object)(%s+)([%a_][%w_]*)" }, { "normal", "keyword", "normal", "literal" } },
			  { { "(fold)(%s+)([%a_][%w_]*)" }, { "normal", "keyword", "normal", "literal" } },
			  { { "(open)(%s+)([%a_][%w_]*)" }, { "normal", "keyword", "normal", "literal" } },
			  { { "(do)(%s+)([%a_][%w_]*)" }, { "normal", "keyword", "normal", "literal" } },
			  { { "(identity)(%s+)([%a_][%w_]*)" }, { "normal", "keyword", "normal", "literal" } },
			  { { "(lambda)(%s+)([%a_][%w_]*)" }, { "normal", "keyword", "normal", "literal" } },
			  { { "0x[%da-fA-F]+" }, "number" },
			  { { "-?%d+[%d%.eE]*" }, "number" },
			  { { "-?%.?%d+" }, "number" },

		  },
		  {
			  { "Nil", "type" },	   { "Name", "keyword" },	  { "bind", "keyword" },
			  { "switch", "keyword" }, { "data", "keyword" },	  { "None", "type" },
			  { "return", "keyword" }, { "identity", "keyword" }, { "ask", "keyword" },
			  { "object", "keyword" }, { "match", "keyword" },	  { "with", "keyword" },
			  { "fold", "keyword" },   { "false", "literal" },	  { "def", "keyword" },
			  { "true", "literal" },   { "else", "keyword" },	  { "λ", "keyword" },
			  { "Bool", "keyword" },   { "when", "keyword" },	  { "bend", "type" },
			  { "use", "keyword" },	   { "case", "keyword" },	  { "if", "keyword" },
			  { "let", "keyword" },	   { "Result", "type" },	  { "do", "keyword" },
			  { "open", "keyword" },   { "Some", "keyword" },	  { "type", "type" },

		  },
		  "#",
		  {}

		} );

	sd.setFoldRangeType( FoldRangeType::Indentation );
	return sd;
}

}}}} // namespace EE::UI::Doc::Language
