-- | 'UGen' pretty-printer.
module Sound.SC3.UGen.PP where

import Data.List {- split -}

import Sound.SC3.Common.Math
import Sound.SC3.UGen.MCE
import Sound.SC3.UGen.Type
import Sound.SC3.UGen.UGen

-- | Place /x/ in (/l/,/r/) brackets.
bracketed :: (a,a) -> [a] -> [a]
bracketed :: (a, a) -> [a] -> [a]
bracketed (a
l,a
r) [a]
x = a
l a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
x [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ [a
r]

-- | Print constants and labels directly, primitives as un-adorned
-- names, mce as [p,q], mrg as p&q, contols as nm=def and proxies as
-- u@n.
ugen_concise_pp :: UGen -> String
ugen_concise_pp :: UGen -> String
ugen_concise_pp UGen
u =
    let prim_pp :: Primitive -> String
prim_pp (Primitive Rate
_ String
nm [UGen]
_ [Rate]
_ Special
sp UGenId
_) = String -> Special -> String
ugen_user_name String
nm Special
sp
        k :: Int
k = Int
5
    in case UGen
u of
         Constant_U (Constant Sample
n) -> Int -> Sample -> String
real_pp Int
k Sample
n
         Control_U (Control Rate
_ Maybe Int
_ String
nm Sample
def Bool
_ Maybe (Control_Meta Sample)
_) -> String
nm String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"=" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> Sample -> String
real_pp Int
k Sample
def
         Label_U (Label String
s) -> (Char, Char) -> String -> String
forall a. (a, a) -> [a] -> [a]
bracketed (Char
'"',Char
'"') String
s
         Primitive_U Primitive
p -> Primitive -> String
prim_pp Primitive
p
         Proxy_U (Proxy Primitive
p Int
n) -> Primitive -> String
prim_pp Primitive
p String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"@" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
n
         MCE_U (MCE_Unit UGen
u') -> UGen -> String
ugen_concise_pp UGen
u'
         MCE_U (MCE_Vector [UGen]
v) -> (Char, Char) -> String -> String
forall a. (a, a) -> [a] -> [a]
bracketed (Char
'[',Char
']') (String -> [String] -> String
forall a. [a] -> [[a]] -> [a]
intercalate String
"," ((UGen -> String) -> [UGen] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map UGen -> String
ugen_concise_pp [UGen]
v))
         MRG_U (MRG UGen
l UGen
r) -> [String] -> String
unwords [UGen -> String
ugen_concise_pp UGen
l,String
"&",UGen -> String
ugen_concise_pp UGen
r]