\definecolor{KentBlue}{rgb}{0.0,0.2196,0.5098}    % 0, 56, 130
\definecolor{KentRed}{rgb}{0.7058,0.0117,0.3607}  % 180, 3, 92
\definecolor{KentGreen}{rgb}{0.0,0.4785,0.3686}   % 0, 122, 94

\usepackage{pifont}
\usepackage{xspace}

\usepackage{listings}


%Note: return isn't a Haskell keyword, but it's used enough and important
% enough that I think it's worth highlighting as if it were one.

%Note: the shorter keyword symbols (like =) must go before any longer
% versions (like =>) in otherkeywords

%Also, "otherkeywords" seem to be highlighted even in strings.  This
% is partly why I haven't defined _ as a keyword.

%String highlighting is difficult, especially since foo' is an identifier
% in Haskell, not the start of a char literal!  Therefore I suggest
% never applying any special formatting to strings.  I've also removed
% the single quote as a string delimiter for this reason.
\lstdefinelanguage[improved]{Haskell}
   % To separate out word keywords from symbol keywords for different formatting,
   % we define the word keywords as emph items (use emphstyle):
  {classoffset=0,
   %If we don't specify at least one "non-other" keyword, listings doesn't work, hence:
   morekeywords={hduisahfiuabfyasbyoasvbfuyvosf},
   otherkeywords={::,=,==,->,=>,>>,>>=,>>*,$,++,<-,<|>},
   classoffset=1,
   morekeywords={data,type,newtype,let,in,do,where,if,then,else,return},
   % For some (unknown) reason, setting classoffset = 0 again after this line
   % breaks the highlighting.
   morecomment=[l]{--},
%   morestring=[b]',
   morestring=[b]",
  }
%TODO The -> operator looks particularly bad (the dash is very thin).
% I have seen Haskell papers that use the maths -> symbol instead -- listings
% package does allow us to escape to maths mode, so perhaps we should try that...

\lstdefinelanguage[21]{occam}
  {morekeywords={BYTE,CHAN,FOR,FROM,IF,INT,INT32,IS,PAR,PROC,RESHAPES,RETYPES,SEQ,SIZE,TRUE,VAL,WHILE},
   otherkeywords={:,:=},
   morecomment=[l]{--}
  }

\lstdefinelanguage{Rain}
  {morekeywords={if,while,process,function},
   otherkeywords={!,?,??,=,==,+,-,*,+=,-=,*=},
   morecomment=[l]{//}
  }

\def\haskellsettings{
\lstset{
	language={[improved]Haskell},
	columns=flexible,
	basicstyle=\small,	
	emphstyle=\color{KentRed}\bfseries,
        keywordstyle=[1]{\color{KentBlue}\bfseries},
        keywordstyle=[0]{\color{KentBlue}\bfseries\ttfamily},
	identifierstyle=,
	commentstyle=\color{KentGreen}\itshape,
	stringstyle=,
	showstringspaces=false}
}

\def\rainsettings{
\lstset{
	language={Rain},
	columns=fixed,
	basicstyle=\small\ttfamily,
	emphstyle=\color{KentBlue}\bfseries,
	keywordstyle=\color{KentBlue}\bfseries,
	identifierstyle=,
	commentstyle=\color{KentGreen}\itshape,
	stringstyle=,
	showstringspaces=false}
}

\def\occamsettings{
\lstset{
	language={[21]occam},
	columns=fixed,
	basicstyle=\small\ttfamily,
	emphstyle=\color{KentBlue}\bfseries,
	keywordstyle=\color{KentBlue}\bfseries,
	identifierstyle=,
	commentstyle=\color{KentGreen}\itshape,
	stringstyle=,
	showstringspaces=false}
}
