primitive 0.4.0.1 → 0.4.1
raw patch · 2 files changed
+64/−1 lines, 2 files
Files
- Data/Primitive/MutVar.hs +58/−0
- primitive.cabal +6/−1
+ Data/Primitive/MutVar.hs view
@@ -0,0 +1,58 @@+{-# LANGUAGE MagicHash, UnboxedTuples, DeriveDataTypeable #-}++-- |+-- Module : Data.Primitive.MutVar+-- Copyright : (c) Justin Bonnar 2011+-- License : BSD-style+--+-- Maintainer : Justin Bonnar <justinbonnar@gmail.com>+-- Portability : non-portable+-- +-- Primitive boxed mutable variables+--++module Data.Primitive.MutVar (+ MutVar(..),+ + newMutVar,+ readMutVar,+ writeMutVar,+ + modifyMutVar+) where++import Control.Monad.Primitive ( PrimMonad(..), primitive_ )+import GHC.Prim ( MutVar#, sameMutVar#, newMutVar#, readMutVar#, writeMutVar# )+import Data.Typeable ( Typeable )++-- | A 'MutVar' behaves like a single-element mutable array associated+-- with a primitive state token.+data MutVar s a = MutVar (MutVar# s a)+ deriving ( Typeable )++instance Eq (MutVar s a) where+ MutVar mva# == MutVar mvb# = sameMutVar# mva# mvb#++-- | Create a new 'MutVar' with the specified initial value+newMutVar :: PrimMonad m => a -> m (MutVar (PrimState m) a)+{-# INLINE newMutVar #-}+newMutVar initialValue = primitive $ \s# ->+ case newMutVar# initialValue s# of+ (# s'#, mv# #) -> (# s'#, MutVar mv# #)++-- | Read the value of a 'MutVar'+readMutVar :: PrimMonad m => MutVar (PrimState m) a -> m a+{-# INLINE readMutVar #-}+readMutVar (MutVar mv#) = primitive (readMutVar# mv#)++-- | Write a new value into a 'MutVar'+writeMutVar :: PrimMonad m => MutVar (PrimState m) a -> a -> m ()+{-# INLINE writeMutVar #-}+writeMutVar (MutVar mv#) newValue = primitive_ (writeMutVar# mv# newValue)++-- | Mutate the contents of a 'MutVar' +modifyMutVar :: PrimMonad m => MutVar (PrimState m) a -> (a -> a) -> m ()+{-# INLINE modifyMutVar #-}+modifyMutVar (MutVar mv#) g = primitive_ $ \s# ->+ case readMutVar# mv# s# of+ (# s'#, a #) -> writeMutVar# mv# (g a) s'#
primitive.cabal view
@@ -1,5 +1,5 @@ Name: primitive-Version: 0.4.0.1+Version: 0.4.1 License: BSD3 License-File: LICENSE Author: Roman Leshchinskiy <rl@cse.unsw.edu.au>@@ -13,6 +13,10 @@ This package provides wrappers for primitive array operations from GHC.Prim. .+ Changes in version 0.4.1+ .+ * New module "Data.Primitive.MutVar"+ . Changes in version 0.4.0.1 . * Critical bug fix in @fillByteArray@@@ -47,6 +51,7 @@ Data.Primitive.Array Data.Primitive.ByteArray Data.Primitive.Addr+ Data.Primitive.MutVar Other-Modules: Data.Primitive.Internal.Compat