packages feed

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 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.