{-# 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 String
str o -> IO a
_ o -> b -> IO ()
_) = String
str
newNamedAttr :: String -> (o -> IO a) -> (o -> b -> IO ()) -> ReadWriteAttr o a b
newNamedAttr :: forall o a b.
String -> (o -> IO a) -> (o -> b -> IO ()) -> ReadWriteAttr o a b
newNamedAttr String
prop o -> IO a
getter 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 :: forall o a. String -> (o -> IO a) -> ReadAttr o a
readNamedAttr String
prop o -> IO a
getter = String -> (o -> IO a) -> (o -> () -> IO ()) -> ReadWriteAttr o a ()
forall o a b.
String -> (o -> IO a) -> (o -> b -> IO ()) -> ReadWriteAttr o a b
Attr String
prop o -> IO a
getter (\o
_ ()
_ -> () -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ())
writeNamedAttr :: String -> (o -> b -> IO ()) -> WriteAttr o b
writeNamedAttr :: forall o b. String -> (o -> b -> IO ()) -> WriteAttr o b
writeNamedAttr String
prop o -> b -> IO ()
setter = String -> (o -> IO ()) -> (o -> b -> IO ()) -> ReadWriteAttr o () b
forall o a b.
String -> (o -> IO a) -> (o -> b -> IO ()) -> ReadWriteAttr o a b
Attr String
prop (\o
_ -> () -> IO ()
forall a. a -> IO a
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 :: forall o a b.
(o -> IO a) -> (o -> b -> IO ()) -> ReadWriteAttr o a b
newAttr o -> IO a
getter 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
"unnamed attribute" o -> IO a
getter o -> b -> IO ()
setter
readAttr :: (o -> IO a) -> ReadAttr o a
readAttr :: forall o a. (o -> IO a) -> ReadAttr o a
readAttr o -> IO a
getter = String -> (o -> IO a) -> (o -> () -> IO ()) -> ReadWriteAttr o a ()
forall o a b.
String -> (o -> IO a) -> (o -> b -> IO ()) -> ReadWriteAttr o a b
Attr String
"unnamed attribute" o -> IO a
getter (\o
_ ()
_ -> () -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ())
writeAttr :: (o -> b -> IO ()) -> WriteAttr o b
writeAttr :: forall o b. (o -> b -> IO ()) -> WriteAttr o b
writeAttr o -> b -> IO ()
setter = String -> (o -> IO ()) -> (o -> b -> IO ()) -> ReadWriteAttr o () b
forall o a b.
String -> (o -> IO a) -> (o -> b -> IO ()) -> ReadWriteAttr o a b
Attr String
"unnamed attribute" (\o
_ -> () -> IO ()
forall a. a -> IO a
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 :: forall o. o -> [AttrOp o] -> IO ()
set 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 String
_ o -> IO a
getter o -> b -> IO ()
setter := b
x) = o -> b -> IO ()
setter o
obj b
x
app (Attr String
_ o -> IO a
getter o -> b -> IO ()
setter :~ a -> b
f) = o -> IO a
getter o
obj IO a -> (a -> IO ()) -> IO ()
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \a
v -> o -> b -> IO ()
setter o
obj (a -> b
f a
v)
app (Attr String
_ o -> IO a
getter o -> b -> IO ()
setter :=> IO b
x) = IO b
x IO b -> (b -> IO ()) -> IO ()
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= o -> b -> IO ()
setter o
obj
app (Attr String
_ o -> IO a
getter o -> b -> IO ()
setter :~> a -> IO b
f) = o -> IO a
getter o
obj IO a -> (a -> IO b) -> IO b
forall a b. 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 a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= o -> b -> IO ()
setter o
obj
app (Attr String
_ o -> IO a
getter o -> b -> IO ()
setter ::= o -> b
f) = o -> b -> IO ()
setter o
obj (o -> b
f o
obj)
app (Attr String
_ o -> IO a
getter o -> b -> IO ()
setter ::~ o -> a -> b
f) = o -> IO a
getter o
obj IO a -> (a -> IO ()) -> IO ()
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \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 :: forall o a b. o -> ReadWriteAttr o a b -> IO a
get o
o (Attr String
_ o -> IO a
getter o -> b -> IO ()
setter) = o -> IO a
getter o
o