sodium 0.10.0.1 → 0.10.0.2
raw patch · 3 files changed
+21/−14 lines, 3 files
Files
- examples/tests/unit-tests.hs +1/−1
- sodium.cabal +3/−1
- src/FRP/Sodium/Plain.hs +17/−12
examples/tests/unit-tests.hs view
@@ -546,5 +546,5 @@ switch1, once1, once2, cycle1, split1, split2 {-, mergeWith1, mergeWith2, mergeWith3, coalesce1-} ] -main = {-forever $ -} runTestTT tests+main = forever $ runTestTT tests
sodium.cabal view
@@ -1,5 +1,5 @@ name: sodium-version: 0.10.0.1+version: 0.10.0.2 synopsis: Sodium Reactive Programming (FRP) System description: A general purpose Reactive Programming (FRP) system. This is part of a project to@@ -49,6 +49,8 @@ * 0.10.0.0 - Add Monoid instance to Event - thanks Finlay Thompson. . * 0.10.0.1 - Fix finalizer issue that caused breakage in ghc-7.8 - thanks Luite Stegeman.+ .+ * 0.10.0.2 - Second attempt. license: BSD3 license-file: LICENSE
src/FRP/Sodium/Plain.hs view
@@ -87,7 +87,8 @@ -- Must be data not newtype, because we need to attach finalizers to it data Sample a = Sample { unSample :: IO a,- sDep :: Dep+ sDep :: Dep,+ sampleKeepAlive :: IORef () } instance R.Context Plain where@@ -205,7 +206,7 @@ -- | An event that never fires. never :: Event a never = Event {- getListenRaw = return $ Listen $ \_ _ _ -> return (return ()), + getListenRaw = return $ Listen (\_ _ _ -> return (return ())) undefined, evCacheRef = unsafeNewIORef Nothing undefined, eDep = undefined }@@ -256,8 +257,9 @@ bs <- readIORef bsRef let newCurrent = fromJust (bsUpdate bs) writeIORef bsRef $ newCurrent `seq` BehaviorState newCurrent Nothing+ keepAliveRef <- ioReactive $ newIORef () sample <- ioReactive $ addCleanup_Sample unlistener- (Sample (bsCurrent <$> readIORef bsRef) (dep ea))+ (Sample (bsCurrent <$> readIORef bsRef) (dep ea) keepAliveRef) let beh = sample `seq` Behavior { updates_ = ea, sampleImpl = sample@@ -558,7 +560,9 @@ schedulePost :: [Reactive ()] -> Reactive () schedulePost tasks = Reactive $ modify $ \as -> as { asPost = Seq.fromList tasks >< asPost as } -data Listen a = Listen { runListen_ :: Maybe (MVar Node) -> Bool -> (a -> Reactive ()) -> Reactive (IO ()) }+data Listen a = Listen { runListen_ :: Maybe (MVar Node) -> Bool -> (a -> Reactive ()) -> Reactive (IO ())+ , listenerKeepAlive :: IORef ()+ } -- | Unwrap an event's listener machinery. getListen :: Event a -> Reactive (Listen a)@@ -608,7 +612,7 @@ wrap :: (Maybe (MVar Node) -> Bool -> (a -> Reactive ()) -> Reactive (IO ())) -> IO (Listen a) {-# NOINLINE wrap #-}-wrap l = return (Listen l)+wrap l = Listen l <$> newIORef () touch :: a -> IO () {-# NOINLINE touch #-}@@ -708,8 +712,8 @@ where cacheRef = unsafeNewIORef Nothing e getListen' =- return $ Listen $ \mNodeRef suppressEarlierFirings handle -> do- linkedListen e mNodeRef suppressEarlierFirings (handle . f)+ return $ Listen (\mNodeRef suppressEarlierFirings handle -> do+ linkedListen e mNodeRef suppressEarlierFirings (handle . f)) undefined instance Functor (R.Behavior Plain) where f `fmap` Behavior e s =@@ -717,12 +721,12 @@ where fe = f `fmap` e s' = unSample s- fs = s' `seq` Sample (f `fmap` s') (dep s)+ fs = s' `seq` Sample (f `fmap` s') (dep s) undefined constant :: a -> Behavior a constant a = Behavior { updates_ = never,- sampleImpl = Sample (return a) undefined+ sampleImpl = Sample (return a) undefined undefined } data BehaviorState a = BehaviorState {@@ -743,14 +747,14 @@ finalizeListen :: Listen a -> IO () -> IO (Listen a) {-# NOINLINE finalizeListen #-} finalizeListen l unlisten = do- addFinalizer l unlisten+ mkWeakIORef (listenerKeepAlive l) unlisten return l -- | Add a finalizer to a Reactive. finalizeSample :: Sample a -> IO () -> IO (Sample a) {-# NOINLINE finalizeSample #-} finalizeSample s unlisten = do- addFinalizer s unlisten+ mkWeakIORef (sampleKeepAlive s) unlisten return s newtype Unlistener = Unlistener (MVar (Maybe (IO ())))@@ -841,6 +845,7 @@ b1@(Behavior e1 s1) <*> b2@(Behavior e2 s2) = Behavior u s where cacheRef = unsafeNewIORef Nothing s2+ keepaliveRef = unsafeNewIORef () s2 u = Event gl cacheRef (dep (e1,e2)) s1' = unSample s1 s2' = unSample s2@@ -859,7 +864,7 @@ push (f a) return (un1 >> un2) addCleanup_Listen unlistener l- s = s1' `seq` s2' `seq` Sample (($) <$> s1' <*> s2') (dep (s1, s2))+ s = s1' `seq` s2' `seq` Sample (($) <$> s1' <*> s2') (dep (s1, s2)) keepaliveRef {- -- | Cross the specified event over to a different partition.