\usepackage{listings}

\lstdefinelanguage{Clean}{%
	alsoletter={ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_`1234567890},
	alsoletter={~!@\#$\%^\&*-+=?<>:|\\.},
	morekeywords={generic,implementation,definition,dynamic,module,import,from,where,in,of,case,let,infix,infixr,infixl,class,instance,with,if,derive,Void},
	sensitive=true,
	morecomment=[l]{//},
	morecomment=[n]{/*}{*/},
	morestring=[b]",
	morestring=[b]',
	emptylines=1,
	basicstyle=\small,
	identifierstyle=\small\ttfamily,
	commentstyle=\itshape,
	keywordstyle=\bfseries,
	stringstyle=\ttfamily,
	numbers=none,
	showstringspaces=false,
	basewidth=0.45em,
	columns=[c]fixed,
	keepspaces=true,
	breaklines=false,
	tabsize=4,
	texcl=true,
	escapeinside={(\#}{\#)},
	literate=%
		% Basic Clean constructs
		{\\}{{$\lambda\:$}}1
		{A.}{{$\forall\;\,$}}1
		{E.}{{$\exists\;\,$}}1
		{>}{{$>$}}1
		{<}{{$<$}}1
		{<=}{{$\leq$}}1
		{>=}{{$\geq$}}1
		{<>}{{$\neq$}}1
		{->}{{$\rightarrow$}}2
		{<-}{{$\leftarrow$}}1
		{=}{{$=$}}1
		{~}{{$\sim$}}1
		{\#}{{$\sharp$}}1
		{\{|}{{$\{\!|\!$}}1
		{|\}}{{$\!|\!\}$}}1
		{:=}{{$:=$}}2
		{==}{{$==$}}2
		{++}{{$+\!\!+$}}2
		{+++}{{$+\!\!\!\!+\!\!\!\!+$}}2
		{:==}{{$:==$}}3
		{\{|*|\}}{{$\{\!|\!\!\star\!\!|\!\}$}}3
		%
		% Basic iTask constructs
		{>||>}{{$\triangleright\triangleright$}}2
		{>>=}{{\texttt{>>=}}}3
		{>>|}{{\texttt{>>|}}}3
		{?>>}{{\texttt{?>>}}}3
		{!>>}{{\texttt{!>>}}}3
		{-||-}{{\texttt{-||-}}}4
		{.||.}{{\texttt{.||.}}}4
		{.&&.}{{\texttt{.\&\&.}}}4
}

\newcommand{\CleanInline}[1]{\lstinline[language=Clean]¦#1¦}
\newcommand{\CI}[1]{\CleanInline{#1}}

\lstdefinestyle{numbers}{numbers=left, stepnumber=1, numberstyle=\tiny, numbersep=5pt}

\lstnewenvironment{CleanCode}{\lstset{language=Clean,identifierstyle=\ttfamily}}{}
\lstnewenvironment{CleanCodeN}{\lstset{language=Clean,style=numbers}}{}
\lstnewenvironment{CleanCodeB}{\lstset{language=Clean,frame=single}}{}
\lstnewenvironment{CleanCodeNB}{\lstset{language=Clean,style=numbers,frame=single}}{}
