\begin{code}
-- | 
-- Maintainer : silva.samuel@alumni.uminho.pt
-- Stability  : experimental
-- Portability: portable
-- Implements interface to Lilypond
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 Functions
-- |
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}