1 | lenses = require './agson/lenses'
|
2 | traversals = require './agson/traversals'
|
3 | combinators = require './agson/combinators'
|
4 |
|
5 | liftThen = (lensf) -> (args...) ->
|
6 | if @lens is lenses.identity
|
7 | new AgsonQuery lensf args...
|
8 | else
|
9 | new AgsonQuery @lens.then lensf args...
|
10 |
|
11 | run = (f) -> (args...) ->
|
12 | run: (data) =>
|
13 | f(@lens.run(data))(args...)
|
14 |
|
15 |
|
16 | class AgsonQuery
|
17 |
|
18 | constructor: (@lens) ->
|
19 | toString: ->
|
20 | "agson(#{@lens.toString()})"
|
21 |
|
22 | then: (query) ->
|
23 | new AgsonQuery @lens.then query.lens
|
24 |
|
25 | selectMany: (key) ->
|
26 | new AgsonQuery @lens.then lenses.property(key).then traversals.list
|
27 |
|
28 | list: liftThen -> traversals.list
|
29 | object: liftThen -> traversals.object
|
30 | property: liftThen lenses.property
|
31 | index: liftThen lenses.property
|
32 |
|
33 | where: liftThen (predicate) ->
|
34 | combinators.where (ma) ->
|
35 | ma.map(predicate).getOrElse false
|
36 |
|
37 | recurse: ->
|
38 | lens = @lens.then traversals.recurse -> lens
|
39 | new AgsonQuery lens
|
40 |
|
41 | get: run (s) -> -> s.get()
|
42 | set: run (s) -> (v) -> s.set v
|
43 | map: run (s) -> (f) -> s.map f
|
44 |
|
45 | module.exports = new AgsonQuery lenses.identity
|