{-# LANGUAGE
ScopedTypeVariables,
FlexibleInstances
#-}
module Graphics.QML.Objects.ParamNames (
ParamNames,
paramNames,
noNames,
fstName,
plusName,
anonParams,
AnonParams ()
) where
newtype ParamNames a = ParamNames ([String] -> [String])
instance Show (ParamNames a) where
show (ParamNames nsFunc) =
let showHead [] = showString "noNames"
showHead (n:ns) = showString "fstName " . shows n . showTail ns
showTail [] = id
showTail (n:ns) = showString " `plusName` " . shows n . showTail ns
in showHead (nsFunc []) ""
paramNames :: ParamNames a -> [String]
paramNames (ParamNames names) = names []
plusName :: ParamNames a -> String -> ParamNames (String -> a)
plusName (ParamNames ns) n = ParamNames $ ns . (n:)
noNames :: ParamNames ()
noNames = ParamNames id
fstName :: String -> ParamNames (String -> ())
fstName = (noNames `plusName`)
class AnonParams a where
anonParams_ :: ParamNames a
instance (AnonParams b) => AnonParams (String -> b) where
anonParams_ = plusName (anonParams_ :: ParamNames b) ""
instance AnonParams () where
anonParams_ = noNames
anonParams :: (AnonParams a) => ParamNames a
anonParams = anonParams_