From 2239268d1d1af36538f3e358fa82c9ad7b3c641e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vojt=C4=9Bch=20Tranta?= Date: Tue, 24 Jan 2017 13:11:29 +0100 Subject: [PATCH] recognize iterable type by constructor reference for serialization --- src/serialize.js | 38 ++++++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/src/serialize.js b/src/serialize.js index dba8ac0..f23f5b2 100644 --- a/src/serialize.js +++ b/src/serialize.js @@ -133,11 +133,40 @@ function replaceRecord(rec, replaceChild) { return { "__record": rec._name, "data": recordData } } +function getIterableType(iterable) { + switch (iterable.constructor) { + case immutable.List: + return 'List' + + case immutable.Set: + return 'Set' + + case immutable.OrderedSet: + return 'OrderedSet' + + case immutable.Stack: + return 'Stack' + + case immutable.Map: + return 'Map' + + case immutable.OrderedMap: + return 'OrderedMap' + + default: + return undefined + } +} + function replaceIterable(iter, replaceChild) { debug('replaceIterable()', iter) - const iterableType = iter.constructor.name + const iterableType = getIterableType(iter) + if (!iterableType) { + throw new Error(`Cannot find type of iterable: ${iter}`) + } + switch (iterableType) { case 'List': case 'Set': @@ -156,13 +185,6 @@ function replaceIterable(iter, replaceChild) { mapData.push([ key, replaceChild(key, value) ]) }) return { "__iterable": iterableType, "data": mapData } - - default: - const iterData = {} - iter.forEach((value, key) => { - iterData[key] = replaceChild(key, value) - }) - return { "__iterable": iterableType, "data": iterData } } }