1{-# LANGUAGE BangPatterns #-}
2{-# LANGUAGE TupleSections #-}
3{-# LANGUAGE ScopedTypeVariables #-}
4{-# LANGUAGE TypeFamilies #-}
7import Data.Functor.Misc
8import Control.Monad.Primitive
9import Control.Monad.IO.Class
10import Control.Monad.Identity
11import Data.Dependent.Sum
12import Control.Concurrent.STM
13import Control.Applicative
14import System.IO.Unsafe
17import Control.Exception (evaluate)
20import Reflex.Host.Class
25import qualified Data.Traversable as T
27import qualified Data.Dependent.Map as DM
32 [ bgroup "micro" micros ]
34instance NFData (IORef a) where
37instance NFData (TVar a) where
40newtype WHNF a = WHNF a
41instance NFData (WHNF a) where
42 rnf (WHNF a) = seq a ()
44withSetup :: NFData b => String -> SpiderHost a -> (a -> SpiderHost b) -> Benchmark
45withSetup name setup action = env (WHNF <$> runSpiderHost setup) $ \ ~(WHNF a) ->
46 bench name . nfIO $ runSpiderHost (action a)
48withSetupWHNF :: String -> SpiderHost a -> (a -> SpiderHost b) -> Benchmark
49withSetupWHNF name setup action = env (WHNF <$> runSpiderHost setup) $ \ ~(WHNF a) ->
50 bench name . whnfIO $ runSpiderHost (action a)
55 [ bench "newIORef" $ whnfIO $ void $ newIORef ()
56 , env (newIORef (42 :: Int)) (bench "readIORef" . whnfIO . readIORef)
57 , bench "newTVar" $ whnfIO $ void $ newTVarIO ()
58 , env (newTVarIO (42 :: Int)) (bench "readTVar" . whnfIO . readTVarIO)
59 , bench "newEventWithTrigger" $ whnfIO . void $ runSpiderHost $ newEventWithTrigger $
60 \trigger -> return () <$ evaluate trigger
61 , bench "newEventWithTriggerRef" $ whnfIO . void $ runSpiderHost newEventWithTriggerRef
62 , withSetupWHNF "subscribeEvent" newEventWithTriggerRef $ subscribeEvent . fst
63 , withSetupWHNF "subscribeSwitch"
64 (join $ hold <$> fmap fst newEventWithTriggerRef <*> fmap fst newEventWithTriggerRef)
65 (subscribeEvent . switch)
66 , withSetupWHNF "subscribeMerge(1)" (setupMerge 1) $ \(ev,_) -> subscribeEvent ev
67 , withSetupWHNF "subscribeMerge(100)" (setupMerge 100) (subscribeEvent . fst)
68 , withSetupWHNF "subscribeMerge(10000)" (setupMerge 10000) (subscribeEvent . fst)
69 , bench "runHostFrame" $ whnfIO $ runSpiderHost $ runHostFrame $ return ()
70 , withSetupWHNF "fireEventsAndRead(single/single)"
71 (newEventWithTriggerRef >>= subscribePair)
72 (\(subd, trigger) -> fireAndRead trigger (42 :: Int) subd)
73 , withSetupWHNF "fireEventsOnly"
74 (newEventWithTriggerRef >>= subscribePair)
75 (\(subd, trigger) -> do
76 Just key <- liftIO $ readIORef trigger
77 fireEvents [key :=> Identity (42 :: Int)])
78 , withSetupWHNF "fireEventsAndRead(head/merge1)"
79 (setupMerge 1 >>= subscribePair)
80 (\(subd, t:riggers) -> fireAndRead t (42 :: Int) subd)
81 , withSetupWHNF "fireEventsAndRead(head/merge100)"
82 (setupMerge 100 >>= subscribePair)
83 (\(subd, t:riggers) -> fireAndRead t (42 :: Int) subd)
84 , withSetupWHNF "fireEventsAndRead(head/merge10000)"
85 (setupMerge 10000 >>= subscribePair)
86 (\(subd, t:riggers) -> fireAndRead t (42 :: Int) subd)
87 , withSetupWHNF "fireEventsOnly(head/merge100)"
88 (setupMerge 100 >>= subscribePair)
89 (\(subd, t:riggers) -> do
90 Just key <- liftIO $ readIORef t
91 fireEvents [key :=> Identity (42 :: Int)])
92 , withSetupWHNF "hold" newEventWithTriggerRef $ \(ev,trigger) -> hold (42 :: Int) ev
93 , withSetupWHNF "sample" (newEventWithTriggerRef >>= hold (42 :: Int) . fst) sample
97 -> SpiderHost (Event Spider (DM.DMap (Const2 Int a) Identity),
98 [IORef (Maybe (EventTrigger Spider a))])
100 (evs, triggers) <- unzip <$> replicateM 100 newEventWithTriggerRef
101 let !m = DM.fromList [(Const2 i) :=> v | (i,v) <- zip [0..] evs]
102 pure (merge m, triggers)
104subscribePair :: (Event Spider a, b) -> SpiderHost (EventHandle Spider a, b)
105subscribePair (ev, b) = (,b) <$> subscribeEvent ev
107fireAndRead :: IORef (Maybe (EventTrigger Spider a)) -> a -> EventHandle Spider b
108 -> SpiderHost (Maybe b)
109fireAndRead trigger val subd = do
110 Just key <- liftIO $ readIORef trigger
111 fireEventsAndRead [key :=> Identity val] $ readEvent subd >>= T.sequence
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list