diff --git a/.gitignore b/.gitignore index 7050558..332b6cf 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ /bower_components/ /node_modules/ /output/ +package-lock.json diff --git a/LICENSE b/LICENSE index 58b0299..311379c 100644 --- a/LICENSE +++ b/LICENSE @@ -1,20 +1,26 @@ -The MIT License (MIT) +Copyright 2018 PureScript -Copyright (c) 2014 PureScript +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +2. 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. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +3. Neither the name of the copyright holder nor the names of its 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 HOLDER 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. diff --git a/bower.json b/bower.json index a4b8090..f50e6e4 100644 --- a/bower.json +++ b/bower.json @@ -1,8 +1,7 @@ { "name": "purescript-refs", "homepage": "https://github.com/purescript/purescript-refs", - "description": "Mutable value references", - "license": "MIT", + "license": "BSD-3-Clause", "repository": { "type": "git", "url": "git://github.com/purescript/purescript-refs.git" @@ -17,6 +16,7 @@ "package.json" ], "dependencies": { - "purescript-eff": "^3.0.0" + "purescript-effect": "^2.0.0", + "purescript-prelude": "^4.0.0" } } diff --git a/package.json b/package.json index 26d81a7..02e36ea 100644 --- a/package.json +++ b/package.json @@ -5,9 +5,9 @@ "build": "eslint src && pulp build -- --censor-lib --strict" }, "devDependencies": { - "eslint": "^3.17.1", - "pulp": "^10.0.4", - "purescript-psa": "^0.5.0-rc.1", - "rimraf": "^2.6.1" + "eslint": "^4.19.1", + "pulp": "^12.2.0", + "purescript-psa": "^0.6.0", + "rimraf": "^2.6.2" } } diff --git a/src/Control/Monad/Eff/Ref.purs b/src/Control/Monad/Eff/Ref.purs deleted file mode 100644 index 09a4ae6..0000000 --- a/src/Control/Monad/Eff/Ref.purs +++ /dev/null @@ -1,35 +0,0 @@ --- | This module defines an effect and actions for working with --- | global mutable variables. --- | --- | _Note_: The `Control.Monad.ST` provides a _safe_ alternative --- | to global mutable variables when mutation is restricted to a --- | local scope. -module Control.Monad.Eff.Ref where - -import Prelude (Unit, unit) -import Control.Monad.Eff (Eff, kind Effect) - --- | The effect associated with the use of global mutable variables. -foreign import data REF :: Effect - --- | A value of type `Ref a` represents a mutable reference --- | which holds a value of type `a`. -foreign import data Ref :: Type -> Type - --- | Create a new mutable reference containing the specified value. -foreign import newRef :: forall s r. s -> Eff (ref :: REF | r) (Ref s) - --- | Read the current value of a mutable reference -foreign import readRef :: forall s r. Ref s -> Eff (ref :: REF | r) s - --- | Update the value of a mutable reference by applying a function --- | to the current value. -foreign import modifyRef' :: forall s b r. Ref s -> (s -> { state :: s, value :: b }) -> Eff (ref :: REF | r) b - --- | Update the value of a mutable reference by applying a function --- | to the current value. -modifyRef :: forall s r. Ref s -> (s -> s) -> Eff (ref :: REF | r) Unit -modifyRef ref f = modifyRef' ref (\s -> { state: f s, value: unit }) - --- | Update the value of a mutable reference to the specified value. -foreign import writeRef :: forall s r. Ref s -> s -> Eff (ref :: REF | r) Unit diff --git a/src/Control/Monad/Eff/Ref/Unsafe.purs b/src/Control/Monad/Eff/Ref/Unsafe.purs deleted file mode 100644 index fec0c3d..0000000 --- a/src/Control/Monad/Eff/Ref/Unsafe.purs +++ /dev/null @@ -1,16 +0,0 @@ --- | Unsafe functions for working with mutable references. - -module Control.Monad.Eff.Ref.Unsafe where - -import Control.Monad.Eff (Eff) -import Control.Monad.Eff.Ref (REF) -import Control.Monad.Eff.Unsafe (unsafeCoerceEff) - --- | This handler function unsafely removes the `Ref` effect from an --- | effectful action. --- | --- | This function might be used when it is impossible to prove to the --- | typechecker that a particular mutable reference does not escape --- | its scope. -unsafeRunRef :: forall eff a. Eff (ref :: REF | eff) a -> Eff eff a -unsafeRunRef = unsafeCoerceEff diff --git a/src/Control/Monad/Eff/Ref.js b/src/Effect/Ref.js similarity index 62% rename from src/Control/Monad/Eff/Ref.js rename to src/Effect/Ref.js index f42e7e5..4bcefd0 100644 --- a/src/Control/Monad/Eff/Ref.js +++ b/src/Effect/Ref.js @@ -1,19 +1,19 @@ "use strict"; -exports.newRef = function (val) { +exports.new = function (val) { return function () { return { value: val }; }; }; -exports.readRef = function (ref) { +exports.read = function (ref) { return function () { return ref.value; }; }; -exports["modifyRef'"] = function (ref) { - return function (f) { +exports["modify'"] = function (f) { + return function (ref) { return function () { var t = f(ref.value); ref.value = t.state; @@ -22,8 +22,8 @@ exports["modifyRef'"] = function (ref) { }; }; -exports.writeRef = function (ref) { - return function (val) { +exports.write = function (val) { + return function (ref) { return function () { ref.value = val; return {}; diff --git a/src/Effect/Ref.purs b/src/Effect/Ref.purs new file mode 100644 index 0000000..edc1f8e --- /dev/null +++ b/src/Effect/Ref.purs @@ -0,0 +1,33 @@ +-- | This module defines an effect and actions for working with +-- | global mutable variables. +-- | +-- | _Note_: `Control.Monad.ST` provides a _safe_ alternative +-- | to global mutable variables when mutation is restricted to a +-- | local scope. +module Effect.Ref where + +import Prelude + +import Effect (Effect) + +-- | A value of type `Ref a` represents a mutable reference +-- | which holds a value of type `a`. +foreign import data Ref :: Type -> Type + +-- | Create a new mutable reference containing the specified value. +foreign import new :: forall s. s -> Effect (Ref s) + +-- | Read the current value of a mutable reference +foreign import read :: forall s. Ref s -> Effect s + +-- | Update the value of a mutable reference by applying a function +-- | to the current value. +foreign import modify' :: forall s b. (s -> { state :: s, value :: b }) -> Ref s -> Effect b + +-- | Update the value of a mutable reference by applying a function +-- | to the current value. The updated value is returned. +modify :: forall s. (s -> s) -> Ref s -> Effect s +modify f = modify' \s -> let s' = f s in { state: s', value: s' } + +-- | Update the value of a mutable reference to the specified value. +foreign import write :: forall s. s -> Ref s -> Effect Unit