1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
|
module Data.GI.CodeGen.OverloadedSignals
( genObjectSignals
, genInterfaceSignals
) where
#if !MIN_VERSION_base(4,8,0)
import Control.Applicative ((<$>))
#endif
import Control.Monad (when)
#if !MIN_VERSION_base(4,11,0)
import Data.Monoid ((<>))
#endif
import qualified Data.Text as T
import Data.GI.CodeGen.API
import Data.GI.CodeGen.Code
import Data.GI.CodeGen.Inheritance (fullObjectSignalList, fullInterfaceSignalList)
import Data.GI.CodeGen.GObject (apiIsGObject)
import Data.GI.CodeGen.SymbolNaming (upperName, hyphensToCamelCase,
signalInfoName)
import Data.GI.CodeGen.Util (lcFirst)
-- | Signal instances for (GObject-derived) objects.
genObjectSignals :: Name -> Object -> CodeGen e ()
genObjectSignals n o = do
let name = upperName n
isGO <- apiIsGObject n (APIObject o)
when isGO $ do
infos <- fullObjectSignalList n o >>=
mapM (\(owner, signal) -> do
si <- signalInfoName owner signal
return $ "'(\"" <> (lcFirst . hyphensToCamelCase . sigName) signal
<> "\", " <> si <> ")")
group $ do
let signalListType = name <> "SignalList"
line $ "type instance O.SignalList " <> name <> " = " <> signalListType
line $ "type " <> signalListType <> " = ('[ "
<> T.intercalate ", " infos <> "] :: [(Symbol, DK.Type)])"
-- | Signal instances for interfaces.
genInterfaceSignals :: Name -> Interface -> CodeGen e ()
genInterfaceSignals n iface = do
let name = upperName n
infos <- fullInterfaceSignalList n iface >>=
mapM (\(owner, signal) -> do
si <- signalInfoName owner signal
return $ "'(\"" <> (lcFirst . hyphensToCamelCase . sigName) signal
<> "\", " <> si <> ")")
group $ do
let signalListType = name <> "SignalList"
line $ "type instance O.SignalList " <> name <> " = " <> signalListType
line $ "type " <> signalListType <> " = ('[ "
<> T.intercalate ", " infos <> "] :: [(Symbol, DK.Type)])"
|