module Sound.SC3.Server.Status (serverStatus) where

import Sound.OpenSoundControl
import Sound.SC3.Server.Command (status)

statusFields :: [String]
statusFields = ["# UGens                     ", 
                "# Synths                    ", 
                "# Groups                    ",
                "# Instruments               ",
                "% CPU (Average)             ",
                "% CPU (Peak)                ",
                "Sample Rate (Nominal)       ",
                "Sample Rate (Actual)        "]

statusInfo :: OSC -> [String]
statusInfo o = maybe [] f (address o)
    where f a = if a == "status.reply" 
                then maybe [] (map show . tail) (arguments o) 
                else []

statusFormat :: OSC -> [String]
statusFormat r = s : zipWith (++) statusFields (statusInfo r)
    where s = "***** SuperCollider Server Status *****"

-- | Collect server status information.
serverStatus :: Transport t => t -> IO [String]
serverStatus fd = do send fd status 
                     r <- wait fd "status.reply"
                     return (statusFormat r)