foreign-var 0.0.0.1 → 0.1
raw patch · 3 files changed
+13/−53 lines, 3 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- Foreign.Var: getVar :: Var a -> IO a
- Foreign.Var: newVar :: (IO a) -> (a -> IO ()) -> Var a
- Foreign.Var: setVar :: Var a -> a -> IO ()
- Foreign.Var: updateVar :: Var a -> (a -> a) -> IO ()
- Foreign.Var: updateVar' :: Var a -> (a -> a) -> IO ()
- Foreign.Var: Var :: IO a -> ((a -> a) -> IO ()) -> ((a -> a) -> IO ()) -> (a -> IO ()) -> Var a
+ Foreign.Var: Var :: (IO a) -> (a -> IO ()) -> Var a
Files
- CHANGELOG.markdown +4/−0
- foreign-var.cabal +1/−1
- src/Foreign/Var.hs +8/−52
CHANGELOG.markdown view
@@ -1,3 +1,7 @@+0.1+---+* Simplified `Var`+ 0.0.0.1 ------- * Enable compilation on GHC < 7.6
foreign-var.cabal view
@@ -1,6 +1,6 @@ name: foreign-var category: FFI, Mutable State-version: 0.0.0.1+version: 0.1 license: BSD3 cabal-version: >= 1.10 license-file: LICENSE
src/Foreign/Var.hs view
@@ -17,8 +17,7 @@ module Foreign.Var ( -- * Variables- Var(..)- , newVar+ Var(Var) , mapVar , SettableVar(SettableVar) , GettableVar@@ -35,9 +34,6 @@ import Data.Typeable import Foreign.Ptr import Foreign.Storable---import Data.Void---import Data.Functor.Contravariant---import Data.Functor.Contravariant.Divisible -------------------------------------------------------------------- -- * Var@@ -54,7 +50,7 @@ -- thrown exception: -- -- @--- do x <- 'getVar' v; 'setVar' v y; 'setVar' v x+-- do x <- 'get' v; v '$=' y; v '$=' x -- @ -- -- should restore the previous state.@@ -62,59 +58,21 @@ -- Ideally, in the absence of thrown exceptions: -- -- @--- 'setVar' v a >> 'getVar' v+-- v '$=' a >> 'get' v -- @ -- -- should return @a@, regardless of @a@. In practice some 'Var's only -- permit a very limited range of value assignments, and do not report failure.------ The result of 'updateVar' should also be compatible with the result of getting--- and setting separately, however, it may be more efficient or have better--- atomicity properties in a concurrent setting.-data Var a = Var- { getVar :: IO a -- ^ Used by 'get'- , updateVar :: (a -> a) -> IO () -- ^ Used by @('$~')@- , updateVar' :: (a -> a) -> IO () -- ^ Used by @('$~!')@- , setVar :: a -> IO () -- ^ Used by @('$=')@- } deriving Typeable---- | Build a 'Var' form a getter and a setter.-newVar :: (IO a) -- ^ getter- -> (a -> IO ()) -- ^ setter- -> Var a-newVar g s = Var g u u' s where- u f = do- a <- g- s (f a)- u' f = do- a <- g- s $! f a+data Var a = Var (IO a) (a -> IO ()) deriving Typeable -- | Change the type of a 'Var' mapVar :: (b -> a) -> (a -> b) -> Var a -> Var b-mapVar ba ab (Var ga ua ua' sa) = Var (ab <$> ga) (\bb -> ua (ba . bb . ab)) (\bb -> ua' (ba . bb . ab)) (sa . ba)+mapVar ba ab (Var ga sa) = Var (ab <$> ga) (sa . ba) {-# INLINE mapVar #-} newtype SettableVar a = SettableVar (a -> IO ()) deriving Typeable -{--instance Contravariant SettableVar where- contramap f (SettableVar k) = SettableVar (k . f)- {-# INLINE contramap #-}--instance Divisible SettableVar where- divide k (SettableVar l) (SettableVar r) = SettableVar $ \ a -> case k a of- (b, c) -> l b >> r c- conquer = SettableVar $ \_ -> return ()--instance Decidable SettableVar where- lose k = SettableVar (absurd . k)- choose k (SettableVar l) (SettableVar r) = SettableVar $ \ a -> case k a of- Left b -> l b- Right c -> r c--}- type GettableVar = IO --------------------------------------------------------------------@@ -135,7 +93,7 @@ {-# INLINE ($=) #-} instance HasSetter (Var a) a where- Var _ _ _ s $= a = liftIO $ s a+ Var _ s $= a = liftIO $ s a instance Storable a => HasSetter (Ptr a) a where p $= a = liftIO $ poke p a@@ -166,9 +124,7 @@ a <- get r r $=! f a -instance HasUpdate (Var a) a a where- Var _ u _ _ $~ f = liftIO $ u f- Var _ _ v _ $~! f = liftIO $ v f+instance HasUpdate (Var a) a a instance Storable a => HasUpdate (Ptr a) a a @@ -198,7 +154,7 @@ get :: MonadIO m => t -> m a instance HasGetter (Var a) a where- get (Var g _ _ _) = liftIO g+ get (Var g _) = liftIO g instance HasGetter (TVar a) a where get = liftIO . atomically . readTVar