Skip to content

Commit 7138d83

Browse files
committed
Merge pull request #1 from cryogenian/master
Extracted from purescript-argonaut
2 parents 7d205c6 + ee2726a commit 7138d83

File tree

13 files changed

+605
-0
lines changed

13 files changed

+605
-0
lines changed

.gitignore

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/.*
2+
!/.gitignore
3+
!/.travis.yml
4+
bower_components/
5+
node_modules/
6+
output/
7+
dist/
8+
npm-debug.log

.travis.yml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
language: node_js
2+
node_js:
3+
- 0.10
4+
env:
5+
- TAG=v0.7.0
6+
install:
7+
- wget -O $HOME/purescript.tar.gz https://github.com/purescript/purescript/releases/download/$TAG/linux64.tar.gz
8+
- sudo tar zxvf $HOME/purescript.tar.gz -C /usr/local/bin purescript/psc{,i,-docs,-bundle} --strip-components=1
9+
- sudo chmod a+x /usr/local/bin/psc{,i,-docs,-bundle}
10+
- npm install bower gulp -g
11+
- npm install && bower install
12+
script:
13+
- gulp test

README.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,17 @@
1+
[![Build Status](https://travis-ci.org/purescript-contrib/purescript-argonaut-codecs.svg?branch=master)](https://travis-ci.org/purescript-contrib/purescript-argonaut-codecs)
2+
13
# purescript-argonaut-codecs
4+
5+
`EncodeJson` and `DecodeJson` classes and instances for __purescript-argonaut__. Also useful combinators for encoding ando decoding stuff.
6+
7+
## Installation
8+
9+
```shell
10+
bower install purescript-argonaut-codecs
11+
```
12+
13+
## Documentaion
14+
15+
- [Data.Argonaut.Encode](docs/Data/Argonaut/Encode.md)
16+
- [Data.Argonaut.Decode](docs/Data/Argonaut/Decode.md)
17+
- [Data.Argonaut.Combinators](docs/Data/Argonaut/Combinators.md)

bower.json

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
{
2+
"name": "purescript-argonaut-codecs",
3+
"homepage": "https://github.com/purescript-contrib/purescript-argonaut-codecs",
4+
"authors": [
5+
"Maxim Zimaliev <[email protected]>",
6+
"Hardy Jones <>",
7+
"John A. De Goes <[email protected]>"
8+
],
9+
"description": "Codecs for purescript argonaut",
10+
"keywords": [
11+
"purescript",
12+
"json",
13+
"argonaut",
14+
"encode",
15+
"decode",
16+
"codec",
17+
"combinators"
18+
],
19+
"license": "MIT",
20+
"dependencies": {
21+
"purescript-argonaut-core": "~0.1.0",
22+
"purescript-maybe": "~0.3.2",
23+
"purescript-either": "~0.2.0",
24+
"purescript-arrays": "~0.4.0",
25+
"purescript-strings": "~0.5.3",
26+
"purescript-lists": "~0.7.0",
27+
"purescript-maps": "~0.4.0",
28+
"purescript-foldable-traversable": "~0.4.0",
29+
"purescript-unfoldable": "~0.4.0",
30+
"purescript-tuples": "~0.4.0",
31+
"purescript-control": "~0.3.0"
32+
},
33+
"devDependencies": {
34+
"purescript-eff": "~0.1.0",
35+
"purescript-console": "~0.1.0",
36+
"purescript-strongcheck": "~0.10.0"
37+
}
38+
}

docs/Data/Argonaut/Combinators.md

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
## Module Data.Argonaut.Combinators
2+
3+
#### `(:=)`
4+
5+
``` purescript
6+
(:=) :: forall a. (EncodeJson a) => String -> a -> JAssoc
7+
```
8+
9+
_non-associative / precedence 7_
10+
11+
#### `(~>)`
12+
13+
``` purescript
14+
(~>) :: forall a. (EncodeJson a) => JAssoc -> a -> Json
15+
```
16+
17+
_right-associative / precedence 6_
18+
19+
#### `(?>>=)`
20+
21+
``` purescript
22+
(?>>=) :: forall a b. Maybe a -> String -> Either String a
23+
```
24+
25+
_left-associative / precedence 1_
26+
27+
#### `(.?)`
28+
29+
``` purescript
30+
(.?) :: forall a. (DecodeJson a) => JObject -> String -> Either String a
31+
```
32+
33+
_non-associative / precedence 7_
34+
35+

docs/Data/Argonaut/Decode.md

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
## Module Data.Argonaut.Decode
2+
3+
#### `DecodeJson`
4+
5+
``` purescript
6+
class DecodeJson a where
7+
decodeJson :: Json -> Either String a
8+
```
9+
10+
##### Instances
11+
``` purescript
12+
instance decodeJsonMaybe :: (DecodeJson a) => DecodeJson (Maybe a)
13+
instance decodeJsonTuple :: (DecodeJson a, DecodeJson b) => DecodeJson (Tuple a b)
14+
instance decodeJsonEither :: (DecodeJson a, DecodeJson b) => DecodeJson (Either a b)
15+
instance decodeJsonNull :: DecodeJson Unit
16+
instance decodeJsonBoolean :: DecodeJson Boolean
17+
instance decodeJsonNumber :: DecodeJson Number
18+
instance decodeJsonInt :: DecodeJson Int
19+
instance decodeJsonString :: DecodeJson String
20+
instance decodeJsonJson :: DecodeJson Json
21+
instance decodeJsonChar :: DecodeJson Char
22+
instance decodeStrMap :: (DecodeJson a) => DecodeJson (StrMap a)
23+
instance decodeArray :: (DecodeJson a) => DecodeJson (Array a)
24+
instance decodeList :: (DecodeJson a) => DecodeJson (List a)
25+
instance decodeMap :: (Ord a, DecodeJson a, DecodeJson b) => DecodeJson (Map a b)
26+
```
27+
28+
#### `decodeMaybe`
29+
30+
``` purescript
31+
decodeMaybe :: forall a. (DecodeJson a) => Json -> Maybe a
32+
```
33+
34+

docs/Data/Argonaut/Encode.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
## Module Data.Argonaut.Encode
2+
3+
#### `EncodeJson`
4+
5+
``` purescript
6+
class EncodeJson a where
7+
encodeJson :: a -> Json
8+
```
9+
10+
##### Instances
11+
``` purescript
12+
instance encodeJsonMaybe :: (EncodeJson a) => EncodeJson (Maybe a)
13+
instance encodeJsonTuple :: (EncodeJson a, EncodeJson b) => EncodeJson (Tuple a b)
14+
instance encodeJsonEither :: (EncodeJson a, EncodeJson b) => EncodeJson (Either a b)
15+
instance encodeJsonUnit :: EncodeJson Unit
16+
instance encodeJsonJBoolean :: EncodeJson Boolean
17+
instance encodeJsonJNumber :: EncodeJson Number
18+
instance encodeJsonInt :: EncodeJson Int
19+
instance encodeJsonJString :: EncodeJson String
20+
instance encodeJsonJson :: EncodeJson Json
21+
instance encodeJsonChar :: EncodeJson Char
22+
instance encodeJsonArray :: (EncodeJson a) => EncodeJson (Array a)
23+
instance encodeJsonList :: (EncodeJson a) => EncodeJson (List a)
24+
instance encodeStrMap :: (EncodeJson a) => EncodeJson (StrMap a)
25+
instance encodeMap :: (Ord a, EncodeJson a, EncodeJson b) => EncodeJson (Map a b)
26+
```
27+
28+

gulpfile.js

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
'use strict'
2+
3+
4+
var gulp = require('gulp')
5+
, purescript = require('gulp-purescript')
6+
, run = require('gulp-run')
7+
, runSequence = require('run-sequence')
8+
;
9+
10+
function sequence() {
11+
var args = [].slice.apply(arguments);
12+
return function() {
13+
runSequence.apply(null, args);
14+
};
15+
}
16+
17+
var sources = [
18+
'src/**/*.purs',
19+
'bower_components/purescript-*/src/**/*.purs'
20+
];
21+
22+
var foreigns = [
23+
'src/**/*.js',
24+
'bower_components/purescript-*/src/**/*.js'
25+
];
26+
27+
var testSources = [
28+
'test/**/*.purs'
29+
];
30+
31+
var testForeigns = [
32+
'test/**/*.js'
33+
];
34+
35+
gulp.task('docs', function() {
36+
return purescript.pscDocs({
37+
src: sources,
38+
docgen: {
39+
"Data.Argonaut.Encode": "docs/Data/Argonaut/Encode.md",
40+
"Data.Argonaut.Decode": "docs/Data/Argonaut/Decode.md",
41+
"Data.Argonaut.Combinators": "docs/Data/Argonaut/Combinators.md"
42+
}
43+
});
44+
});
45+
46+
47+
gulp.task('make', function() {
48+
return purescript.psc({
49+
src: sources,
50+
ffi: foreigns
51+
});
52+
});
53+
54+
gulp.task('test-make', function() {
55+
return purescript.psc({
56+
src: sources.concat(testSources),
57+
ffi: foreigns.concat(testForeigns)
58+
});
59+
});
60+
61+
gulp.task('test', ['test-make'], function() {
62+
return purescript.pscBundle({
63+
src: "output/**/*.js",
64+
main: "Test.Main",
65+
output: "dist/test.js"
66+
}).pipe(run('node dist/test.js'));
67+
});
68+
69+
70+
gulp.task("default", sequence("make", "docs"));

package.json

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"name": "purescript-argonaut-codecs",
3+
"description": "Codecs for purescript-argonaut library",
4+
"license": "MIT",
5+
"dependencies": {
6+
"gulp": "^3.9.0",
7+
"gulp-purescript": "^0.5.0",
8+
"gulp-run": "^1.6.8",
9+
"run-sequence": "^1.1.1"
10+
}
11+
}

src/Data/Argonaut/Combinators.purs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
module Data.Argonaut.Combinators
2+
( (:=)
3+
, (~>)
4+
, (?>>=)
5+
, (.?)
6+
) where
7+
8+
import Prelude
9+
10+
import Data.Argonaut.Core
11+
( foldJsonObject
12+
, fromObject
13+
, jsonSingletonObject
14+
, Json()
15+
, JAssoc()
16+
, JObject()
17+
)
18+
import Data.Argonaut.Encode (encodeJson, EncodeJson)
19+
import Data.Argonaut.Decode (DecodeJson, decodeJson)
20+
import Data.Either (Either(..))
21+
import Data.Maybe (Maybe(..), maybe)
22+
import Data.Tuple (Tuple(..))
23+
24+
import qualified Data.StrMap as M
25+
26+
infix 7 :=
27+
infix 7 .?
28+
infixr 6 ~>
29+
infixl 1 ?>>=
30+
31+
(:=) :: forall a. (EncodeJson a) => String -> a -> JAssoc
32+
(:=) k v = Tuple k $ encodeJson v
33+
34+
(~>) :: forall a. (EncodeJson a) => JAssoc -> a -> Json
35+
(~>) (Tuple k v) a = foldJsonObject (jsonSingletonObject k v) (M.insert k v >>> fromObject) (encodeJson a)
36+
37+
(?>>=) :: forall a b. Maybe a -> String -> Either String a
38+
(?>>=) (Just x) _ = Right x
39+
(?>>=) _ str = Left $ "Couldn't decode " ++ str
40+
41+
-- obj .? "foo"
42+
(.?) :: forall a. (DecodeJson a) => JObject -> String -> Either String a
43+
(.?) o s = maybe (Left $ "Expected field " ++ show s) decodeJson (M.lookup s o)

0 commit comments

Comments
 (0)