{-# LANGUAGE ExistentialQuantification #-}
module System.Glib.Attributes (
Attr,
ReadAttr,
WriteAttr,
ReadWriteAttr,
AttrOp(..),
get,
set,
newNamedAttr,
readNamedAttr,
writeNamedAttr,
newAttr,
readAttr,
writeAttr,
) where
infixr 0 :=,:~,:=>,:~>,::=,::~
type Attr o a = ReadWriteAttr o a a
type ReadAttr o a = ReadWriteAttr o a ()
type WriteAttr o b = ReadWriteAttr o () b
data ReadWriteAttr o a b = Attr String !(o -> IO a) !(o -> b -> IO ())
instance Show (ReadWriteAttr o a b) where
show :: ReadWriteAttr o a b -> String
show (Attr str :: String
str _ _) = String
str
newNamedAttr :: String -> (o -> IO a) -> (o -> b -> IO ()) -> ReadWriteAttr o a b
newNamedAttr :: String -> (o -> IO a) -> (o -> b -> IO ()) -> ReadWriteAttr o a b
newNamedAttr prop :: String
prop getter :: o -> IO a
getter setter :: o -> b -> IO ()
setter = String -> (o -> IO a) -> (o -> b -> IO ()) -> ReadWriteAttr o a b
forall o a b.
String -> (o -> IO a) -> (o -> b -> IO ()) -> ReadWriteAttr o a b
Attr String
prop o -> IO a
getter o -> b -> IO ()
setter
readNamedAttr :: String -> (o -> IO a) -> ReadAttr o a
readNamedAttr :: String -> (o -> IO a) -> ReadAttr o a
readNamedAttr prop :: String
prop getter :: o -> IO a
getter = String -> (o -> IO a) -> (o -> () -> IO ()) -> ReadAttr o a
forall o a b.
String -> (o -> IO a) -> (o -> b -> IO ()) -> ReadWriteAttr o a b
Attr String
prop o -> IO a
getter (\_ _ -> () -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ())
writeNamedAttr :: String -> (o -> b -> IO ()) -> WriteAttr o b
writeNamedAttr :: String -> (o -> b -> IO ()) -> WriteAttr o b
writeNamedAttr prop :: String
prop setter :: o -> b -> IO ()
setter = String -> (o -> IO ()) -> (o -> b -> IO ()) -> WriteAttr o b
forall o a b.
String -> (o -> IO a) -> (o -> b -> IO ()) -> ReadWriteAttr o a b
Attr String
prop (\_ -> () -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()) o -> b -> IO ()
setter
newAttr :: (o -> IO a) -> (o -> b -> IO ()) -> ReadWriteAttr o a b
newAttr :: (o -> IO a) -> (o -> b -> IO ()) -> ReadWriteAttr o a b
newAttr getter :: o -> IO a
getter setter :: o -> b -> IO ()
setter = String -> (o -> IO a) -> (o -> b -> IO ()) -> ReadWriteAttr o a b
forall o a b.
String -> (o -> IO a) -> (o -> b -> IO ()) -> ReadWriteAttr o a b
Attr "unnamed attribute" o -> IO a
getter o -> b -> IO ()
setter
readAttr :: (o -> IO a) -> ReadAttr o a
readAttr :: (o -> IO a) -> ReadAttr o a
readAttr getter :: o -> IO a
getter = String -> (o -> IO a) -> (o -> () -> IO ()) -> ReadAttr o a
forall o a b.
String -> (o -> IO a) -> (o -> b -> IO ()) -> ReadWriteAttr o a b
Attr "unnamed attribute" o -> IO a
getter (\_ _ -> () -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ())
writeAttr :: (o -> b -> IO ()) -> WriteAttr o b
writeAttr :: (o -> b -> IO ()) -> WriteAttr o b
writeAttr setter :: o -> b -> IO ()
setter = String -> (o -> IO ()) -> (o -> b -> IO ()) -> WriteAttr o b
forall o a b.
String -> (o -> IO a) -> (o -> b -> IO ()) -> ReadWriteAttr o a b
Attr "unnamed attribute" (\_ -> () -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()) o -> b -> IO ()
setter
data AttrOp o
= forall a b.
ReadWriteAttr o a b := b
| forall a b.
ReadWriteAttr o a b :~ ( a -> b)
| forall a b.
ReadWriteAttr o a b :=> ( IO b)
| forall a b.
ReadWriteAttr o a b :~> ( a -> IO b)
| forall a b.
ReadWriteAttr o a b ::= (o -> b)
| forall a b.
ReadWriteAttr o a b ::~ (o -> a -> b)
set :: o -> [AttrOp o] -> IO ()
set :: o -> [AttrOp o] -> IO ()
set obj :: o
obj = (AttrOp o -> IO ()) -> [AttrOp o] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ AttrOp o -> IO ()
app
where
app :: AttrOp o -> IO ()
app (Attr _ getter :: o -> IO a
getter setter :: o -> b -> IO ()
setter := x :: b
x) = o -> b -> IO ()
setter o
obj b
x
app (Attr _ getter :: o -> IO a
getter setter :: o -> b -> IO ()
setter :~ f :: a -> b
f) = o -> IO a
getter o
obj IO a -> (a -> IO ()) -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \v :: a
v -> o -> b -> IO ()
setter o
obj (a -> b
f a
v)
app (Attr _ getter :: o -> IO a
getter setter :: o -> b -> IO ()
setter :=> x :: IO b
x) = IO b
x IO b -> (b -> IO ()) -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= o -> b -> IO ()
setter o
obj
app (Attr _ getter :: o -> IO a
getter setter :: o -> b -> IO ()
setter :~> f :: a -> IO b
f) = o -> IO a
getter o
obj IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= a -> IO b
f IO b -> (b -> IO ()) -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= o -> b -> IO ()
setter o
obj
app (Attr _ getter :: o -> IO a
getter setter :: o -> b -> IO ()
setter ::= f :: o -> b
f) = o -> b -> IO ()
setter o
obj (o -> b
f o
obj)
app (Attr _ getter :: o -> IO a
getter setter :: o -> b -> IO ()
setter ::~ f :: o -> a -> b
f) = o -> IO a
getter o
obj IO a -> (a -> IO ()) -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \v :: a
v -> o -> b -> IO ()
setter o
obj (o -> a -> b
f o
obj a
v)
get :: o -> ReadWriteAttr o a b -> IO a
get :: o -> ReadWriteAttr o a b -> IO a
get o :: o
o (Attr _ getter :: o -> IO a
getter setter :: o -> b -> IO ()
setter) = o -> IO a
getter o
o