module Csound.Typed.Gui.Cabbage.CabbageLang(
        Lang, Line(..), Property(..), Arg(..), ppCabbage
) where

import Text.PrettyPrint.Leijen

type Lang = [Line]

data Line = Line
        { lineDef :: String
        , lineProperties :: [Property]
        }

data Property = Property
        { propertyName :: String
        , propertyArgs :: [Arg]
        }

data Arg = StringArg String | FloatArg Float | IntArg Int | ColonArg Float Float

--------------------------------------------------
-- pretty print

ppCabbage :: Lang -> Doc
ppCabbage xs = vcat $ fmap ppLine xs

ppLine :: Line -> Doc
ppLine (Line name props) = text name <+> hcat (punctuate comma (fmap ppProp props))

ppProp :: Property -> Doc
ppProp (Property name args) = text name <> tupled (fmap ppArg args)

ppArg :: Arg -> Doc
ppArg x = case x of
        StringArg s -> dquotes (text s)
        FloatArg a  -> float a
        IntArg a    -> int a
        ColonArg a b -> float a <> colon <> float b