From 1e2a248b8a8ac060174fa58c3b6f120969894b5d Mon Sep 17 00:00:00 2001 From: rightfold Date: Wed, 25 Jan 2017 11:17:36 +0100 Subject: [PATCH 1/3] Fix hasOwnProperty bug again and forever --- src/Data/StrMap.js | 18 +++++++++--------- test/Test/Data/StrMap.purs | 3 ++- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/Data/StrMap.js b/src/Data/StrMap.js index 2213c184..c3a27169 100644 --- a/src/Data/StrMap.js +++ b/src/Data/StrMap.js @@ -6,7 +6,7 @@ exports._copy = function (m) { var r = {}; for (var k in m) { - if (m.hasOwnProperty(k)) { + if ({}.hasOwnProperty.call(m, k)) { r[k] = m[k]; } } @@ -17,7 +17,7 @@ exports._copyEff = function (m) { return function () { var r = {}; for (var k in m) { - if (m.hasOwnProperty(k)) { + if ({}.hasOwnProperty.call(m, k)) { r[k] = m[k]; } } @@ -35,7 +35,7 @@ exports.runST = function (f) { exports._fmapStrMap = function (m0, f) { var m = {}; for (var k in m0) { - if (m0.hasOwnProperty(k)) { + if ({}.hasOwnProperty.call(m0, k)) { m[k] = f(m0[k]); } } @@ -46,7 +46,7 @@ exports._fmapStrMap = function (m0, f) { exports._mapWithKey = function (m0, f) { var m = {}; for (var k in m0) { - if (m0.hasOwnProperty(k)) { + if ({}.hasOwnProperty.call(m0, k)) { m[k] = f(k)(m0[k]); } } @@ -65,7 +65,7 @@ exports._foldM = function (bind) { }; } for (var k in m) { - if (m.hasOwnProperty(k)) { + if ({}.hasOwnProperty.call(m, k)) { acc = bind(acc)(g(k)); } } @@ -78,7 +78,7 @@ exports._foldM = function (bind) { // jshint maxparams: 4 exports._foldSCStrMap = function (m, z, f, fromMaybe) { for (var k in m) { - if (m.hasOwnProperty(k)) { + if ({}.hasOwnProperty.call(m, k)) { var maybeR = f(z)(k)(m[k]); var r = fromMaybe(null)(maybeR); if (r === null) return z; @@ -92,7 +92,7 @@ exports._foldSCStrMap = function (m, z, f, fromMaybe) { exports.all = function (f) { return function (m) { for (var k in m) { - if (m.hasOwnProperty(k) && !f(k)(m[k])) return false; + if ({}.hasOwnProperty.call(m, k) && !f(k)(m[k])) return false; } return true; }; @@ -101,7 +101,7 @@ exports.all = function (f) { exports.size = function (m) { var s = 0; for (var k in m) { - if (m.hasOwnProperty(k)) { + if ({}.hasOwnProperty.call(m, k)) { ++s; } } @@ -130,7 +130,7 @@ function _collect(f) { return function (m) { var r = []; for (var k in m) { - if (m.hasOwnProperty(k)) { + if ({}.hasOwnProperty.call(m, k)) { r.push(f(k)(m[k])); } } diff --git a/test/Test/Data/StrMap.purs b/test/Test/Data/StrMap.purs index 33acb595..303971d2 100644 --- a/test/Test/Data/StrMap.purs +++ b/test/Test/Data/StrMap.purs @@ -34,7 +34,8 @@ instance showInstruction :: (Show k, Show v) => Show (Instruction k v) where instance arbInstruction :: (Arbitrary v) => Arbitrary (Instruction String v) where arbitrary = do b <- arbitrary - k <- arbitrary + kIshasOwnProperty <- (&&) <$> arbitrary <*> arbitrary + k <- if kIshasOwnProperty then pure "hasOwnProperty" else arbitrary case b of true -> do v <- arbitrary From 4c5c4a1481977b614283710f8ae7a3526ea64e52 Mon Sep 17 00:00:00 2001 From: rightfold Date: Wed, 25 Jan 2017 13:13:45 +0100 Subject: [PATCH 2/3] Cache {}.hasOwnProperty --- src/Data/StrMap.js | 26 ++++++++------------------ src/Data/StrMap.purs | 2 -- 2 files changed, 8 insertions(+), 20 deletions(-) diff --git a/src/Data/StrMap.js b/src/Data/StrMap.js index c3a27169..0b1255a8 100644 --- a/src/Data/StrMap.js +++ b/src/Data/StrMap.js @@ -3,21 +3,11 @@ // module Data.StrMap -exports._copy = function (m) { - var r = {}; - for (var k in m) { - if ({}.hasOwnProperty.call(m, k)) { - r[k] = m[k]; - } - } - return r; -}; - exports._copyEff = function (m) { return function () { var r = {}; for (var k in m) { - if ({}.hasOwnProperty.call(m, k)) { + if (hasOwnProperty.call(m, k)) { r[k] = m[k]; } } @@ -35,7 +25,7 @@ exports.runST = function (f) { exports._fmapStrMap = function (m0, f) { var m = {}; for (var k in m0) { - if ({}.hasOwnProperty.call(m0, k)) { + if (hasOwnProperty.call(m0, k)) { m[k] = f(m0[k]); } } @@ -46,7 +36,7 @@ exports._fmapStrMap = function (m0, f) { exports._mapWithKey = function (m0, f) { var m = {}; for (var k in m0) { - if ({}.hasOwnProperty.call(m0, k)) { + if (hasOwnProperty.call(m0, k)) { m[k] = f(k)(m0[k]); } } @@ -65,7 +55,7 @@ exports._foldM = function (bind) { }; } for (var k in m) { - if ({}.hasOwnProperty.call(m, k)) { + if (hasOwnProperty.call(m, k)) { acc = bind(acc)(g(k)); } } @@ -78,7 +68,7 @@ exports._foldM = function (bind) { // jshint maxparams: 4 exports._foldSCStrMap = function (m, z, f, fromMaybe) { for (var k in m) { - if ({}.hasOwnProperty.call(m, k)) { + if (hasOwnProperty.call(m, k)) { var maybeR = f(z)(k)(m[k]); var r = fromMaybe(null)(maybeR); if (r === null) return z; @@ -92,7 +82,7 @@ exports._foldSCStrMap = function (m, z, f, fromMaybe) { exports.all = function (f) { return function (m) { for (var k in m) { - if ({}.hasOwnProperty.call(m, k) && !f(k)(m[k])) return false; + if (hasOwnProperty.call(m, k) && !f(k)(m[k])) return false; } return true; }; @@ -101,7 +91,7 @@ exports.all = function (f) { exports.size = function (m) { var s = 0; for (var k in m) { - if ({}.hasOwnProperty.call(m, k)) { + if (hasOwnProperty.call(m, k)) { ++s; } } @@ -130,7 +120,7 @@ function _collect(f) { return function (m) { var r = []; for (var k in m) { - if ({}.hasOwnProperty.call(m, k)) { + if (hasOwnProperty.call(m, k)) { r.push(f(k)(m[k])); } } diff --git a/src/Data/StrMap.purs b/src/Data/StrMap.purs index c47ceef7..5f2c9dae 100644 --- a/src/Data/StrMap.purs +++ b/src/Data/StrMap.purs @@ -56,8 +56,6 @@ import Data.Unfoldable (class Unfoldable) -- | `StrMap a` represents a map from `String`s to values of type `a`. foreign import data StrMap :: * -> * -foreign import _copy :: forall a. StrMap a -> StrMap a - foreign import _copyEff :: forall a b h r. a -> Eff (st :: ST.ST h | r) b -- | Convert an immutable map into a mutable map From 3379032f380a47ad2e463f8c385e5c1495002707 Mon Sep 17 00:00:00 2001 From: rightfold Date: Wed, 25 Jan 2017 17:53:28 +0100 Subject: [PATCH 3/3] Use frequency instead of random Boolean --- test/Test/Data/StrMap.purs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test/Test/Data/StrMap.purs b/test/Test/Data/StrMap.purs index 303971d2..6eaab4db 100644 --- a/test/Test/Data/StrMap.purs +++ b/test/Test/Data/StrMap.purs @@ -19,6 +19,7 @@ import Partial.Unsafe (unsafePartial) import Test.QuickCheck ((), quickCheck, quickCheck', (===)) import Test.QuickCheck.Arbitrary (class Arbitrary, arbitrary) +import Test.QuickCheck.Gen as Gen newtype TestStrMap v = TestStrMap (M.StrMap v) @@ -34,8 +35,8 @@ instance showInstruction :: (Show k, Show v) => Show (Instruction k v) where instance arbInstruction :: (Arbitrary v) => Arbitrary (Instruction String v) where arbitrary = do b <- arbitrary - kIshasOwnProperty <- (&&) <$> arbitrary <*> arbitrary - k <- if kIshasOwnProperty then pure "hasOwnProperty" else arbitrary + k <- Gen.frequency (Tuple 10.0 (pure "hasOwnProperty")) + (Tuple 50.0 arbitrary `Cons` Nil) case b of true -> do v <- arbitrary