{-# 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 Data.Vector (Vector)
import qualified Data.Vector as Vector
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 :: Vector 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 (Vector.enumFromN 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 (Vector.enumFromN 2 101))
]
]
Gtk.mainQuit
Gtk.main