{-# LANGUAGE OverloadedLabels #-}
{-# LANGUAGE OverloadedLists #-}
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Control.Concurrent
import Control.Monad
import Criterion.Main
import Data.Functor ((<&>))
import Data.Text
import qualified GI.Gdk as Gdk
import qualified GI.GLib.Constants as GLib
import GI.Gtk (Box (..), Label (..), Window (..))
import qualified GI.Gtk as Gtk
import GI.Gtk.Declarative
import GI.Gtk.Declarative.State
testView :: [Int] -> Widget ()
testView ns = bin Window [] $ container Box [] $ ns <&> \n ->
BoxChild defaultBoxChildProperties { expand = True
, fill = True
, padding = 10
}
$ widget Label [#label := pack (show n), classes ["a", "b"]]
testPatch :: Patchable widget => SomeState -> widget e1 -> widget e2 -> IO SomeState
testPatch state oldView newView = case patch state oldView newView of
Modify ma -> do
ret <- newEmptyMVar
void . Gdk.threadsAddIdle GLib.PRIORITY_DEFAULT $ do
ma >>= putMVar ret
return False
takeMVar ret
_ -> error "Expected a modification."
main :: IO ()
main = do
_ <- Gtk.init Nothing
let initialView = testView [1 .. 100]
initialState <- create initialView
#showAll =<< someStateWidget initialState
_ <- forkOS $ do
defaultMain
[ bgroup
"patch"
[ bench "Modify (equal)" . whnfIO . replicateM_ 10 $ do
s1 <- testPatch initialState initialView initialView
void $ testPatch s1 initialView initialView
, bench "Modify (diff)" . whnfIO . replicateM_ 10 $ do
s1 <- testPatch initialState initialView initialView
void $ testPatch s1 initialView (testView [2 .. 101])
]
]
Gtk.mainQuit
Gtk.main