{-# LANGUAGE OverloadedLabels #-} {-# LANGUAGE OverloadedLists #-} {-# LANGUAGE OverloadedStrings #-} module Main where import Control.Concurrent import Control.Monad import Criterion.Main 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 [] $ forM_ ns $ \n -> boxChild True True 10 $ widget Label [#label := pack (show n), classes ["a", "b"]] 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