diff --git a/.gitignore b/.gitignore index 307f9c0..e306283 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ /.* !/.gitignore +!/.jscsrc +!/.jshintrc !/.travis.yml /bower_components/ /node_modules/ diff --git a/.jscsrc b/.jscsrc new file mode 100644 index 0000000..2561ce9 --- /dev/null +++ b/.jscsrc @@ -0,0 +1,17 @@ +{ + "preset": "grunt", + "disallowSpacesInFunctionExpression": null, + "requireSpacesInFunctionExpression": { + "beforeOpeningRoundBrace": true, + "beforeOpeningCurlyBrace": true + }, + "disallowSpacesInAnonymousFunctionExpression": null, + "requireSpacesInAnonymousFunctionExpression": { + "beforeOpeningRoundBrace": true, + "beforeOpeningCurlyBrace": true + }, + "disallowSpacesInsideObjectBrackets": null, + "requireSpacesInsideObjectBrackets": "all", + "validateQuoteMarks": "\"", + "requireCurlyBraces": null +} diff --git a/.jshintrc b/.jshintrc new file mode 100644 index 0000000..81e6de7 --- /dev/null +++ b/.jshintrc @@ -0,0 +1,19 @@ +{ + "bitwise": true, + "eqeqeq": true, + "forin": true, + "freeze": true, + "funcscope": true, + "futurehostile": true, + "strict": "global", + "latedef": true, + "noarg": true, + "nocomma": true, + "nonew": true, + "notypeof": true, + "singleGroups": true, + "undef": true, + "unused": true, + "eqnull": true, + "predef": ["exports"] +} diff --git a/README.md b/README.md index fd962c8..b68c910 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,7 @@ # purescript-argonaut-core -[![Latest release](http://img.shields.io/bower/v/purescript-argonaut-core.svg)](https://github.com/purescript-contrib/purescript-argonaut-core/releases) +[![Latest release](http://img.shields.io/github/release/purescript-contrib/purescript-argonaut-core.svg)](https://github.com/purescript-contrib/purescript-argonaut-core/releases) [![Build Status](https://travis-ci.org/purescript-contrib/purescript-argonaut-core.svg?branch=master)](https://travis-ci.org/purescript-contrib/purescript-argonaut-core) -[![Dependency Status](https://www.versioneye.com/user/projects/563a993c1d47d40019000870/badge.svg?style=flat)](https://www.versioneye.com/user/projects/563a993c1d47d40019000870) [![Maintainer: slamdata](https://img.shields.io/badge/maintainer-slamdata-lightgrey.svg)](http://github.com/slamdata) Core part of `purescript-argonaut` that contains basic types for `Json`, folds over them, tests, printer and parser. diff --git a/bower.json b/bower.json index 8057a6c..cf59dfa 100644 --- a/bower.json +++ b/bower.json @@ -18,11 +18,11 @@ }, "license": "MIT", "dependencies": { - "purescript-enums": "^1.0.0", - "purescript-functions": "^1.0.0", - "purescript-maps": "^1.0.0" + "purescript-enums": "^2.0.0", + "purescript-functions": "^2.0.0", + "purescript-maps": "^2.0.0" }, "devDependencies": { - "purescript-strongcheck": "^1.0.0" + "purescript-strongcheck": "^2.0.0" } } diff --git a/package.json b/package.json index 1e0f657..703498c 100644 --- a/package.json +++ b/package.json @@ -2,13 +2,15 @@ "private": true, "scripts": { "clean": "rimraf output && rimraf .pulp-cache", - "build": "pulp build --censor-lib --strict", + "build": "jshint src && jscs src && pulp build --censor-lib --strict", "test": "pulp test" }, "devDependencies": { - "pulp": "^9.0.0", + "jscs": "^3.0.7", + "jshint": "^2.9.3", + "pulp": "^9.0.1", "purescript-psa": "^0.3.9", - "purescript": "^0.9.1", - "rimraf": "^2.5.0" + "purescript": "^0.10.1", + "rimraf": "^2.5.4" } } diff --git a/src/Data/Argonaut/Core.js b/src/Data/Argonaut/Core.js index 66ea53b..17f8d01 100644 --- a/src/Data/Argonaut/Core.js +++ b/src/Data/Argonaut/Core.js @@ -1,12 +1,11 @@ -// module Data.Argonaut.Core +"use strict"; function id(x) { - return x; + return x; } - -exports.fromNull = function() { - return null; +exports.fromNull = function () { + return null; }; exports.fromBoolean = id; @@ -17,104 +16,92 @@ exports.fromObject = id; exports.jsonNull = null; -exports.stringify = function(j) { - return JSON.stringify(j); +exports.stringify = function (j) { + return JSON.stringify(j); }; -exports._foldJson = function(isNull, isBool, isNum, isStr, isArr, isObj, j) { - if (j == null) return isNull(null); - else if (typeof j === 'boolean') return isBool(j); - else if (typeof j === 'number') return isNum(j); - else if (typeof j === 'string') return isStr(j); - else if (Object.prototype.toString.call(j) === '[object Array]') - return isArr(j); - else return isObj(j); +var objToString = Object.prototype.toString; +var objKeys = Object.keys; + +function isArray(a) { + return objToString.call(a) === "[object Array]"; +} + +exports._foldJson = function (isNull, isBool, isNum, isStr, isArr, isObj, j) { + if (j == null) return isNull(null); + else if (typeof j === "boolean") return isBool(j); + else if (typeof j === "number") return isNum(j); + else if (typeof j === "string") return isStr(j); + else if (objToString.call(j) === "[object Array]") + return isArr(j); + else return isObj(j); }; function _compare(EQ, GT, LT, a, b) { - function isArray(a) { - return Object.prototype.toString.call(a) === '[object Array]'; - } - function keys(o) { - var a = []; - for (var k in o) { - a.push(k); - } - return a; - } - - if (a == null) { - if (b == null) return EQ; - else return LT; - } else if (typeof a === 'boolean') { - if (typeof b === 'boolean') { - // boolean / boolean - if (a === b) return EQ; - else if (a == false) return LT; - else return GT; - } else if (b == null) return GT; - else return LT; - } else if (typeof a === 'number') { - if (typeof b === 'number') { - if (a === b) return EQ; - else if (a < b) return LT; - else return GT; - } else if (b == null) return GT; - else if (typeof b === 'boolean') return GT; - else return LT; - } else if (typeof a === 'string') { - if (typeof b === 'string') { - if (a === b) return EQ; - else if (a < b) return LT; - else return GT; - } else if (b == null) return GT; - else if (typeof b === 'boolean') return GT; - else if (typeof b === 'number') return GT; - else return LT; - } else if (isArray(a)) { - if (isArray(b)) { - for (var i = 0; i < Math.min(a.length, b.length); i++) { - var c = _compare(EQ, GT, LT, a[i], b[i]); - - if (c !== EQ) return c; - } - if (a.length === b.length) return EQ; - else if (a.length < b.length) return LT; - else return GT; - } else if (b == null) return GT; - else if (typeof b === 'boolean') return GT; - else if (typeof b === 'number') return GT; - else if (typeof b === 'string') return GT; - else return LT; - } + if (a == null) { + if (b == null) return EQ; + else return LT; + } else if (typeof a === "boolean") { + if (typeof b === "boolean") { + // boolean / boolean + if (a === b) return EQ; + else if (a === false) return LT; + else return GT; + } else if (b == null) return GT; + else return LT; + } else if (typeof a === "number") { + if (typeof b === "number") { + if (a === b) return EQ; + else if (a < b) return LT; + else return GT; + } else if (b == null) return GT; + else if (typeof b === "boolean") return GT; + else return LT; + } else if (typeof a === "string") { + if (typeof b === "string") { + if (a === b) return EQ; + else if (a < b) return LT; + else return GT; + } else if (b == null) return GT; + else if (typeof b === "boolean") return GT; + else if (typeof b === "number") return GT; + else return LT; + } else if (isArray(a)) { + if (isArray(b)) { + for (var i = 0; i < Math.min(a.length, b.length); i++) { + var ca = _compare(EQ, GT, LT, a[i], b[i]); + if (ca !== EQ) return ca; + } + if (a.length === b.length) return EQ; + else if (a.length < b.length) return LT; + else return GT; + } else if (b == null) return GT; + else if (typeof b === "boolean") return GT; + else if (typeof b === "number") return GT; + else if (typeof b === "string") return GT; + else return LT; + } else { + if (b == null) return GT; + else if (typeof b === "boolean") return GT; + else if (typeof b === "number") return GT; + else if (typeof b === "string") return GT; + else if (isArray(b)) return GT; else { - if (b == null) return GT; - else if (typeof b === 'boolean') return GT; - else if (typeof b === 'number') return GT; - else if (typeof b === 'string') return GT; - else if (isArray(b)) return GT; - else { - var akeys = keys(a); - var bkeys = keys(b); - - var keys = akeys.concat(bkeys).sort(); - - for (var i = 0; i < keys.length; i++) { - var k = keys[i]; - - if (a[k] === undefined) return LT; - else if (b[k] === undefined) return GT; - - var c = _compare(EQ, GT, LT, a[k], b[k]); - - if (c !== EQ) return c; - } - - if (akeys.length === bkeys.length) return EQ; - else if (akeys.length < bkeys.length) return LT; - else return GT; - } + var akeys = objKeys(a); + var bkeys = objKeys(b); + if (akeys.length < bkeys.length) return LT; + else if (akeys.length > bkeys.length) return GT; + var keys = akeys.concat(bkeys).sort(); + for (var j = 0; j < keys.length; j++) { + var k = keys[j]; + if (a[k] === undefined) return LT; + else if (b[k] === undefined) return GT; + var ck = _compare(EQ, GT, LT, a[k], b[k]); + if (ck !== EQ) return ck; + } + return EQ; } -}; + } +} exports._compare = _compare; diff --git a/src/Data/Argonaut/Core.purs b/src/Data/Argonaut/Core.purs index 4f91678..9869c22 100644 --- a/src/Data/Argonaut/Core.purs +++ b/src/Data/Argonaut/Core.purs @@ -88,10 +88,15 @@ foreign import data JNull :: * foreign import data Json :: * -- | Case analysis for `Json` values. See the README for more information. -foldJson :: forall a. - (JNull -> a) -> (JBoolean -> a) -> (JNumber -> a) -> - (JString -> a) -> (JArray -> a) -> (JObject -> a) -> - Json -> a +foldJson + :: forall a + . (JNull -> a) + -> (JBoolean -> a) + -> (JNumber -> a) + -> (JString -> a) + -> (JArray -> a) + -> (JObject -> a) + -> Json -> a foldJson a b c d e f json = runFn7 _foldJson a b c d e f json -- | A simpler version of `foldJson` which accepts a callback for when the @@ -153,8 +158,11 @@ isObject = isJsonType foldJsonObject -- Decoding -toJsonType :: forall a. (Maybe a -> (a -> Maybe a) -> Json -> Maybe a) -> - Json -> Maybe a +toJsonType + :: forall a + . (Maybe a -> (a -> Maybe a) -> Json -> Maybe a) + -> Json + -> Maybe a toJsonType = verbJsonType Nothing Just toNull :: Json -> Maybe JNull @@ -190,6 +198,7 @@ foreign import jsonNull :: Json jsonTrue :: Json jsonTrue = fromBoolean true + jsonFalse :: Json jsonFalse = fromBoolean false @@ -223,7 +232,7 @@ instance showJNull :: Show JNull where show _ = "null" instance eqJson :: Eq Json where - eq j1 j2 = (compare j1 j2) == EQ + eq j1 j2 = compare j1 j2 == EQ instance ordJson :: Ord Json where compare a b = runFn5 _compare EQ GT LT a b @@ -231,10 +240,18 @@ instance ordJson :: Ord Json where instance showJson :: Show Json where show = stringify --- Foreigns - foreign import stringify :: Json -> String -foreign import _foldJson :: forall z. Fn7 (JNull -> z) (JBoolean -> z) - (JNumber -> z) (JString -> z) (JArray -> z) - (JObject -> z) Json z + +foreign import _foldJson + :: forall z + . Fn7 + (JNull -> z) + (JBoolean -> z) + (JNumber -> z) + (JString -> z) + (JArray -> z) + (JObject -> z) + Json + z + foreign import _compare :: Fn5 Ordering Ordering Ordering Json Json Ordering diff --git a/src/Data/Argonaut/Parser.js b/src/Data/Argonaut/Parser.js index e48d568..ab6cf5b 100644 --- a/src/Data/Argonaut/Parser.js +++ b/src/Data/Argonaut/Parser.js @@ -1,10 +1,10 @@ -// module Data.Argonaut.Parser +"use strict"; -exports._jsonParser = function(fail, succ, s) { - try { - return succ(JSON.parse(s)); - } - catch(e) { - return fail(e.message); - } +exports._jsonParser = function (fail, succ, s) { + try { + return succ(JSON.parse(s)); + } + catch (e) { + return fail(e.message); + } }; diff --git a/test/Test/Main.js b/test/Test/Main.js index 8f17505..0c7f950 100644 --- a/test/Test/Main.js +++ b/test/Test/Main.js @@ -1,11 +1,9 @@ -// module Test.Main +"use strict"; exports.thisIsNull = null; exports.thisIsBoolean = true; exports.thisIsNumber = 12; exports.thisIsString = "foobar"; exports.thisIsArray = ["foo", "bar"]; -exports.thisIsObject = { - foo: "bar" -}; +exports.thisIsObject = { foo: "bar" }; exports.nil = null;