jsedn
Version:
js implementation of edn
167 lines (126 loc) • 2.86 kB
text/coffeescript
type = require "./type"
equals = require "equals"
{Prim} = require "./atoms"
{encode} = require "./encode"
class Iterable extends Prim
hashId: ->
ednEncode: ->
( (i) -> encode i).val.join " "
jsonEncode: ->
( (i) -> if i.jsonEncode? then i.jsonEncode() else i)
jsEncode: ->
( (i) -> if i?.jsEncode? then i.jsEncode() else i).val
exists: (index) ->
[index]?
each: (iter) ->
(iter i for i in )
map: (iter) ->
iter
walk: (iter) ->
(i) ->
if i.walk? and type(i.walk) is "function"
i.walk iter
else
iter i
at: (index) ->
if index then [index]
set: (index, val) ->
[index] = val
this
class List extends Iterable
ednEncode: ->
"(#{super()})"
jsonEncode: ->
List: super()
map: (iter) ->
new List iter
class Vector extends Iterable
ednEncode: ->
"[#{super()}]"
jsonEncode: ->
Vector: super()
map: (iter) ->
new Vector iter
class Set extends Iterable
ednEncode: ->
"\#{#{super()}}"
jsonEncode: ->
Set: super()
constructor: (val) ->
super()
= []
for item in val
if item in
throw "set not distinct"
else
.push item
map: (iter) ->
new Set iter
class Pair
constructor: (, ) ->
class Map
hashId: ->
ednEncode: ->
"{#{(encode i for i in @value()).join " "}}"
jsonEncode: ->
{Map: ((if i.jsonEncode? then i.jsonEncode() else i) for i in )}
jsEncode: ->
result = {}
for k, i in
hashId = if k?.hashId? then k.hashId() else k
result[hashId] = if [i]?.jsEncode? then [i].jsEncode() else [i]
result
constructor: ( = []) ->
if .length and .length % 2 isnt 0
throw "Map accepts an array with an even number of items. You provided #{@val.length} items"
= []
= []
for v, i in
if i % 2 is 0
.push v
else
.push v
= false
value: ->
result = []
for v, i in
result.push v
if [i] isnt undefined then result.push [i]
result
indexOf: (key) ->
for k, i in
if equals k, key
return i
return undefined
exists: (key) ->
?
at: (key) ->
if (id = key)?
[id]
else
throw "key does not exist"
set: (key, val) ->
if (id = key)?
[id] = val
else
.push key
.push val
this
each: (iter) ->
((iter ( k), k) for k in )
map: (iter) ->
result = new Map
(v, k) ->
nv = iter v, k
if nv instanceof Pair then [k, nv] = [nv.key, nv.val]
result.set k, nv
result
walk: (iter) ->
(v, k) ->
if type(v.walk) is "function"
iter (v.walk iter), k
else
iter v, k
module.exports = {Iterable, List, Vector, Set, Pair, Map}