module Language.Modelica.Syntax.ToString where

import System.IO (nativeNewline, Newline(LF, CRLF))

import qualified Data.List as List


newline :: String
newline = case nativeNewline of
               LF -> "\n"
               CRLF -> "\r\n"

class ToString a where
      toString :: a -> String

instance ToString a => ToString (Maybe a) where
         toString (Just e) = toString e
         toString Nothing = ""

instance (ToString a, ToString b) => ToString (Either a b) where
         toString (Left x) = toString x
         toString (Right x) = toString x

instance (ToString a, ToString b) => ToString (a, b) where
         toString (x, y) = toString x ++ " " ++ toString y


maybeSpace :: (ToString a) => Maybe a -> String
maybeSpace Nothing = ""
maybeSpace (Just x) = toString x ++ " "

spaceMaybe ::  (ToString a) => Maybe a -> String
spaceMaybe Nothing = ""
spaceMaybe (Just x) = " " ++ toString x

listSpace :: (ToString a) => [a] -> String
listSpace xs = toCommaList xs ++ " "

spaceList :: (ToString a) => [a] -> String
spaceList xs = " " ++ toCommaList xs

toSemiListSpace :: (ToString a) => [a] -> String
toSemiListSpace = (" " ++) . concatMap ((++ "; ") . toString)

toSemiList :: (ToString a) => [a] -> String
toSemiList [] = ""
toSemiList xs =
  List.intercalate "; " (map toString xs) ++ ";"

toCommaList :: (ToString a) => [a] -> String
toCommaList = List.intercalate ", " . map toString