(function (Prism) {

	Prism.languages.tremor = {
		'comment': {
			pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,
			lookbehind: true
		},
		'interpolated-string': null, // see below
		'extractor': {
			pattern: /\b[a-z_]\w*\|(?:[^\r\n\\|]|\\(?:\r\n|[\s\S]))*\|/i,
			greedy: true,
			inside: {
				'regex': {
					pattern: /(^re)\|[\s\S]+/,
					lookbehind: true
				},
				'function': /^\w+/,
				'value': /\|[\s\S]+/
			}
		},
		'identifier': {
			pattern: /`[^`]*`/,
			greedy: true
		},

		'function': /\b[a-z_]\w*(?=\s*(?:::\s*<|\())\b/,

		'keyword': /\b(?:args|as|by|case|config|connect|connector|const|copy|create|default|define|deploy|drop|each|emit|end|erase|event|flow|fn|for|from|group|having|insert|into|intrinsic|let|links|match|merge|mod|move|of|operator|patch|pipeline|recur|script|select|set|sliding|state|stream|to|tumbling|update|use|when|where|window|with)\b/,
		'boolean': /\b(?:false|null|true)\b/i,

		'number': /\b(?:0b[01_]*|0x[0-9a-fA-F_]*|\d[\d_]*(?:\.\d[\d_]*)?(?:[Ee][+-]?[\d_]+)?)\b/,

		'pattern-punctuation': {
			pattern: /%(?=[({[])/,
			alias: 'punctuation'
		},
		'operator': /[-+*\/%~!^]=?|=[=>]?|&[&=]?|\|[|=]?|<<?=?|>>?>?=?|(?:absent|and|not|or|present|xor)\b/,
		'punctuation': /::|[;\[\]()\{\},.:]/,
	};

	var interpolationPattern = /#\{(?:[^"{}]|\{[^{}]*\}|"(?:[^"\\\r\n]|\\(?:\r\n|[\s\S]))*")*\}/.source;

	Prism.languages.tremor['interpolated-string'] = {
		pattern: RegExp(
			/(^|[^\\])/.source +
			'(?:' +
			'"""(?:' + /[^"\\#]|\\[\s\S]|"(?!"")|#(?!\{)/.source + '|' + interpolationPattern + ')*"""' +
			'|' +
			'"(?:' + /[^"\\\r\n#]|\\(?:\r\n|[\s\S])|#(?!\{)/.source + '|' + interpolationPattern + ')*"' +
			')'
		),
		lookbehind: true,
		greedy: true,
		inside: {
			'interpolation': {
				pattern: RegExp(interpolationPattern),
				inside: {
					'punctuation': /^#\{|\}$/,
					'expression': {
						pattern: /[\s\S]+/,
						inside: Prism.languages.tremor
					}
				}
			},
			'string': /[\s\S]+/
		}
	};

	Prism.languages.troy = Prism.languages['tremor'];
	Prism.languages.trickle = Prism.languages['tremor'];

}(Prism));