Ref (empty) → 0.1.0.0
raw patch · 4 files changed
+181/−0 lines, 4 filesdep +basesetup-changed
Dependencies added: base
Files
- LICENSE +30/−0
- Ref.cabal +73/−0
- Setup.hs +2/−0
- src/Data/Ref.hs +76/−0
+ LICENSE view
@@ -0,0 +1,30 @@+Copyright (c) 2013, Carter Tazio Schonwald++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++ * Redistributions of source code must retain the above copyright+ notice, this list of conditions and the following disclaimer.++ * Redistributions in binary form must reproduce the above+ copyright notice, this list of conditions and the following+ disclaimer in the documentation and/or other materials provided+ with the distribution.++ * Neither the name of Carter Tazio Schonwald nor the names of other+ contributors may be used to endorse or promote products derived+ from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ Ref.cabal view
@@ -0,0 +1,73 @@+-- Initial Ref.cabal generated by cabal init. For further documentation, +-- see http://haskell.org/cabal/users-guide/++-- The name of the package.+name: Ref++-- The package version. See the Haskell package versioning policy (PVP) +-- for standards guiding when and how versions should be incremented.+-- http://www.haskell.org/haskellwiki/Package_versioning_policy+-- PVP summary: +-+------- breaking API changes+-- | | +----- non-breaking API additions+-- | | | +--- code changes with no API change+version: 0.1.0.0++-- A short (one-line) description of the package.+synopsis: Generic Mutable Ref Abstraction Layer ++-- A longer description of the package.+description: + Ref is a generic layer over mutable references, currently only IO and ST refs.+ Future extensions may include a generic api for shared state concurrency.++-- The license under which the package is released.+stability: provisional+homepage: https://bitbucket.org/carter/ref+--bug-reports: +copyright: Copyright (C) 2013 Carter T Schonwald +license: BSD3++-- The file containing the license text.+license-file: LICENSE++-- The package author(s).+author: Carter Tazio Schonwald++-- An email address to which users can send suggestions, bug reports, and +-- patches.+maintainer: carter at wellposed dot com++-- A copyright notice.+-- copyright: ++category: Data++build-type: Simple++-- Extra files to be distributed with the package, such as examples or a +-- README.+-- extra-source-files: ++-- Constraint on the version of Cabal needed to build this package.+cabal-version: >=1.10+++library+ -- Modules exported by the library.+ exposed-modules: Data.Ref+ + -- Modules included in this library but not exported.+ -- other-modules: + + -- LANGUAGE extensions used by modules in this package.+ -- other-extensions: + + -- Other library packages from which modules are imported.+ build-depends: base ==4.6.*+ + -- Directories containing source files.+ hs-source-dirs: src+ + -- Base language which the package is written in.+ default-language: Haskell2010+
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ src/Data/Ref.hs view
@@ -0,0 +1,76 @@+{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE DataKinds #-}++module Data.Ref where++{- -}++import qualified Data.IORef as IR +import qualified Data.STRef.Strict as SR +import Control.Monad.ST.Safe (ST)++import Control.Monad ++{- I can't choose what sort of ref you give me,+ nor can i change what the current monad is+ so why bother using different operations for either? ++ also i'm only providing the stict versions of the data types as applicable+ , though other instances that are sensible are welcome.++ also worth thinking about how to support analogous generic api for concurrent operations+ -}++class Ref ref where+ type RefM ref :: * -> *+ newRef :: a -> RefM ref (ref a)+ newRef' :: a -> RefM ref (ref a)+ readRef :: ref a -> RefM ref a+ readRef' :: ref a -> RefM ref a+ writeRef :: ref a -> a -> RefM ref ()+ writeRef' :: ref a -> a -> RefM ref ()+ modifyRef :: ref a -> (a-> a) -> RefM ref ()+ modifyRef' :: ref a -> (a-> a) -> RefM ref ()++instance Ref IR.IORef where+ type RefM IR.IORef = IO + newRef a = IR.newIORef a + {-# INLINE newRef #-}+ newRef' !a = IR.newIORef $! a + {-# INLINE newRef' #-}+ readRef a = IR.readIORef a+ {-# INLINE readRef #-}+ readRef' !r = IR.readIORef $! r + {-# INLINE readRef' #-}+ writeRef r a = IR.writeIORef r a + {-# INLINE writeRef #-} + writeRef' !r !a =IR.writeIORef r $! a + {-# INLINE writeRef' #-}+ modifyRef r f = IR.modifyIORef r f + {-# INLINE modifyRef #-}+ modifyRef' r f = IR.modifyIORef' r f + {-# INLINE modifyRef' #-}+++instance Ref (SR.STRef s) where+ type RefM (SR.STRef s) = ST s + newRef a = SR.newSTRef a + {-# INLINE newRef #-}+ newRef' !a = SR.newSTRef $! a + {-# INLINE newRef' #-}+ readRef a = SR.readSTRef a+ {-# INLINE readRef #-}+ readRef' !r = SR.readSTRef $! r + {-# INLINE readRef' #-}+ writeRef r a = SR.writeSTRef r a + {-# INLINE writeRef #-} + writeRef' !r !a =SR.writeSTRef r $! a + {-# INLINE writeRef' #-}+ modifyRef r f = SR.modifySTRef r f + {-# INLINE modifyRef #-}+ modifyRef' r f = SR.modifySTRef' r f + {-# INLINE modifyRef' #-}+++