Skip to content

Commit

Permalink
feat: suppport mapping objects
Browse files Browse the repository at this point in the history
  • Loading branch information
kantord committed Jul 9, 2019
1 parent a8bd276 commit 2928947
Show file tree
Hide file tree
Showing 5 changed files with 331 additions and 19 deletions.
7 changes: 6 additions & 1 deletion docs/functions.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,12 @@ Output:
[{"word": "Hello"}, {"word": "World!"}]
```

Alternatively, you can also use this syntax: `["Hello", "World!"] | map \ {"word": $}`
For mapping objects, use a curried function:

```
{ "Joe": 13, "Marie": 14 } | map ($key => $value => "Age of " + $key : $value)
```


## sortBy \

Expand Down
266 changes: 266 additions & 0 deletions src/__tests__/__snapshots__/interpreter.test.js.snap
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,8 @@ exports[`interpreter correct target code {
}
} 1`] = `"(function(_) { return (function(input) { return (_.objectify(Array.from([[\\"foo\\",Array.from([(-(42)), input])], [\\"bar\\",(_.objectify(Array.from([[\\"message\\",\\"Hello World\\"]])))]])))})})"`;
exports[`interpreter correct target code { "Joe": 13, "Marie": 14 } | map ($key => $value => "Age of " + $key : $value) 1`] = `"(function(_) { return (function(input) { return (function (input) {return _.map(((function(key) {_ = _.__assign__('key', key, _); return (function(value) {_ = _.__assign__('value', value, _); return [\\"Age of \\"+_.get('key'),_.get('value')]})})))(input)})((_.objectify(Array.from([[\\"Joe\\",13], [\\"Marie\\",14]]))))})})"`;
exports[`interpreter correct target code {"a": [2], "b": "b"} {
b
} 1`] = `"(function(_) { return (function(input) { return _.__objectProjection__((_.objectify(Array.from([[\\"a\\",Array.from([2])], [\\"b\\",\\"b\\"]]))), [{\\"type\\":\\"SimpleItem\\",\\"value\\":\\"b\\"}], false, _)})})"`;
Expand Down Expand Up @@ -228,6 +230,8 @@ exports[`interpreter correct target code map $ => {"original": $.foo} | map $=>
exports[`interpreter correct target code map $foo => [$foo] 1`] = `"(function(_) { return (function(input) { return _.map((function(foo) {_ = _.__assign__('foo', foo, _); return Array.from([_.get('foo')])}))(input)})})"`;
exports[`interpreter correct target code map ($key => $value => ($key + "_") : ("_" + $value)) 1`] = `"(function(_) { return (function(input) { return _.map(((function(key) {_ = _.__assign__('key', key, _); return (function(value) {_ = _.__assign__('value', value, _); return [(_.get('key')+\\"_\\"),(\\"_\\"+_.get('value'))]})})))(input)})})"`;
exports[`interpreter correct target code map \\" " 1`] = `"(function(_) { return (function(input) { return _.map((function(input) {return \\" \\"}))(input)})})"`;
exports[`interpreter correct target code null 1`] = `"(function(_) { return (function(input) { return null})})"`;
Expand Down Expand Up @@ -4551,6 +4555,153 @@ Object {
}
`;
exports[`interpreter correct target tree { "Joe": 13, "Marie": 14 } | map ($key => $value => "Age of " + $key : $value) 1`] = `
Object {
"status": true,
"value": Object {
"name": "pipe",
"value": Object {
"left": Object {
"end": Object {
"column": 27,
"line": 1,
"offset": 26,
},
"name": "object",
"start": Object {
"column": 1,
"line": 1,
"offset": 0,
},
"value": Array [
Object {
"end": Object {
"column": 26,
"line": 1,
"offset": 25,
},
"name": "simpleList",
"start": Object {
"column": 3,
"line": 1,
"offset": 2,
},
"value": Array [
Object {
"name": "tuple",
"value": Array [
Object {
"name": "primitive",
"value": "\\"Joe\\"",
},
Object {
"name": "primitive",
"value": "13",
},
],
},
Object {
"name": "tuple",
"value": Array [
Object {
"name": "primitive",
"value": "\\"Marie\\"",
},
Object {
"name": "primitive",
"value": "14",
},
],
},
],
},
],
},
"right": Object {
"name": "functionCall",
"value": Object {
"left": Object {
"name": "identifier",
"value": "map",
},
"right": Object {
"name": "parentheses",
"value": Object {
"end": Object {
"column": 78,
"line": 1,
"offset": 77,
},
"name": "lambda",
"start": Object {
"column": 35,
"line": 1,
"offset": 34,
},
"value": Object {
"definition": Object {
"end": Object {
"column": 78,
"line": 1,
"offset": 77,
},
"name": "lambda",
"start": Object {
"column": 43,
"line": 1,
"offset": 42,
},
"value": Object {
"definition": Object {
"name": "tuple",
"value": Array [
Object {
"name": "binaryOperation",
"value": Array [
Object {
"name": "primitive",
"value": "\\"Age of \\"",
},
Object {
"end": Object {
"column": 64,
"line": 1,
"offset": 63,
},
"name": "primitive",
"start": Object {
"column": 63,
"line": 1,
"offset": 62,
},
"value": "+",
},
Object {
"name": "variable",
"value": "$key",
},
],
},
Object {
"name": "variable",
"value": "$value",
},
],
},
"variable": "value",
},
},
"variable": "key",
},
},
},
},
},
},
},
}
`;
exports[`interpreter correct target tree {"a": [2], "b": "b"} {
b
} 1`] = `
Expand Down Expand Up @@ -7965,6 +8116,121 @@ Object {
}
`;
exports[`interpreter correct target tree map ($key => $value => ($key + "_") : ("_" + $value)) 1`] = `
Object {
"status": true,
"value": Object {
"name": "functionCall",
"value": Object {
"left": Object {
"name": "identifier",
"value": "map",
},
"right": Object {
"name": "parentheses",
"value": Object {
"end": Object {
"column": 53,
"line": 1,
"offset": 52,
},
"name": "lambda",
"start": Object {
"column": 6,
"line": 1,
"offset": 5,
},
"value": Object {
"definition": Object {
"end": Object {
"column": 53,
"line": 1,
"offset": 52,
},
"name": "lambda",
"start": Object {
"column": 14,
"line": 1,
"offset": 13,
},
"value": Object {
"definition": Object {
"name": "tuple",
"value": Array [
Object {
"name": "parentheses",
"value": Object {
"name": "binaryOperation",
"value": Array [
Object {
"name": "variable",
"value": "$key",
},
Object {
"end": Object {
"column": 31,
"line": 1,
"offset": 30,
},
"name": "primitive",
"start": Object {
"column": 30,
"line": 1,
"offset": 29,
},
"value": "+",
},
Object {
"name": "primitive",
"value": "\\"_\\"",
},
],
},
},
Object {
"name": "parentheses",
"value": Object {
"name": "binaryOperation",
"value": Array [
Object {
"name": "primitive",
"value": "\\"_\\"",
},
Object {
"end": Object {
"column": 45,
"line": 1,
"offset": 44,
},
"name": "primitive",
"start": Object {
"column": 44,
"line": 1,
"offset": 43,
},
"value": "+",
},
Object {
"name": "variable",
"value": "$value",
},
],
},
},
],
},
"variable": "value",
},
},
"variable": "key",
},
},
},
},
},
}
`;
exports[`interpreter correct target tree map \\" " 1`] = `
Object {
"status": true,
Expand Down
14 changes: 14 additions & 0 deletions src/__tests__/builtins.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -262,6 +262,20 @@ describe('built ins', () => {
expect(map(id)(['Hello', 'World'])).toEqual(['Hello', 'World'])
expect(map(foo)(['Hello', 'World'])).toEqual(['foo', 'foo'])
})

it('suppors mapping objects', () => {
// eslint-disable-next-line
const f = $key => $value => [$key[0], $value * -1]

const unmapped = {
foo: 3,
bar: 0
}
expect(map(f)(unmapped)).toEqual({
f: -3,
b: -0
})
})
})

describe('reduce', () => {
Expand Down
25 changes: 23 additions & 2 deletions src/__tests__/interpreter.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,7 @@ x`
},
{
sourceCode: `8 * 3.14 / 2`,
output: 8 * 3.14 / 2
output: (8 * 3.14) / 2
},
{
sourceCode: `8 + 3.14 * 2`,
Expand All @@ -193,7 +193,7 @@ x`
},
{
sourceCode: `8314 % 34 -3`,
output: 8314 % 34 - 3
output: (8314 % 34) - 3
},
{
sourceCode: `3 * 2 -1 <= -1.34 * 3`,
Expand Down Expand Up @@ -609,6 +609,27 @@ x`
bar: null
}
}
},
{
sourceCode: `map ($key => $value => ($key + "_") : ("_" + $value))`,
input: {
a: 'b',
c: 'd',
e: 'f'
},
output: {
a_: '_b',
c_: '_d',
e_: '_f'
}
},
{
sourceCode: `{ "Joe": 13, "Marie": 14 } | map ($key => $value => "Age of " + $key : $value)`,
input: null,
output: {
'Age of Joe': 13,
'Age of Marie': 14
}
}
]

Expand Down
Loading

0 comments on commit 2928947

Please sign in to comment.