{-# OPTIONS -fglasgow-exts -XOverlappingInstances -XUndecidableInstances#-}
{-# LANGUAGE AllowAmbiguousTypes #-}
-----------------------------------------------------------------------------
{-| Module    : Attributes.hs
    Copyright : (c) David Harley 2010
    Project   : qtHaskell
    Version   : 1.1.4
    Modified  : 2010-09-02 17:02:32
    
    Warning   : this file is machine generated - do not modify.
--}
-----------------------------------------------------------------------------

module Qtc.Core.Attributes (
  Qst(..), Qstt(..), Qsignal(..), Qsig(..), Qsignalf(..)
  ,QSlot, QSlotP, slot, slotP, Qslot(..)
  ,signalString, slotString, sigString, signalStringf, signalObjectf
  ,Prop(..)
  ,Attr, WriteAttr, SigCon, SigConf, SltCon, SltConf
  ,makeAttr, newAttr, writeAttr, sigCon, sigConf, sltCon, sltConf
  ,get, set, swap
  ,signal
  ,QsigClicked(..)
  ,st_sltConf_nt_p, st_sltConf_nt
  ,on_sltConf_nt_p, on_sltConf_nt
  ,sltConf_nt_p, sltConf_nt
  ,fmYes, fmCancel, emCancel, emOk, edOk
  ,sortFilterProxyModel' 
  ,vBoxLayout' 
  ,hBoxLayout' 
  ,standardItem_nf' 
  ,settings' 
  ,QsaSignalValueChanged_nt_f(..)
  ,QsaSignalTriggered_nt_f(..)
  ,QsaSignalToggled_nt_f(..)
  ,QsaSignalExpanded_nt_f(..)
  ,QsaSignalCollapsed_nt_f(..)
  ,QsaSignalActivated_nt_f(..)
  ,QsaSignalDoubleClicked_nt_f(..)
  ,QsaSignalCurrentChanged_nt_f(..)
  ,QsaSignalCustomContextMenuRequested_nt_f(..)
  ,QsaSignalCurrentIndexChanged_nt_f(..)
  ,QsaSignalItemChanged_nt_f(..)
  ,QsaSignalRowsRemoved_nt_f(..)
  ,QsaSignalTextChanged_nt_f(..)
  ,QsaSignalClicked_nt_f(..)
  ,QsaSlotReject(..)
  ,QsaSignalRejected_nt_f(..)
  ,QsaSignalAccepted_nt_f(..)
  ,QsaOnSignalClicked_nt_f(..)
  ,QsaOnSignalRejected_nt_f(..)
  ,QsaConnectSlot_nt_f(..)
  ,($>)
  ,QsaConnectSignal(..)
  ,QsaConnectSlot(..)
  ,QsaConnectSlot_nt(..)
  ,QaParent(..)
  ,QaText(..)
  ,QaIcon(..)
  ,QaAutoRaise(..)
  ,QaToolButtonStyle(..)
  ,QaFilterKeyColumn(..)
  ,QaDynamicSortFilter(..)
  ,QaSourceModel(..)
  ,QafilterRole(..)
  ,QafilterRegExp(..)
  ,QaVisible(..)
  ,QaModel(..)
  ,QaDragEnabled(..)
  ,QaAcceptDrops(..)
  ,QaAutoExpandDelay(..)
  ,QaShowDropIndicator(..)
  ,QaContextMenuPolicy(..)
  ,QaMargin(..)
  ,QaEditable(..)
  ,QaCheckable(..)
  ,QaSelectable(..)
  ,QwaOnEventFilter(..)
  ,QwaOnFocusInEvent(..)
  ,QaValue(..)
  ,QaWindowModality(..)
  ,QwaDataUserRole(..)
  ,QwaShow(..)
  ,QwaAddWidget(..)
  ,QwaAddLayout(..)
  ,QwaAddItem(..)
  ,QwaAddItems(..)
  ,QwaBlockSignals(..)
  ,QwaClear(..)
  ,QaCurrentIndex(..)
  ,getSettingsValue
  ,_isValid
  ,userRole
  ,displayRole
  ,QdataRole(..)
  ,QdataUserRole(..)
  ,QdataDisplayRole(..)
  ,QsetDataUserRole(..)
  ,(~~), (~>=)
  ,Qfp(..)
  ,Qfpn(..)
  ,Qnfpn(..)
  ,Qems(..)
  ,Qbps(..)
  ,Qbp(..)
  ,Qbpe(..)
  ,Qbpd(..)
  ,Qbpde(..)
  ,(>:), (>>:), Qslf(..), (-:)
  ,switch, switch_
  ) where

import Foreign.C.Types
import Qtc.ClassTypes.Core
import Qtc.Core.Base
import Qtc.Classes.Base
import Qtc.Classes.Qccs
import Qtc.Classes.Qccs_h
import Qtc.Classes.Core
import Qtc.Enums.Base
import Qtc.Enums.Classes.Core
import Qtc.Enums.Core.Qt
import Qtc.Core.QVariant
import Qtc.Core.QRegExp
import Qtc.Enums.Core.QRegExp
import Qtc.Core.QFile
import Qtc.Enums.Core.QIODevice
import Qtc.Classes.Gui
import Qtc.ClassTypes.Gui
import Qtc.Gui.QApplication
import Qtc.Gui.QStyle
import Qtc.Enums.Gui.QStyle
import Qtc.Gui.QVBoxLayout
import Qtc.Gui.QHBoxLayout
import Qtc.Gui.QBoxLayout
import Qtc.Gui.QIcon
import Qtc.Gui.QSpacerItem
import Qtc.Enums.Gui.QSizePolicy
import Qtc.Gui.QLayout
import Qtc.Gui.QLabel
import Qtc.Gui.QAbstractButton
import Qtc.Gui.QPushButton
import Qtc.Gui.QDialog
import Qtc.Gui.QDialog_h
import Qtc.Gui.QDialogButtonBox
import Qtc.Enums.Gui.QDialogButtonBox
import Qtc.Gui.QWidget
import Qtc.Gui.QWidget_h
import Qtc.Gui.QAbstractScrollArea
import Qtc.Gui.QAbstractItemView
import Qtc.Gui.QTreeView
import Qtc.Gui.QHeaderView
import Qtc.Gui.QLineEdit
import Qtc.Gui.QToolButton
import Qtc.Gui.QStandardItem
import Qtc.Gui.QStandardItemModel
import Qtc.Gui.QItemSelectionModel
import Qtc.Enums.Gui.QItemSelectionModel
import Qtc.Gui.QItemSelection
import Qtc.Core.QModelIndex
import Qtc.Gui.QSortFilterProxyModel
import Qtc.Gui.QComboBox
import Qtc.Gui.QMenu
import Qtc.Gui.QMessageBox
import Qtc.Enums.Gui.QMessageBox
import Qtc.Gui.QAction
import Qtc.Core.QAbstractItemModel
import Qtc.Gui.QAbstractProxyModel
import Qtc.Gui.QProgressDialog
import Qtc.Core.QPoint
import Qtc.ClassTypes.Tools
import Qtc.Tools.QUiLoader
import Qtc.Core.QSettings
import Qth.Core.Size
import Qth.Core.Point

import Data.IORef

class Qst a where
  qstobj :: a -> QObject ()

class Qstt a b where
  qsttobj :: a -> b

data Qsignal x f = Qsignal String

signalString :: Qsignal x f -> String
signalString (Qsignal s) = s

data Qsig f = Qsig String

data Qsignalf f = Qsignalf (Qsig f) (QObject ())

sigString :: Qsig f -> String
sigString (Qsig s) = s

signalStringf :: Qsignalf f -> String
signalStringf (Qsignalf (Qsig s) _) = s

signalObjectf :: Qsignalf f -> QObject ()
signalObjectf (Qsignalf _ x) = x

type QSlot a = Qslot a (a -> IO ())
type QSlotP a p = Qslot a (a -> p -> IO ())

slot :: String -> QSlot a
slot s = Qslot s

slotP :: String -> QSlotP a p
slotP s = Qslot s

data Qslot x f = Qslot String

slotString :: Qslot x f -> String
slotString (Qslot s) = s

infixr 0 :=,:~,::=,::~,:-,:<,:<-,::-,:=<,:-<,:->,:=>

data Prop w     = forall a. Attr w a := a
                | forall a. Attr w a :~ (a -> a)
                | forall a. Attr w a ::= (w -> a)
                | forall a. Attr w a ::~ (w -> a -> a)
                | forall a. WriteAttr w a :- a
                | forall a. WriteAttr w a ::- (w -> a)
                | forall a. Attr w a :< IO a
                | forall a. WriteAttr w a :<- IO a
                | SigConf w w :=< Qsignalf w
                | forall a. SigConf w a :-< Qsignalf a
                | forall a. SltCon w a () :~> String
                | forall a. SltConf w a :=> (Qslot w a, a)
                | forall a. SltConf w a :-> (Qslot w a, a)

data Attr w a = Attr (w -> IO a) (w -> a -> IO ()) (w -> (a -> a) -> IO a) 

data WriteAttr w a   = WriteAttr (w -> a -> IO ()) 

data SigCon w a = SigCon (w -> a -> String -> IO ()) 

data SigConf w a = SigConf (w -> Qsignalf a -> Bool -> IO ()) 

data SltCon w a b = SltCon (w -> String -> b -> IO ()) 

data SltConf w a = SltConf (w -> Qslot w a -> a -> Bool -> IO ()) 

makeAttr :: (w -> IO a) -> (w -> a -> IO ()) -> (w -> (a -> a) -> IO a) -> Attr w a
makeAttr getter setter updater
  = Attr getter setter updater 

newAttr :: (w -> IO a) -> (w -> a -> IO ()) -> Attr w a
newAttr getter setter
  = makeAttr getter setter updater 
  where
    updater w f = do x <- getter w; setter w (f x); return x

writeAttr :: (w -> a -> IO ()) -> WriteAttr w a
writeAttr setter
  = WriteAttr setter 

sigCon :: (w -> a -> String -> IO ()) -> SigCon w a
sigCon consig
  = SigCon consig 

sigConf :: (w -> Qsignalf a -> Bool -> IO ()) -> SigConf w a
sigConf consigf
  = SigConf consigf 

sltCon :: (w -> String -> b -> IO ()) -> SltCon w a b
sltCon conslt
  = SltCon conslt 

sltConf :: (w -> Qslot w a -> a -> Bool -> IO ()) -> SltConf w a
sltConf consltf
  = SltConf consltf 

get :: w -> Attr w a -> IO a
get w (Attr getter setter updater)
  = getter w

set :: w -> [Prop w] -> IO ()
set w props
  = mapM_ setprop props
  where
    setprop ((Attr getter setter updater) := x)
      = setter w x
    setprop ((Attr getter setter updater) :~ f)
      = do updater w f; return ()
    setprop ((Attr getter setter updater) ::= f)
      = setter w (f w)
    setprop ((Attr getter setter updater) ::~ f)
      = do updater w (f w); return ()
    setprop ((WriteAttr setter) :- x)
      = setter w x
    setprop ((WriteAttr setter) ::- f)
      = setter w (f w)
    setprop ((Attr getter setter updater) :< x)
      = do setter w =<< x
    setprop ((WriteAttr setter) :<- x)
      = do setter w =<< x
    setprop ((SigConf sigconf) :=< sltslt)
      = sigconf w sltslt True
    setprop ((SigConf sigconf) :-< sltslt)
      = sigconf w sltslt False
    setprop ((SltConf sltconf) :=> (sltslt, sltSlt))
      = sltconf w sltslt sltSlt True
    setprop ((SltCon sltcon) :~> sltStr)
      = sltcon w sltStr ()
    setprop ((SltConf sltconf) :-> (sltslt, sltSlt))
      = sltconf w sltslt sltSlt False

swap :: w -> Attr w a -> a -> IO a
swap w (Attr getter setter updater) x
  = updater w (const x)

signal :: Qsig a -> Qsignalf a
signal s = Qsignalf s $ objectNull

class QsigClicked p | -> p where
  sigClicked :: Qsig p
  clicked :: Qsignalf p

instance QsigClicked (QModelIndex () -> IO ()) where
  sigClicked = Qsig "clicked(QModelIndex)" :: Qsig (QModelIndex () -> IO ())
  clicked = signal sigClicked

st_sltConf_nt_p :: (Qst a, Qst d, Qcsn (b -> IO c)) => a -> Qsig (b -> IO c) -> SltConf d (d -> b -> IO c)
st_sltConf_nt_p sigObj sig = sltConf sltcon
    where
      sltcon w sltslt f _ = connectSlot_nt (qstobj sigObj) (sigString sig) (qstobj w) (slotString sltslt) (f w)

st_sltConf_nt :: (Qst a, Qst b) => a -> Qsig (IO ()) -> SltConf b (b -> IO ())
st_sltConf_nt sigObj sig = sltConf sltcon
    where
      sltcon w sltslt f _ = connectSlot_nt (qstobj sigObj) (sigString sig) (qstobj w) (slotString sltslt) (f w)

sltConf_nt_p :: (Qcsn (b -> IO c)) => QObject a -> Qsig (b -> IO c) -> SltConf (QObject d) (QObject d -> b -> IO c)
sltConf_nt_p sigObj sig = sltConf sltcon
    where
      sltcon w sltslt f _ = connectSlot_nt sigObj (sigString sig) w (slotString sltslt) (f w)

on_sltConf_nt :: Qsig (IO ()) -> SltConf (QObject b) (QObject b -> IO ())
on_sltConf_nt sig = sltConf sltcon
    where
      sltcon w sltslt f _ = connectSlot_nt w (sigString sig) w (slotString sltslt) (f w)

on_sltConf_nt_p :: (Qcsn (b -> IO c)) => Qsig (b -> IO c) -> SltConf (QObject d) (QObject d -> b -> IO c)
on_sltConf_nt_p sig = sltConf sltcon
    where
      sltcon w sltslt f _ = connectSlot_nt w (sigString sig) w (slotString sltslt) (f w)

sltConf_nt :: QObject a -> Qsig (IO ()) -> SltConf (QObject b) (QObject b -> IO ())
sltConf_nt sigObj sig = sltConf sltcon
    where
      sltcon w sltslt f _ = connectSlot_nt sigObj (sigString sig) w (slotString sltslt) (f w)

fmYes = fYes :: QMessageBoxStandardButtons

fmCancel = fCancel :: QMessageBoxStandardButtons

emCancel = eCancel :: QMessageBoxStandardButton

emOk = eOk :: QMessageBoxStandardButton

edOk = eOk :: QDialogButtonBoxStandardButton

sortFilterProxyModel' p al 
  = qSortFilterProxyModel p >>= \pm -> set pm al >> return pm

vBoxLayout' w al 
  = qVBoxLayout w >>= \vb -> set vb al >> return vb

hBoxLayout' al 
  = qHBoxLayout () >>= \hb -> set hb al >> return hb

standardItem_nf' t al 
  = qStandardItem_nf t >>= \si -> set si al >> return si

settings' t al 
  = qSettings t >>= \si -> set si al >> return si

infixr 1 $>

($>) x y = (x, y)

class QsaConnectSignal w x where
  signal' :: String -> SigCon w x

instance QsaConnectSignal (QObject a) (QObject b) where
  signal' sigStr = sigCon sigcon
    where
      sigcon w x sltstr = connectSignal w sigStr x sltstr

class QsaConnectSlot w x f where
  slotp' :: x -> String -> SltCon w x f

instance QsaConnectSlot (QObject a) (QObject b) (()) where
  slotp' sigObj sigStr = sltCon sltcon
    where
      sltcon w sltstr f = connectSlot sigObj sigStr w sltstr f

instance QsaConnectSlot (QObject a) (QObject b) (QObject a -> IO ()) where
  slotp' sigObj sigStr = sltCon sltcon
    where
      sltcon w sltstr f = connectSlot sigObj sigStr w sltstr f

instance QsaConnectSlot (QObject a) (QObject b) (QObject a -> String -> IO ()) where
  slotp' sigObj sigStr = sltCon sltcon
    where
      sltcon w sltstr f = connectSlot sigObj sigStr w sltstr f

instance QsaConnectSlot (QObject a) (QObject b) (QObject a -> Object c -> IO ()) where
  slotp' sigObj sigStr = sltCon sltcon
    where
      sltcon w sltstr f = connectSlot sigObj sigStr w sltstr f

class QsaSignalExpanded_nt_f w x f where
  signalExpanded', expanded' :: x -> SltConf w f

instance (Qst a) => QsaSignalExpanded_nt_f a (QTreeViewSc b) (a -> QModelIndex () -> IO ()) where
  signalExpanded' sigObj = sltConf sltcon
    where
      sltcon w sltslt f _ = connectSlot_nt sigObj "expanded(QModelIndex)" (qstobj w) (slotString sltslt) (f w)
  expanded' = signalExpanded'

class QsaSignalCollapsed_nt_f w x f where
  signalCollapsed', collapsed' :: x -> SltConf w f

instance (Qst a) => QsaSignalCollapsed_nt_f a (QTreeViewSc b) (a -> QModelIndex () -> IO ()) where
  signalCollapsed' sigObj = sltConf sltcon
    where
      sltcon w sltslt f _ = connectSlot_nt sigObj "collapsed(QModelIndex)" (qstobj w) (slotString sltslt) (f w)
  collapsed' = signalCollapsed'

class QsaSignalActivated_nt_f w x f where
  signalActivated', activated' :: x -> SltConf w f

instance (Qst a) => QsaSignalActivated_nt_f a (QTreeViewSc b) (a -> QModelIndex () -> IO ()) where
  signalActivated' sigObj = sltConf sltcon
    where
      sltcon w sltslt f _ = connectSlot_nt sigObj "activated(QModelIndex)" (qstobj w) (slotString sltslt) (f w)
  activated' = signalActivated'

class QsaSignalDoubleClicked_nt_f w x f where
  signalDoubleClicked', doubleClicked' :: x -> SltConf w f

instance (Qst a) => QsaSignalDoubleClicked_nt_f a (QTreeViewSc b) (a -> QModelIndex () -> IO ()) where
  signalDoubleClicked' sigObj = sltConf sltcon
    where
      sltcon w sltslt f _ = connectSlot_nt sigObj "doubleClicked(QModelIndex)" (qstobj w) (slotString sltslt) (f w)
  doubleClicked' = signalDoubleClicked'

class QsaSignalValueChanged_nt_f w x f where
  signalValueChanged', valueChanged' :: x -> SltConf w f

instance (Qst a) => QsaSignalValueChanged_nt_f a (QAbstractSlider b) (a -> Int -> IO ()) where
  signalValueChanged' sigObj = sltConf sltcon
    where
      sltcon w sltslt f _ = connectSlot_nt sigObj "valueChanged(int)" (qstobj w) (slotString sltslt) (f w)
  valueChanged' = signalValueChanged'

class QsaSignalToggled_nt_f w x f where
  signalToggled', toggled' :: x -> SltConf w f

instance (Qst a) => QsaSignalToggled_nt_f a (QAction b) (a -> Bool -> IO ()) where
  signalToggled' sigObj = sltConf sltcon
    where
      sltcon w sltslt f _ = connectSlot_nt sigObj "toggled(bool)" (qstobj w) (slotString sltslt) (f w)
  toggled' = signalToggled'

class QsaSignalTriggered_nt_f w x f where
  signalTriggered', triggered' :: x -> SltConf w f

instance (Qst a) => QsaSignalTriggered_nt_f a (QAction b) (a -> IO ()) where
  signalTriggered' sigObj = sltConf sltcon
    where
      sltcon w sltslt f _ = connectSlot_nt sigObj "triggered()" (qstobj w) (slotString sltslt) (f w)
  triggered' = signalTriggered'

instance (Qst a) => QsaSignalTriggered_nt_f a (QMenu b) (a -> QAction () -> IO ()) where
  signalTriggered' sigObj = sltConf sltcon
    where
      sltcon w sltslt f _ = connectSlot_nt sigObj "triggered(QAction*)" (qstobj w) (slotString sltslt) (f w)
  triggered' = signalTriggered'

class QsaSignalCurrentChanged_nt_f w x f where
  signalCurrentChanged', currentChanged' :: x -> SltConf w f

instance (Qst a) => QsaSignalCurrentChanged_nt_f a (QItemSelectionModel b) (a -> QModelIndex () -> IO ()) where
  signalCurrentChanged' sigObj = sltConf sltcon
    where
      sltcon w sltslt f _ = connectSlot_nt sigObj "currentChanged(QModelIndex,QModelIndex)" (qstobj w) (slotString sltslt) (f w)
  currentChanged' = signalCurrentChanged'

class QsaSignalCustomContextMenuRequested_nt_f w x f where
  signalCustomContextMenuRequested', customContextMenuRequested' :: x -> SltConf w f

instance (Qst a) => QsaSignalCustomContextMenuRequested_nt_f a (QWidget b) (a -> QPoint () -> IO ()) where
  signalCustomContextMenuRequested' sigObj = sltConf sltcon
    where
      sltcon w sltslt f _ = connectSlot_nt sigObj "customContextMenuRequested(QPoint)" (qstobj w) (slotString sltslt) (f w)
  customContextMenuRequested' = signalCustomContextMenuRequested'

class QsaSignalCurrentIndexChanged_nt_f w x f where
  signalCurrentIndexChanged', currentIndexChanged' :: x -> SltConf w f

instance (Qst a) => QsaSignalCurrentIndexChanged_nt_f a (QComboBox b) (a -> String -> IO ()) where
  signalCurrentIndexChanged' sigObj = sltConf sltcon
    where
      sltcon w sltslt f _ = connectSlot_nt sigObj "currentIndexChanged(QString)" (qstobj w) (slotString sltslt) (f w)
  currentIndexChanged' = signalCurrentIndexChanged'

class QsaSignalItemChanged_nt_f r w x f where
  signalItemChanged', itemChanged' :: x -> r w f

instance (Qst a) => QsaSignalItemChanged_nt_f SltConf a (QStandardItemModel b) (a -> QStandardItem () -> IO ()) where
  signalItemChanged' sigObj = sltConf sltcon
    where
      sltcon w sltslt f _ = connectSlot_nt sigObj "itemChanged(QStandardItem*)" (qstobj w) (slotString sltslt) (f w)
  itemChanged' = signalItemChanged'

instance (Qst a) => QsaSignalItemChanged_nt_f SigConf a (QStandardItemModel b) (IO ()) where
  signalItemChanged' sigObj = sigConf sigcon
    where
      sigcon w sltslt _ = connectSignal sigObj "itemChanged(QStandardItem*)" (qstobj w) (signalStringf sltslt)
  itemChanged' = signalItemChanged'

class QsaSignalRowsRemoved_nt_f r w x f where
  signalRowsRemoved', rowsRemoved' :: x -> r w f

instance (Qst a) => QsaSignalRowsRemoved_nt_f SigConf a (QStandardItemModel b) (IO ()) where
  signalRowsRemoved' sigObj = sigConf sigcon
    where
      sigcon w sltslt _ = connectSignal sigObj "rowsRemoved(QModelIndex,int,int)" (qstobj w) (signalStringf sltslt)
  rowsRemoved' = signalRowsRemoved'

class QsaSignalTextChanged_nt_f w x f where
  signalTextChanged', textChanged' :: x -> SltConf w f

instance (Qst a) => QsaSignalTextChanged_nt_f a (QLineEdit b) (a -> String -> IO ()) where
  signalTextChanged' sigObj = sltConf sltcon
    where
      sltcon w sltslt f _ = connectSlot_nt sigObj "textChanged(QString)" (qstobj w) (slotString sltslt) (f w)
  textChanged' = signalTextChanged'

instance (Qst a) => QsaSignalTextChanged_nt_f a (QLineEdit b) (a -> IO ()) where
  signalTextChanged' sigObj = sltConf sltcon
    where
      sltcon w sltslt f _ = connectSlot_nt sigObj "textChanged(QString)" (qstobj w) (slotString sltslt) (f w)
  textChanged' = signalTextChanged'

class QsaSignalClicked_nt_f w x f where
  signalClicked', clicked' :: x -> SltConf w f

instance (Qst a) => QsaSignalClicked_nt_f a (QAbstractButton b) (a -> IO ()) where
  signalClicked' sigObj = sltConf sltcon
    where
      sltcon w sltslt f _ = connectSlot_nt sigObj "clicked()" (qstobj w) (slotString sltslt) (f w)
  clicked' = signalClicked'

instance (Qst a) => QsaSignalClicked_nt_f a (QTreeViewSc b) (a -> QModelIndex () -> IO ()) where
  signalClicked' sigObj = sltConf sltcon
    where
      sltcon w sltslt f _ = connectSlot_nt sigObj "clicked(QModelIndex)" (qstobj w) (slotString sltslt) (f w)
  clicked' = signalClicked'

instance (Qst a) => QsaSignalClicked_nt_f a (QTreeView ()) (a -> QModelIndex () -> IO ()) where
  signalClicked' sigObj = sltConf sltcon
    where
      sltcon w sltslt f _ = connectSlot_nt sigObj "clicked(QModelIndex)" (qstobj w) (slotString sltslt) (f w)
  clicked' = signalClicked'

class QsaSignalAccepted_nt_f w x f where
  signalAccepted', accepted' :: x -> SltConf w f

instance (Qst a) => QsaSignalAccepted_nt_f a (QDialogButtonBox b) (a -> IO ()) where
  signalAccepted' sigObj = sltConf sltcon
    where
      sltcon w sltslt f _ = connectSlot_nt sigObj "accepted()" (qstobj w) (slotString sltslt) (f w)
  accepted' = signalAccepted'

class QsaSlotReject w where
  slotReject', reject' ::  (Qslot w (w -> ()), (w -> ()))

instance (Qstt a (QDialogSc b)) => QsaSlotReject (a) where
  slotReject' = (Qslot "reject()", \_ -> ())
  reject' = (Qslot "reject()", \_ -> ())

class QsaSignalRejected_nt_f w x f where
  signalRejected', rejected' :: x -> SltConf w f

instance (Qst a) => QsaSignalRejected_nt_f a (QDialogButtonBox b) (a -> ()) where
  signalRejected' sigObj = sltConf sltcon
    where
      sltcon w sltslt f _ = connectSlot sigObj "rejected()" (qstobj w) (slotString sltslt) (f w)
  rejected' = signalRejected'

class QsaOnSignalClicked_nt_f w where
  onSignalClicked', onClicked' :: SigConf w (IO ())

instance QsaOnSignalClicked_nt_f (QToolButtonSc a) where
  onSignalClicked' = sigConf sigcon
    where
      sigcon w sltslt False = connectSignal w "clicked()" (signalObjectf sltslt) (signalStringf sltslt)
      sigcon w sltslt True = connectSignal w "clicked()" w (signalStringf sltslt)
  onClicked' = onSignalClicked'

class QsaOnSignalRejected_nt_f w where
  onSignalRejected' :: SigConf w (IO ())

instance (Qst a, Qstt a (QDialogSc b)) => QsaOnSignalRejected_nt_f a where
  onSignalRejected' = sigConf sigcon
    where
      sigcon w sltslt False = connectSignal (qstobj w) "rejected()" (signalObjectf sltslt) (signalStringf sltslt)
      sigcon w sltslt True = connectSignal (qstobj w) "rejected()" (qstobj w) (signalStringf sltslt)

instance (Qst a) => QsaConnectSlot_nt_f a (QItemSelectionModel b) (a -> QModelIndex () -> IO ()) where
  slot' sigObj sigsig = sltConf sltcon
    where
      sltcon w sltslt f _ = connectSlot_nt sigObj (signalString sigsig) (qstobj w) (slotString sltslt) (f w)

instance (Qst a) => QsaConnectSlot_nt_f a (QComboBox b) (a -> String -> IO ()) where
  slot' sigObj sigsig = sltConf sltcon
    where
      sltcon w sltslt f _ = connectSlot_nt sigObj (signalString sigsig) (qstobj w) (slotString sltslt) (f w)

instance (Qst a) => QsaConnectSlot_nt_f a (QStandardItemModel b) (a -> QStandardItem () -> IO ()) where
  slot' sigObj sigsig = sltConf sltcon
    where
      sltcon w sltslt f _ = connectSlot_nt sigObj (signalString sigsig) (qstobj w) (slotString sltslt) (f w)

instance (Qst a) => QsaConnectSlot_nt_f a (QLineEdit b) (a -> String -> IO ()) where
  slot' sigObj sigsig = sltConf sltcon
    where
      sltcon w sltslt f _ = connectSlot_nt sigObj (signalString sigsig) (qstobj w) (slotString sltslt) (f w)

instance (Qst a) => QsaConnectSlot_nt_f a (QDialogButtonBox b) (a -> IO ()) where
  slot' sigObj sigsig = sltConf sltcon
    where
      sltcon w sltslt f _ = connectSlot_nt sigObj (signalString sigsig) (qstobj w) (slotString sltslt) (f w)

instance (Qst a) => QsaConnectSlot_nt_f a (QDialogButtonBox b) (a -> ()) where
  slot' sigObj sigsig = sltConf sltcon
    where
      sltcon w sltslt f _ = connectSlot sigObj (signalString sigsig) (qstobj w) (slotString sltslt) (f w)

instance (Qst a) => QsaConnectSlot_nt_f a (QTreeViewSc b) (a -> QModelIndex () -> IO ()) where
  slot' sigObj sigsig = sltConf sltcon
    where
      sltcon w sltslt f _ = connectSlot_nt sigObj (signalString sigsig) (qstobj w) (slotString sltslt) (f w)

instance (Qst a) => QsaConnectSlot_nt_f a (QWidget b) (a -> QPoint () -> IO ()) where
  slot' sigObj sigsig = sltConf sltcon
    where
      sltcon w sltslt f _ = connectSlot_nt sigObj (signalString sigsig) (qstobj w) (slotString sltslt) (f w)

instance (Qst a) => QsaConnectSlot_nt_f a (QAbstractButton b) (a -> IO ()) where
  slot' sigObj sigsig = sltConf sltcon
    where
      sltcon w sltslt f _ = connectSlot_nt sigObj (signalString sigsig) (qstobj w) (slotString sltslt) (f w)

class QsaConnectSlot_nt w x f where
  slotf' :: x -> String -> SltCon w x f

instance QsaConnectSlot_nt (QObject a) (QObject b) (()) where
  slotf' sigObj sigStr = sltCon sltcon
    where
      sltcon w sltstr f = connectSlot sigObj sigStr w sltstr f

instance QsaConnectSlot_nt (QObject a) (QObject b) (IO ()) where
  slotf' sigObj sigStr = sltCon sltcon
    where
      sltcon w sltstr f = connectSlot_nt sigObj sigStr w sltstr f

instance QsaConnectSlot_nt (QObject a) (QObject b) (() -> IO ()) where
  slotf' sigObj sigStr = sltCon sltcon
    where
      sltcon w sltstr f = connectSlot_nt sigObj sigStr w sltstr f

instance QsaConnectSlot_nt (QObject a) (QObject b) (String -> IO ()) where
  slotf' sigObj sigStr = sltCon sltcon
    where
      sltcon w sltstr f = connectSlot_nt sigObj sigStr w sltstr f

instance QsaConnectSlot_nt (QObject a) (QObject b) (Object c -> IO ()) where
  slotf' sigObj sigStr = sltCon sltcon
    where
      sltcon w sltstr f = connectSlot_nt sigObj sigStr w sltstr f

class QaParent w x where
  parent' :: Attr w x

class QaWindowModality w x where
  windowModality' :: Attr w x

instance QaWindowModality (QProgressDialog a) WindowModality where
  windowModality' = newAttr getter setter
    where
      getter w = windowModality w ()
      setter w = setWindowModality w :: WindowModality -> IO ()

class QsaConnectSlot_nt_f w x f where
  slot' :: x -> (Qsignal x f) -> SltConf w f

instance QaParent (QObject a) (QObject b) where
  parent' = newAttr getter setter
    where
      getter w = do qObjectParent w >>= \p -> return $ objectCast p
      setter w = qObjectSetParent w :: (QObject b) -> IO ()

class QaText w where
  text' :: Attr w String

instance QaText (QAbstractButton a) where
  text' = newAttr getter setter
    where
      getter w = (uncurry text) (w, ())
      setter w = setText w :: (String) -> IO ()

class QaIcon w where
  icon' :: Attr w (QIcon ())

instance QaIcon (QStandardItem a) where
  icon' = newAttr getter setter
    where
      getter w = (uncurry icon) (w, ())
      setter w = setIcon w :: (QIcon ()) -> IO ()

instance QaIcon (QAbstractButton a) where
  icon' = newAttr getter setter
    where
      getter w = (uncurry icon) (w, ())
      setter w = setIcon w :: (QIcon ()) -> IO ()

class QaAutoRaise w where
  autoRaise' :: Attr w Bool

instance QaAutoRaise (QToolButton a) where
  autoRaise' = newAttr getter setter
    where
      getter w = (uncurry autoRaise) (w, ())
      setter w = setAutoRaise w :: Bool -> IO ()

class QaToolButtonStyle w where
  toolButtonStyle' :: Attr w ToolButtonStyle

instance QaToolButtonStyle (QToolButton a) where
  toolButtonStyle' = newAttr getter setter
    where
      getter w = (uncurry toolButtonStyle) (w, ())
      setter w = setToolButtonStyle w :: ToolButtonStyle -> IO ()

class QaFilterKeyColumn w where
  filterKeyColumn' :: Attr w Int

instance QaFilterKeyColumn (QSortFilterProxyModel a) where
  filterKeyColumn' = newAttr getter setter
    where
      getter w = (uncurry filterKeyColumn) (w, ())
      setter w = setFilterKeyColumn w :: Int -> IO ()

class QaDynamicSortFilter w where
  dynamicSortFilter' :: Attr w Bool

instance QaDynamicSortFilter (QSortFilterProxyModel a) where
  dynamicSortFilter' = newAttr getter setter
    where
      getter w = (uncurry dynamicSortFilter) (w, ())
      setter w = setDynamicSortFilter w :: Bool -> IO ()

class QaSourceModel w where
  sourceModel' :: Attr w (QAbstractItemModel a)

instance QaSourceModel (QAbstractProxyModel ()) where
  sourceModel' = newAttr getter setter
    where
      getter w = do sourceModel w () >>= \m -> return $ objectCast m
      setter w = setSourceModel (w::QAbstractProxyModel ()) :: (QAbstractItemModel a) -> IO ()

instance QaSourceModel (QSortFilterProxyModel ()) where
  sourceModel' = newAttr getter setter
    where
      getter w = do sourceModel w () >>= \m -> return $ objectCast m
      setter w = setSourceModel (w::QSortFilterProxyModel ()) :: (QAbstractItemModel a) -> IO ()

class QafilterRole w where
  filterRole' :: Attr w Int

instance QafilterRole (QSortFilterProxyModel ()) where
  filterRole' = newAttr getter setter
    where
      getter w = (uncurry filterRole) (w, ())
      setter w = setFilterRole w :: Int -> IO ()

class QafilterRegExp w where
  filterRegExp' :: Attr w (QRegExp ())

instance QafilterRegExp (QSortFilterProxyModel ()) where
  filterRegExp' = newAttr getter setter
    where
      getter w = (uncurry filterRegExp) (w, ())
      setter w = setFilterRegExp w :: (QRegExp ()) -> IO ()

class QaVisible w where
  visible' :: Attr w Bool

instance QaVisible (QTreeView ()) where
  visible' = newAttr getter setter
    where
      getter w = (uncurry isVisible) (w, ())
      setter w = setVisible (w::QTreeView ()) :: Bool -> IO ()

class QaModel w where
  model' :: Attr w (QAbstractItemModel a)

instance QaModel (QTreeViewSc a) where
  model' = newAttr getter setter
    where
      getter w = do model w () >>= \m -> return $ objectCast m
      setter w = setModel (w::QTreeViewSc a) :: (QAbstractItemModel b) -> IO ()

instance QaModel (QTreeView ()) where
  model' = newAttr getter setter
    where
      getter w = do model w () >>= \m -> return $ objectCast m
      setter w = setModel (w::QTreeView ()) :: (QAbstractItemModel a) -> IO ()

instance QaModel (QAbstractItemView ()) where
  model' = newAttr getter setter
    where
      getter w = do model w () >>= \m -> return $ objectCast m
      setter w = setModel (w::QAbstractItemView ()) :: (QAbstractItemModel a) -> IO ()

class QaDragEnabled w where
  dragEnabled' :: Attr w Bool

instance QaDragEnabled (QAbstractItemView a) where
  dragEnabled' = newAttr getter setter
    where
      getter w = (uncurry dragEnabled) (w, ())
      setter w = setDragEnabled w :: Bool -> IO ()

class QaAcceptDrops w where
  acceptDrops' :: Attr w Bool

instance QaAcceptDrops (QWidget a) where
  acceptDrops' = newAttr getter setter
    where
      getter w = (uncurry acceptDrops) (w, ())
      setter w = setAcceptDrops w :: Bool -> IO ()

class QaAutoExpandDelay w where
  autoExpandDelay' :: Attr w Int

instance QaAutoExpandDelay (QTreeView a) where
  autoExpandDelay' = newAttr getter setter
    where
      getter w = (uncurry autoExpandDelay) (w, ())
      setter w = setAutoExpandDelay w :: Int -> IO ()

class QaShowDropIndicator w where
  showDropIndicator' :: Attr w Bool

instance QaShowDropIndicator (QAbstractItemView a) where
  showDropIndicator' = newAttr getter setter
    where
      getter w = (uncurry showDropIndicator) (w, ())
      setter w = setDropIndicatorShown w :: Bool -> IO ()

class QaContextMenuPolicy w where
  contextMenuPolicy' :: Attr w ContextMenuPolicy

instance QaContextMenuPolicy (QWidget a) where
  contextMenuPolicy' = newAttr getter setter
    where
      getter w = (uncurry contextMenuPolicy) (w, ())
      setter w = setContextMenuPolicy w :: ContextMenuPolicy -> IO ()

class QaMargin w where
  margin' :: Attr w Int

instance QaMargin (QLayout a) where
  margin' = newAttr getter setter
    where
      getter w = (uncurry margin) (w, ())
      setter w = setMargin w :: Int -> IO ()

class QaEditable w where
  editable' :: Attr w Bool

instance QaEditable (QStandardItem a) where
  editable' = newAttr getter setter
    where
      getter w = (uncurry isEditable) (w, ())
      setter w = setEditable w :: Bool -> IO ()

class QaSelectable w where
  selectable' :: Attr w Bool

instance QaSelectable (QStandardItem a) where
  selectable' = newAttr getter setter
    where
      getter w = (uncurry isSelectable) (w, ())
      setter w = setSelectable w :: Bool -> IO ()

class QaCheckable w where
  checkable' :: Attr w Bool

instance QaCheckable (QStandardItem a) where
  checkable' = newAttr getter setter
    where
      getter w = (uncurry isCheckable) (w, ())
      setter w = setCheckable w :: Bool -> IO ()

class QwaOnEventFilter w x where
  onEventFilter' :: WriteAttr w x

instance (Qstt w (QDialogSc a)) => QwaOnEventFilter w (w -> QDialog b -> QObject t1 -> QEvent t2 -> IO Bool) where
  onEventFilter' = writeAttr sethandler
    where
      sethandler w f = setHandler ((qsttobj w)::QDialogSc a) "(bool)eventFilter(QObject*,QEvent*)" (f w)

instance (Qstt w (QWidgetSc a)) => QwaOnEventFilter w (w -> QWidget b -> QObject t1 -> QEvent t2 -> IO Bool) where
  onEventFilter' = writeAttr sethandler
    where
      sethandler w f = setHandler ((qsttobj w)::QWidgetSc a) "(bool)eventFilter(QObject*,QEvent*)" (f w)

class QwaOnFocusInEvent w x where
  onFocusInEvent' :: WriteAttr w x

instance (Qstt w (QWidgetSc a)) => QwaOnFocusInEvent w (w -> QWidget b -> QFocusEvent t -> IO ()) where
  onFocusInEvent' = writeAttr sethandler
    where
      sethandler w f = setHandler ((qsttobj w)::QWidgetSc a) "focusInEvent(QFocusEvent*)" (f w)

class QaValue w x where
  value' :: Attr w x

instance QaValue (QSettings ()) (String, IO (QByteArray ())) where
  value' = newAttr getter setter
    where
      setter w (k, f) = f >>= \b -> qVariant b >>= \v -> setValue w ((k::String), v)
      getter w = return ("", return $ objectCast $ objectNull)

instance QaValue (QProgressDialog a) Int where
  value' = newAttr getter setter
    where
      getter w = value w ()
      setter w = setValue w :: Int -> IO () 

class QwaDataUserRole w x where
  dataUserRole' :: WriteAttr w (x, Int)

instance QwaDataUserRole (QStandardItem ()) String where
  dataUserRole' = writeAttr setter
    where
      setter w (x, i) = setDataUserRole w (x::String) i

instance QwaDataUserRole (QStandardItem ()) Bool where
  dataUserRole' = writeAttr setter
    where
      setter w (x, i) = setDataUserRole w (x::Bool) i

instance QwaDataUserRole (QStandardItem ()) Int where
  dataUserRole' = writeAttr setter
    where
      setter w (x, i) = setDataUserRole w (x::Int) i

class QwaShow w where
  show' :: WriteAttr w ()

instance QwaShow (QWidget a) where
  show' = writeAttr setter
    where
      setter w = qshow (w :: QWidget a) :: () -> IO ()

class QwaAddWidget w where
  addWidget' :: WriteAttr w (QWidget a)

instance QwaAddWidget (QVBoxLayout ()) where
  addWidget' = writeAttr setter
    where
      setter w = addWidget (w :: QVBoxLayout ()) :: (QWidget a) -> IO ()

class QwaAddLayout w where
  addLayout' :: WriteAttr w (QLayout a)

instance QwaAddLayout (QHBoxLayout a) where
  addLayout' = writeAttr setter
    where
      setter w = addLayout (w :: QHBoxLayout a) :: (QLayout b) -> IO ()

class QwaAddItem w where
  addItem' :: WriteAttr w (QLayoutItem a)

instance QwaAddItem (QHBoxLayout ()) where
  addItem' = writeAttr setter
    where
      setter w = addItem (w :: QHBoxLayout ()) :: (QLayoutItem a) -> IO ()

class QwaAddItems w x where
  addItems' :: WriteAttr w x

instance QwaAddItems (QComboBox a) [String] where
  addItems' = writeAttr setter
    where
      setter w = addItems (w :: QComboBox a) :: [String] -> IO ()

class QwaBlockSignals w where
  blockSignals' :: WriteAttr w Bool

instance QwaBlockSignals (QObject a) where
  blockSignals' = writeAttr setter
    where
      setter w x = do blockSignals w x; return ()

class QwaClear w where
  clear' :: WriteAttr w ()

instance QwaClear (QComboBox a) where
  clear' = writeAttr setter
    where
      setter w = clear (w :: QComboBox a) :: () -> IO ()

class QaCurrentIndex w where
  currentIndex' :: Attr w Int

instance QaCurrentIndex (QComboBox a) where
  currentIndex' = newAttr getter setter
    where
      getter w = currentIndex w ()
      setter w = setCurrentIndex (w :: QComboBox a) :: Int -> IO ()

getSettingsValue :: QSettings () -> String -> IO (Maybe (QByteArray ()))
getSettingsValue settings key
  = settings ~> value ~~ key ~>= qVariant_toByteArray ~>= \ba ->
      ba >~ qByteArray_isEmpty ~>= \baie ->
      return $
        if (not baie)
          then (Just ba)
          else Nothing

_isValid :: (QqisValid a ()) => a -> Bool
_isValid o = unsafePerformIO $ qisValid o ()

userRole :: Int -> Int
userRole i
  = (qEnum_toInt eUserRole) + i

displayRole :: Int -> Int
displayRole i
  = (qEnum_toInt eDisplayRole) + i

class QdataRole x where
  dataRoleS :: x -> IO String
  dataRoleB :: x -> IO Bool

instance QdataRole (QStandardItem ()) where
  dataRoleS ix = ix>~qdata~>=qVariant_toString
  dataRoleB ix = ix>~qdata~>=qVariant_toBool

instance QdataRole (QModelIndex ()) where
  dataRoleS ix = ix>~qdata~>=qVariant_toString
  dataRoleB ix = ix>~qdata~>=qVariant_toBool

class QdataUserRole x where
  dataUserS :: x -> IO String
  dataUserRoleS :: x -> Int -> IO String
  dataUserB :: x -> IO Bool
  dataUserRoleB :: x -> Int -> IO Bool
  dataUserI :: x -> IO Int
  dataUserRoleI :: x -> Int -> IO Int

instance QdataUserRole (QStandardItem ()) where
  dataUserS ix = ix~>qdata~~userRole 0~>=qVariant_toString
  dataUserRoleS ix i = ix~>qdata~~userRole i~>=qVariant_toString
  dataUserB ix = ix~>qdata~~userRole 0~>=qVariant_toBool
  dataUserRoleB ix i = ix~>qdata~~userRole i~>=qVariant_toBool
  dataUserI ix = ix~>qdata~~userRole 0~>=qVariant_toInt
  dataUserRoleI ix i = ix~>qdata~~userRole i~>=qVariant_toInt

instance QdataUserRole (QModelIndex ()) where
  dataUserS ix = ix~>qdata~~userRole 0~>=qVariant_toString
  dataUserRoleS ix i = ix~>qdata~~userRole i~>=qVariant_toString
  dataUserB ix = ix~>qdata~~userRole 0~>=qVariant_toBool
  dataUserRoleB ix i = ix~>qdata~~userRole i~>=qVariant_toBool
  dataUserI ix = ix~>qdata~~userRole 0~>=qVariant_toInt
  dataUserRoleI ix i = ix~>qdata~~userRole i~>=qVariant_toInt

class QdataDisplayRole x where
  dataDisplayS :: x -> IO String
  dataDisplayRoleS :: x -> Int -> IO String
  dataDisplayB :: x -> IO Bool
  dataDisplayRoleB :: x -> Int -> IO Bool

instance QdataDisplayRole (QStandardItem ()) where
  dataDisplayS ix = ix~>qdata~~displayRole 0~>=qVariant_toString
  dataDisplayRoleS ix i = ix~>qdata~~displayRole i~>=qVariant_toString
  dataDisplayB ix = ix~>qdata~~displayRole 0~>=qVariant_toBool
  dataDisplayRoleB ix i = ix~>qdata~~displayRole i~>=qVariant_toBool

instance QdataDisplayRole (QModelIndex ()) where
  dataDisplayS ix = ix~>qdata~~displayRole 0~>=qVariant_toString
  dataDisplayRoleS ix i = ix~>qdata~~displayRole i~>=qVariant_toString
  dataDisplayB ix = ix~>qdata~~displayRole 0~>=qVariant_toBool
  dataDisplayRoleB ix i = ix~>qdata~~displayRole i~>=qVariant_toBool

class QsetDataUserRole a b where
  setDataUserRole :: a -> b -> Int -> IO ()

instance QsetDataUserRole (QStandardItem ()) String where
  setDataUserRole ix s i = ix~>setData/<~(qVariant s, userRole i)

instance QsetDataUserRole (QStandardItem ()) Bool where
  setDataUserRole ix b i = ix~>setData/<~(qVariant b, userRole i)

instance QsetDataUserRole (QStandardItem ()) Int where
  setDataUserRole ix n i = ix~>setData/<~(qVariant n, userRole i)

infixl 4 ~~
infixl 4 ~>
infixl 4 >~
infixl 4 ~>~
infixl 1 ~>=
infixr 3 <~
infixr 2 <$
infixr 1 =<~
infixr 1 /<~

(~~) :: (a -> b) -> a -> b
(~~) f a = f a

class Qfp x y | x -> y where
  (~>) :: x -> (y -> b -> IO c) -> b -> IO c

instance Qfp (Object a) (Object a) where
  (~>) o f t = f o t

instance Qfp (IO (Object a)) (Object a) where
  (~>) f1 f2 t = f1 >>= \o -> f2 o t

class Qfpn x y | x -> y where
  (>~) :: x -> (y -> () -> IO c) -> IO c

instance Qfpn (Object a) (Object a) where
  (>~) o f = f o ()

instance Qfpn (IO (Object a)) (Object a) where
  (>~) f1 f2  = f1 >>= \o -> f2 o ()

class Qnfpn x y | x -> y where
  (~>~) :: x -> (y -> IO c) -> IO c

instance Qnfpn (Object a) (Object a) where
  (~>~) o f = f o

instance Qnfpn (IO (Object a)) (Object a) where
  (~>~) f1 f2  = f1 >>= \o -> f2 o

class Qems b c | c -> b where
  (~<) :: (Object a) -> ((Object a) -> String -> c -> IO ()) -> Qsignalf b -> c -> IO ()

instance Qems (IO ()) () where
  (~<) o f b c = f o (signalStringf b) c

instance Qems (Int -> IO ()) Int where
  (~<) o f b c = f o (signalStringf b) c

instance Qems (String -> IO ()) String where
  (~<) o f b c = f o (signalStringf b) c

instance Qems (QModelIndex () -> IO ()) (QModelIndex ()) where
  (~<) o f b c = f o (signalStringf b) c

(~>=) :: IO a -> (a -> IO b) -> IO b
(~>=) f1 f2 = f1 >>= \t -> f2 t

class Qbps a ia | ia -> a where
  (<$) :: (a -> b -> IO c) -> ia -> b -> IO c

instance Qbps a (IO a) where
  (<$) f2 f1 t = f1 >>= \a -> f2 a t

class Qbp a ia | ia -> a where
  (<~) :: (a -> IO b) -> ia -> IO b

instance Qbp a (IO a) where
  (<~) f2 f1 = f1 >>= \a -> f2 a

instance Qbp (a, b) (a, IO b) where
  (<~) f2 (a, f1b) = f1b >>= \b -> f2 (a, b)

instance Qbp (a, b, c) (a, b, IO c) where
  (<~) f2 (a, b, f1c) = f1c >>= \c -> f2 (a, b, c)

class Qbpe a ia | ia -> a where
  (=<~) :: (a -> IO b) -> ia -> IO b

instance Qbpe (a, b) (IO a, IO b) where
  (=<~) f2 (f1a, f1b) = f1a >>= \a -> f1b >>= \b -> f2 (a, b)

instance Qbpe (a, b, c) (IO a, IO b, IO c) where
  (=<~) f2 (f1a, f1b, f1c) = f1a >>= \a -> f1b >>= \b -> f1c >>= \c -> f2 (a, b, c)

class Qbpd a ia | ia -> a where
  (/<~) :: (a -> IO b) -> ia -> IO b

instance Qbpd (a, b) (IO a, b) where
  (/<~) f2 (f1a, b) = f1a >>= \a -> f2 (a, b)

instance Qbpd (a, b, c) (IO a, b, c) where
  (/<~) f2 (f1a, b, c) = f1a >>= \a -> f2 (a, b, c)

class Qbpde a ia | ia -> a where
  (=/<~) :: (a -> IO b) -> ia -> IO b

instance Qbpde (a, b, c) (IO a, b, IO c) where
  (=/<~) f2 (f1a, b, f1c) = f1a >>= \a -> f1c >>= \c -> f2 (a, b, c)

infixr 0 >:
infixr 0 >>:
infixl 1 ~:

(>:) c f = (\x -> if (x == c) then do f; return True else return False)

(>>:) cl f = (\x -> if (x == head cl) then do f; return True else return False)

class Qslf a b where
  (~:) :: a -> b -> [b]

instance (Eq a) => Qslf a a where
 (~:) e1 e2 = [e1, e2]

instance (Eq a) => Qslf [a] a where
 (~:) l e = reverse (e:l)

(-:) s d = s d

switch :: Eq a => a -> [a -> IO (Bool)] -> IO ()
switch c l = switch_ c l -: return ()

switch_ :: Eq a => a -> [a -> IO (Bool)] -> (IO ()) -> IO ()
switch_ c l d
  = do
    bl <- mapM (\x -> x c) l
    if (not $ and bl)
      then d
      else return ()