\begin{code}
module Music.Analysis.Abstract2Lilypond where
import Music.Analysis.PF ((><), (-|-), grd, split, e2m, hyloL)
import Music.Analysis.Base (IntegerNumber)
import Music.Analysis.Abstract.Melodic (Accident)
import Music.Analysis.Abstract.Zip (VoiceZipNode)
import Data.Tuple (uncurry)
import Data.List ((++))
import Data.Function ((.), const)
import Data.Maybe (maybe)
import Data.Either (either)
import Data.Char (String)
import Data.Ord (Ord(..))
import Data.Eq (Eq(..))
import Prelude (Num(..), show)
\end{code}
\begin{code}
output :: VoiceZipNode -> String
output = uncurry (++) .
(maybe "r" (uncurry (++) . (show >< outputAccidents)) ><
uncurry (++) . (show >< outputDots))
outputDots :: IntegerNumber -> String
outputDots =
hyloL (maybe [] (uncurry (++)))
(e2m . (const () -|- split (const ".") pred) . grd (<=0))
where pred = \x -> x 1
outputAccidents :: Accident -> String
outputAccidents =
maybe "" (hyloL (maybe [] (uncurry (++)))
(e2m . (const () -|- either (split (const "is") pred)
(split (const "es") succ) . grd (>0)) .
grd (==0)))
where pred = \x -> x 1
succ = \x -> x + 1
\end{code}