packages feed

Ref (empty) → 0.1.0.0

raw patch · 4 files changed

+181/−0 lines, 4 filesdep +basesetup-changed

Dependencies added: base

Files

+ 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' #-}+++