hsc3-db-0.12: Sound/SC3/UGen/DB/Rename.hs
-- | Renaming functions for UGen descriptions.
module Sound.SC3.UGen.DB.Rename where
import Data.Char
import Data.List
import Sound.SC3.UGen.Name {- hsc3 -}
import Sound.SC3.UGen.DB.Record
-- | Rename parameters that conflict with /Haskell/ keywords or
-- 'Prelude' functions, or which have otherwise unwieldy names.
--
-- > map rename_input ["in","id"] == ["input","id_"]
rename_input :: String -> String
rename_input p =
case p of
-- keyword
"default" -> "default_"
"in" -> "input"
"type" -> "type_"
-- prelude
"div" -> "div_"
"drop" -> "drop_"
"exp" -> "exp_"
"floor" -> "floor_"
"id" -> "id_"
"init" -> "init_"
"length" -> "length_"
"min" -> "min_"
"max" -> "max_"
-- internal (hsc3) use
"rate" -> "rate_"
"label" -> "label_"
-- unwieldy
"channelsArray" -> "input"
_ -> p
-- | Rename unit generators that conflict with /Haskell/ keywords or
-- 'Prelude' functions.
--
-- > map rename_ugen ["In","Out"] == ["in'","out"]
rename_ugen :: String -> String
rename_ugen nm =
let nm' = fromSC3Name nm
in case nm' of
"in" -> "in'"
_ -> nm'
-- | Case insensitive string '=='.
ci_eq :: String -> String -> Bool
ci_eq p q = let f = map toLower in f p == f q
-- | If the input name is the same as the ugen name, rename the input.
rename_eq_input :: U -> I -> String
rename_eq_input u =
let f x = if x `ci_eq` ugen_name u then x ++ "_" else x
in rename_input . f . input_name
i_rename :: I -> I
i_rename i = i {input_name = rename_input (input_name i)}
u_rename :: U -> U
u_rename u =
let n' = rename_ugen (ugen_name u)
i' = map i_rename (ugen_inputs u)
in u {ugen_name = n',ugen_inputs = i'}
i_rename_db :: [String] -> I -> I
i_rename_db uu_nm i =
let n = input_name i
n' = case find (ci_eq n) uu_nm of
Just _ -> n ++ "_"
Nothing -> n
in i {input_name = rename_input n'}
-- | Variant that renames inputs to avoid name coliisions with UGens.
u_rename_db :: [U] -> U -> U
u_rename_db uu u =
let uu_nm = map ugen_name uu
n' = rename_ugen (ugen_name u)
i' = map (i_rename_db uu_nm) (ugen_inputs u)
in u {ugen_name = n',ugen_inputs = i'}