Skip to content

Commit 7241bc9

Browse files
committed
Experiment: make StateRef wrappers optional
1 parent 7d4f3a8 commit 7241bc9

File tree

1 file changed

+49
-12
lines changed

1 file changed

+49
-12
lines changed

src/DearImGui.hs

Lines changed: 49 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -570,21 +570,58 @@ arrowButton strId dir = liftIO do
570570
withCString strId \strIdPtr ->
571571
Raw.arrowButton strIdPtr dir
572572

573-
574573
-- | Wraps @ImGui::Checkbox()@.
575574
checkbox :: (HasSetter ref Bool, HasGetter ref Bool, MonadIO m) => String -> ref -> m Bool
576-
checkbox label ref = liftIO do
577-
currentValue <- get ref
578-
with (bool 0 1 currentValue) \boolPtr -> do
579-
changed <- withCString label \labelPtr ->
580-
Raw.checkbox labelPtr boolPtr
581-
582-
when changed do
583-
newValue <- peek boolPtr
584-
ref $=! (newValue == 1)
585-
586-
return changed
575+
checkbox label ref = stateful ref $ checkboxM label
587576

577+
-- | Wraps @ImGui::Checkbox()@.
578+
checkboxM :: (MonadIO m) => String -> Bool -> m (Maybe Bool)
579+
checkboxM label currentValue =
580+
changing
581+
(bool 0 1 currentValue)
582+
( \valuePtr ->
583+
withCString label \labelPtr ->
584+
Raw.checkbox labelPtr valuePtr
585+
)
586+
(pure . (/=) 0)
587+
588+
{-# INLINEABLE changing #-}
589+
changing
590+
:: (MonadIO m, Storable a1)
591+
=> a1
592+
-> (Ptr a1 -> IO Bool)
593+
-> (a1 -> IO a2)
594+
-> m (Maybe a2)
595+
changing oldValue action extract = liftIO do
596+
with oldValue \valuePtr ->
597+
action valuePtr >>=
598+
peekChanged valuePtr extract
599+
600+
{-# INLINEABLE peekChanged #-}
601+
peekChanged
602+
:: (MonadIO m, Storable a1)
603+
=> Ptr a1 -> (a1 -> m a2) -> Bool -> m (Maybe a2)
604+
peekChanged ptr action flag = do
605+
if flag then
606+
liftIO (peek ptr) >>=
607+
fmap Just . action
608+
else
609+
pure Nothing
610+
611+
{-# INLINEABLE stateful #-}
612+
stateful
613+
:: (HasGetter t a, MonadIO m, HasSetter t a)
614+
=> t -> (a -> m (Maybe a)) -> m Bool
615+
stateful ref action = get ref >>= action >>= maybeSet ref
616+
617+
{-# INLINEABLE maybeSet #-}
618+
maybeSet :: (HasSetter t a, MonadIO f) => t -> Maybe a -> f Bool
619+
maybeSet ref = \case
620+
Nothing ->
621+
pure False
622+
Just val -> do
623+
ref $=! val
624+
pure True
588625

589626
progressBar :: MonadIO m => Float -> Maybe String -> m ()
590627
progressBar progress overlay = liftIO do

0 commit comments

Comments
 (0)