fay-ref (empty) → 0.1.0.0
raw patch · 4 files changed
+91/−0 lines, 4 filesdep +fay-basesetup-changed
Dependencies added: fay-base
Files
- LICENSE +30/−0
- Setup.hs +2/−0
- fay-ref.cabal +23/−0
- src/FayRef.hs +36/−0
+ LICENSE view
@@ -0,0 +1,30 @@+Copyright (c) 2013, Andrew Miller++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 Chris Done 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.
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ fay-ref.cabal view
@@ -0,0 +1,23 @@+name: fay-ref+version: 0.1.0.0+synopsis: Like IORef but for Fay.+description: Like IORef but for Fay.+homepage: https://github.com/A1kmm/fay-ref+bug-reports: https://github.com/A1kmm/fay-ref/issues+license: BSD3+license-file: LICENSE+author: Andrew Miller+maintainer: Andrew Miller <andrew@amxl.com>+copyright: Andrew Miller+build-type: Simple+cabal-version: >=1.8+data-files: src/FayRef.hs+category: Fay+source-repository head+ type: git+ location: https://github.com/A1kmm/fay-ref++library+ hs-source-dirs: src+ exposed-modules: FayRef+ build-depends: fay-base >= 0.14.1.0
+ src/FayRef.hs view
@@ -0,0 +1,36 @@+{-# LANGUAGE PackageImports #-}+module FayRef (FayRef, newFayRef, readFayRef, writeFayRef, modifyFayRef,+ modifyFayRef') where++import Prelude+import FFI++-- |A mutable variable in the 'Fay' monad.+data FayRef a = FayRef++-- |Build a new 'FayRef'.+newFayRef :: a -> Fay (FayRef a)+newFayRef = ffi "{contents: %1}"++-- |Write a new value into a 'FayRef'.+readFayRef :: FayRef a -> Fay a+readFayRef = ffi "%1['contents']"++-- |Write a new value into a 'FayRef'.+writeFayRef :: FayRef a -> a -> Fay ()+writeFayRef = ffi "%1['contents']=%2"++-- |Mutate the contents of a 'FayRef'.+--+-- Be warned that 'modifyFayRef' does not apply the function strictly. This+-- means if the program calls 'modifyFayRef' many times, but seldomly uses the+-- value, thunks will pile up in memory resulting in a space leak.+modifyFayRef :: FayRef a -> (a -> a) -> Fay ()+modifyFayRef ref f = readFayRef ref >>= (writeFayRef ref . f)++-- |Strict version of 'modifyFayRef'+modifyFayRef' :: FayRef a -> (a -> a) -> Fay ()+modifyFayRef' ref f = do+ x <- readFayRef ref+ let x' = f x+ writeFayRef ref $! x'