on develop help sign in
Fix small laziness issue and add a test for it
61c1ffdRyan Trinkle
src/Reflex/Spider/Internal.hs+1−1
@@ -596,7 +596,7 @@ unsubscribe (EventSubscription msln _) = forM_ msln $ \sln -> WeakBag.remove sln
596data Hold x p a
596data Hold x p a
597 = Hold { holdValue :: !(IORef a)
597 = Hold { holdValue :: !(IORef a)
598 , holdInvalidators :: !(IORef [Weak (Invalidator x)])
598 , holdInvalidators :: !(IORef [Weak (Invalidator x)])
599− , holdEvent :: !(Event x (p a))
599+ , holdEvent :: Event x (p a) -- This must be lazy, or holds cannot be defined before their input Events
600 , holdParent :: !(IORef (Maybe (EventSubscription x (p a)))) -- Keeps its parent alive (will be undefined until the hold is initialized) --TODO: Probably shouldn't be an IORef
600 , holdParent :: !(IORef (Maybe (EventSubscription x (p a)))) -- Keeps its parent alive (will be undefined until the hold is initialized) --TODO: Probably shouldn't be an IORef
601#ifdef DEBUG_NODEIDS
601#ifdef DEBUG_NODEIDS
602 , holdNodeId :: Int
602 , holdNodeId :: Int
test/Reflex/Test/Micro.hs+11−2
@@ -1,9 +1,11 @@
1+{-# LANGUAGE BangPatterns #-}
1{-# LANGUAGE ConstraintKinds #-}
2{-# LANGUAGE ConstraintKinds #-}
2{-# LANGUAGE FlexibleContexts #-}
3{-# LANGUAGE FlexibleContexts #-}
3{-# LANGUAGE FlexibleInstances #-}
4{-# LANGUAGE FlexibleInstances #-}
4{-# LANGUAGE GADTs #-}
5{-# LANGUAGE GADTs #-}
5{-# LANGUAGE MultiParamTypeClasses #-}
6{-# LANGUAGE MultiParamTypeClasses #-}
6{-# LANGUAGE RankNTypes #-}
7{-# LANGUAGE RankNTypes #-}
8+{-# LANGUAGE RecursiveDo #-}
7
9
8module Reflex.Test.Micro (testCases) where
10module Reflex.Test.Micro (testCases) where
9
11
@@ -12,12 +14,11 @@ import Reflex.TestPlan
12
14
13import Control.Applicative
15import Control.Applicative
14import Control.Monad
16import Control.Monad
17+import Control.Monad.Fix
15import Data.Char
18import Data.Char
16import Data.Functor.Misc
19import Data.Functor.Misc
17import Data.Monoid
20import Data.Monoid
18−
19import Data.Foldable
21import Data.Foldable
20−
21import qualified Data.Map as Map
22import qualified Data.Map as Map
22
23
23import Prelude
24import Prelude
@@ -249,6 +250,14 @@ testCases =
249 f <- fanMap . fmap toMap <$> events1
250 f <- fanMap . fmap toMap <$> events1
250 return $ toList <$> mergeList [ select f (Const2 'b'), select f (Const2 'b'), select f (Const2 'e'), select f (Const2 'e') ]
251 return $ toList <$> mergeList [ select f (Const2 'b'), select f (Const2 'b'), select f (Const2 'e'), select f (Const2 'e') ]
251
252
253+ , testE "lazy-hold" $ do
254+ let lazyHold :: forall t m. (Reflex t, MonadHold t m, MonadFix m) => m (Event t ())
255+ lazyHold = do
256+ rec !b <- hold never e
257+ let e = never <$ switch b
258+ return $ void e
259+ lazyHold
260+
252 ] where
261 ] where
253
262
254 events1, events2, events3 :: TestPlan t m => m (Event t String)
263 events1, events2, events3 :: TestPlan t m => m (Event t String)