Merge pull request #1091 from xodio/feat-1068-make-standard-nodes-variadic

Make standard nodes variadic
This commit is contained in:
Evgeny Kochetkov
2018-02-28 15:49:06 +03:00
committed by GitHub
29 changed files with 847 additions and 391 deletions

View File

@@ -25,7 +25,7 @@ describe('xod-patch-search/index', () => {
const result = idx.search('path:number');
assert.equal(
result[0].item.path,
'xod/core/nth-number-2'
'xod/core/nth-number'
);
});
@@ -37,7 +37,7 @@ describe('xod-patch-search/index', () => {
it('searches: "number"', () => assert.equal(
idx.search('number')[0].item.path,
'xod/core/nth-number-2' // Cause it has a `number` in the path and it alphabetically sorted (that's why not *-to-string)
'xod/core/nth-number' // Cause it has a `number` in the path and it alphabetically sorted (that's why not *-to-string)
));
it('searches: "lib:xod/patch-nodes number"', () => {

View File

@@ -57,8 +57,8 @@ const createAdditionalValueTerminalGroups = (
const getValueTerminalX = (terminalGroupIndex, terminalIndex) => (
rightmostInputTerminalX +
DISTANCE_BETWEEN_TERMINALS +
// because terminalGroupIndex always starts from 2
((terminalGroupIndex - 2) * valueTerminalsGroupWidth) +
// because terminalGroupIndex always starts from 1
((terminalGroupIndex - 1) * valueTerminalsGroupWidth) +
(terminalIndex * DISTANCE_BETWEEN_TERMINALS)
);
@@ -77,8 +77,7 @@ const createAdditionalValueTerminalGroups = (
)(node),
originalValueTerminalNodes
)),
R.range(2), // [2; desiredArityLevel]
R.inc
R.range(1), // [1; desiredArityLevel)
)(desiredArityLevel);
};
@@ -152,12 +151,12 @@ const createLinksToAdditionalValueTerminals =
const createLinksFromNodeOutputsToAccPins = (variadicPinKeys, expansionNodeIds) => {
const accOutPinKeyPairs = R.zip(variadicPinKeys.outputs, variadicPinKeys.acc);
const accOutPinKeyPairs = R.zip(variadicPinKeys.acc, variadicPinKeys.outputs);
return R.compose(
R.chain(([inputNodeId, outputNodeId]) => R.map(
R.chain(([outputNodeId, inputNodeId]) => R.map(
([accPinKey, outputPinKey]) => Link.createLink(
accPinKey, inputNodeId,
outputPinKey, outputNodeId
outputPinKey, outputNodeId,
),
accOutPinKeyPairs
)),

View File

@@ -203,11 +203,29 @@
},
"type": "xod/patch-nodes/input-number"
},
"HkCo0rJuM-$1": {
"label": "V1",
"id": "HkCo0rJuM-$1",
"position": {
"x": 526,
"y": 0
},
"type": "xod/patch-nodes/input-number"
},
"ByZ0o0HyOz-$1": {
"label": "V2",
"id": "ByZ0o0HyOz-$1",
"position": {
"x": 576,
"y": 0
},
"type": "xod/patch-nodes/input-string"
},
"HkCo0rJuM-$2": {
"label": "V1",
"id": "HkCo0rJuM-$2",
"position": {
"x": 526,
"x": 626,
"y": 0
},
"type": "xod/patch-nodes/input-number"
@@ -216,7 +234,7 @@
"label": "V2",
"id": "ByZ0o0HyOz-$2",
"position": {
"x": 576,
"x": 676,
"y": 0
},
"type": "xod/patch-nodes/input-string"
@@ -225,7 +243,7 @@
"label": "V1",
"id": "HkCo0rJuM-$3",
"position": {
"x": 626,
"x": 726,
"y": 0
},
"type": "xod/patch-nodes/input-number"
@@ -234,7 +252,7 @@
"label": "V2",
"id": "ByZ0o0HyOz-$3",
"position": {
"x": 676,
"x": 776,
"y": 0
},
"type": "xod/patch-nodes/input-string"
@@ -243,7 +261,7 @@
"label": "V1",
"id": "HkCo0rJuM-$4",
"position": {
"x": 726,
"x": 826,
"y": 0
},
"type": "xod/patch-nodes/input-number"
@@ -251,64 +269,46 @@
"ByZ0o0HyOz-$4": {
"label": "V2",
"id": "ByZ0o0HyOz-$4",
"position": {
"x": 776,
"y": 0
},
"type": "xod/patch-nodes/input-string"
},
"HkCo0rJuM-$5": {
"label": "V1",
"id": "HkCo0rJuM-$5",
"position": {
"x": 826,
"y": 0
},
"type": "xod/patch-nodes/input-number"
},
"ByZ0o0HyOz-$5": {
"label": "V2",
"id": "ByZ0o0HyOz-$5",
"position": {
"x": 876,
"y": 0
},
"type": "xod/patch-nodes/input-string"
},
"S112Prb_f": {
"id": "S112Prb_f",
"SJm79rXOz": {
"id": "SJm79rXOz",
"type": "@/my-variadic",
"position": {
"x": 0,
"y": 0
}
},
"rkxJ2vrbOG": {
"id": "rkxJ2vrbOG",
"Syx7m9BXuM": {
"id": "Syx7m9BXuM",
"type": "@/my-variadic",
"position": {
"x": 100,
"y": 100
}
},
"BJWkhwSbdG": {
"id": "BJWkhwSbdG",
"rk-7X5SmdM": {
"id": "rk-7X5SmdM",
"type": "@/my-variadic",
"position": {
"x": 200,
"y": 200
}
},
"ryz12Pr-uG": {
"id": "ryz12Pr-uG",
"HkfQm9HQOG": {
"id": "HkfQm9HQOG",
"type": "@/my-variadic",
"position": {
"x": 300,
"y": 300
}
},
"BkQy2DS-dM": {
"id": "BkQy2DS-dM",
"HkQX79Hm_f": {
"id": "HkQX79Hm_f",
"type": "@/my-variadic",
"position": {
"x": 400,
@@ -317,120 +317,120 @@
}
},
"links": {
"HkNJ2PH-_M": {
"id": "HkNJ2PH-_M",
"SkEQXcSXuf": {
"id": "SkEQXcSXuf",
"output": {
"nodeId": "By1oTHyuz",
"pinKey": "__out__"
},
"input": {
"nodeId": "S112Prb_f",
"nodeId": "SJm79rXOz",
"pinKey": "By1oTHyuz"
}
},
"SJSJ2wH-df": {
"id": "SJSJ2wH-df",
"SkS77qrmuM": {
"id": "SkS77qrmuM",
"output": {
"nodeId": "By1oTHyuz",
"pinKey": "__out__"
},
"input": {
"nodeId": "rkxJ2vrbOG",
"nodeId": "Syx7m9BXuM",
"pinKey": "By1oTHyuz"
}
},
"By8JnwHZuz": {
"id": "By8JnwHZuz",
"ryUQQqBmdM": {
"id": "ryUQQqBmdM",
"output": {
"nodeId": "By1oTHyuz",
"pinKey": "__out__"
},
"input": {
"nodeId": "BJWkhwSbdG",
"nodeId": "rk-7X5SmdM",
"pinKey": "By1oTHyuz"
}
},
"H1D1nwrW_G": {
"id": "H1D1nwrW_G",
"BkD7QqHQdG": {
"id": "BkD7QqHQdG",
"output": {
"nodeId": "By1oTHyuz",
"pinKey": "__out__"
},
"input": {
"nodeId": "ryz12Pr-uG",
"nodeId": "HkfQm9HQOG",
"pinKey": "By1oTHyuz"
}
},
"HJOy3DSbuz": {
"id": "HJOy3DSbuz",
"ryumQqSmOf": {
"id": "ryumQqSmOf",
"output": {
"nodeId": "By1oTHyuz",
"pinKey": "__out__"
},
"input": {
"nodeId": "BkQy2DS-dM",
"nodeId": "HkQX79Hm_f",
"pinKey": "By1oTHyuz"
}
},
"SyKJ3wHWuG": {
"id": "SyKJ3wHWuG",
"SktXm9H7dz": {
"id": "SktXm9H7dz",
"output": {
"nodeId": "Sk1jCBJ_M",
"pinKey": "__out__"
},
"input": {
"nodeId": "S112Prb_f",
"nodeId": "SJm79rXOz",
"pinKey": "Sk1jCBJ_M"
}
},
"Hk91nPSZdf": {
"id": "Hk91nPSZdf",
"Sy5XQqSQ_M": {
"id": "Sy5XQqSQ_M",
"output": {
"nodeId": "Sk1jCBJ_M",
"pinKey": "__out__"
},
"input": {
"nodeId": "rkxJ2vrbOG",
"nodeId": "Syx7m9BXuM",
"pinKey": "Sk1jCBJ_M"
}
},
"Syok2wrW_z": {
"id": "Syok2wrW_z",
"S1iQ75BmuG": {
"id": "S1iQ75BmuG",
"output": {
"nodeId": "Sk1jCBJ_M",
"pinKey": "__out__"
},
"input": {
"nodeId": "BJWkhwSbdG",
"nodeId": "rk-7X5SmdM",
"pinKey": "Sk1jCBJ_M"
}
},
"rynJ2vS-uG": {
"id": "rynJ2vS-uG",
"S12mX5SXOf": {
"id": "S12mX5SXOf",
"output": {
"nodeId": "Sk1jCBJ_M",
"pinKey": "__out__"
},
"input": {
"nodeId": "ryz12Pr-uG",
"nodeId": "HkfQm9HQOG",
"pinKey": "Sk1jCBJ_M"
}
},
"B16k2PHb_z": {
"id": "B16k2PHb_z",
"rk6XmcB7_M": {
"id": "rk6XmcB7_M",
"output": {
"nodeId": "Sk1jCBJ_M",
"pinKey": "__out__"
},
"input": {
"nodeId": "BkQy2DS-dM",
"nodeId": "HkQX79Hm_f",
"pinKey": "Sk1jCBJ_M"
}
},
"S1RJ2DBWuM": {
"id": "S1RJ2DBWuM",
"ryCmQcSmOf": {
"id": "ryCmQcSmOf",
"output": {
"nodeId": "BkQy2DS-dM",
"nodeId": "HkQX79Hm_f",
"pinKey": "H13YRHyOM"
},
"input": {
@@ -438,10 +438,10 @@
"pinKey": "__in__"
}
},
"B1yxyhwr-uM": {
"id": "B1yxyhwr-uM",
"ryyxQmcSmuz": {
"id": "ryyxQmcSmuz",
"output": {
"nodeId": "BkQy2DS-dM",
"nodeId": "HkQX79Hm_f",
"pinKey": "SkUhpHkdf"
},
"input": {
@@ -449,10 +449,10 @@
"pinKey": "__in__"
}
},
"HJgg13DBZOG": {
"id": "HJgg13DBZOG",
"SJggXXcHQOG": {
"id": "SJggXXcHQOG",
"output": {
"nodeId": "BkQy2DS-dM",
"nodeId": "HkQX79Hm_f",
"pinKey": "S16hpryOG"
},
"input": {
@@ -460,279 +460,279 @@
"pinKey": "__in__"
}
},
"SkWek2wrbuM": {
"id": "SkWek2wrbuM",
"HyWgQ7cS7uz": {
"id": "HyWgQ7cS7uz",
"output": {
"nodeId": "ryNjTHyOz",
"pinKey": "__out__"
},
"input": {
"nodeId": "S112Prb_f",
"nodeId": "SJm79rXOz",
"pinKey": "ryNjTHyOz"
}
},
"Hyzey3DH-_M": {
"id": "Hyzey3DH-_M",
"r1zlQmqSmuf": {
"id": "r1zlQmqSmuf",
"output": {
"nodeId": "HytsTHkOf",
"pinKey": "__out__"
},
"input": {
"nodeId": "S112Prb_f",
"nodeId": "SJm79rXOz",
"pinKey": "HytsTHkOf"
}
},
"H17gknwH-OG": {
"id": "H17gknwH-OG",
"BkXe779S7Oz": {
"id": "BkXe779S7Oz",
"output": {
"nodeId": "Hkl2pHkuz",
"pinKey": "__out__"
},
"input": {
"nodeId": "S112Prb_f",
"nodeId": "SJm79rXOz",
"pinKey": "Hkl2pHkuz"
}
},
"H14ly3PSbuz": {
"id": "H14ly3PSbuz",
"SkVgQmqHQOM": {
"id": "SkVgQmqHQOM",
"output": {
"nodeId": "HkCo0rJuM",
"pinKey": "__out__"
},
"input": {
"nodeId": "S112Prb_f",
"nodeId": "SJm79rXOz",
"pinKey": "HkCo0rJuM"
}
},
"B1Hly3wHW_G": {
"id": "B1Hly3wHW_G",
"HJremX5SmdM": {
"id": "HJremX5SmdM",
"output": {
"nodeId": "ByZ0o0HyOz",
"pinKey": "__out__"
},
"input": {
"nodeId": "S112Prb_f",
"nodeId": "SJm79rXOz",
"pinKey": "ByZ0o0HyOz"
}
},
"r1Llk2vBbOf": {
"id": "r1Llk2vBbOf",
"ByIeXQ9Hm_G": {
"id": "ByIeXQ9Hm_G",
"output": {
"nodeId": "HkCo0rJuM-$1",
"pinKey": "__out__"
},
"input": {
"nodeId": "Syx7m9BXuM",
"pinKey": "HkCo0rJuM"
}
},
"BJweXQcrm_M": {
"id": "BJweXQcrm_M",
"output": {
"nodeId": "ByZ0o0HyOz-$1",
"pinKey": "__out__"
},
"input": {
"nodeId": "Syx7m9BXuM",
"pinKey": "ByZ0o0HyOz"
}
},
"Skdx7X5Bm_z": {
"id": "Skdx7X5Bm_z",
"output": {
"nodeId": "HkCo0rJuM-$2",
"pinKey": "__out__"
},
"input": {
"nodeId": "rkxJ2vrbOG",
"nodeId": "rk-7X5SmdM",
"pinKey": "HkCo0rJuM"
}
},
"r1Dx13wSb_z": {
"id": "r1Dx13wSb_z",
"ryYe7X9HmOM": {
"id": "ryYe7X9HmOM",
"output": {
"nodeId": "ByZ0o0HyOz-$2",
"pinKey": "__out__"
},
"input": {
"nodeId": "rkxJ2vrbOG",
"nodeId": "rk-7X5SmdM",
"pinKey": "ByZ0o0HyOz"
}
},
"r1_xkhvrW_M": {
"id": "r1_xkhvrW_M",
"rJqxXQqHQuG": {
"id": "rJqxXQqHQuG",
"output": {
"nodeId": "HkCo0rJuM-$3",
"pinKey": "__out__"
},
"input": {
"nodeId": "BJWkhwSbdG",
"nodeId": "HkfQm9HQOG",
"pinKey": "HkCo0rJuM"
}
},
"rkFg1hwS-_z": {
"id": "rkFg1hwS-_z",
"ByolQQqrQuz": {
"id": "ByolQQqrQuz",
"output": {
"nodeId": "ByZ0o0HyOz-$3",
"pinKey": "__out__"
},
"input": {
"nodeId": "BJWkhwSbdG",
"nodeId": "HkfQm9HQOG",
"pinKey": "ByZ0o0HyOz"
}
},
"HkcgkhvSZdM": {
"id": "HkcgkhvSZdM",
"S1nlQXqB7dG": {
"id": "S1nlQXqB7dG",
"output": {
"nodeId": "HkCo0rJuM-$4",
"pinKey": "__out__"
},
"input": {
"nodeId": "ryz12Pr-uG",
"nodeId": "HkQX79Hm_f",
"pinKey": "HkCo0rJuM"
}
},
"HJoly2vSZOz": {
"id": "HJoly2vSZOz",
"B16gXm9SXdG": {
"id": "B16gXm9SXdG",
"output": {
"nodeId": "ByZ0o0HyOz-$4",
"pinKey": "__out__"
},
"input": {
"nodeId": "ryz12Pr-uG",
"nodeId": "HkQX79Hm_f",
"pinKey": "ByZ0o0HyOz"
}
},
"Hkne1hvSWuf": {
"id": "Hkne1hvSWuf",
"B1CemXcSXuz": {
"id": "B1CemXcSXuz",
"output": {
"nodeId": "HkCo0rJuM-$5",
"pinKey": "__out__"
},
"input": {
"nodeId": "BkQy2DS-dM",
"pinKey": "HkCo0rJuM"
}
},
"rkpe12DSWOG": {
"id": "rkpe12DSWOG",
"output": {
"nodeId": "ByZ0o0HyOz-$5",
"pinKey": "__out__"
},
"input": {
"nodeId": "BkQy2DS-dM",
"pinKey": "ByZ0o0HyOz"
}
},
"B1RgJhwr-_z": {
"id": "B1RgJhwr-_z",
"output": {
"nodeId": "rkxJ2vrbOG",
"pinKey": "ryNjTHyOz"
},
"input": {
"nodeId": "S112Prb_f",
"nodeId": "SJm79rXOz",
"pinKey": "H13YRHyOM"
}
},
"ry1Zk3DrZuM": {
"id": "ry1Zk3DrZuM",
"output": {
"nodeId": "rkxJ2vrbOG",
"pinKey": "HytsTHkOf"
},
"input": {
"nodeId": "S112Prb_f",
"pinKey": "SkUhpHkdf"
}
},
"SJxZJ3PH-OG": {
"id": "SJxZJ3PH-OG",
"output": {
"nodeId": "rkxJ2vrbOG",
"pinKey": "Hkl2pHkuz"
},
"input": {
"nodeId": "S112Prb_f",
"pinKey": "S16hpryOG"
}
},
"ry-ZJ3vH-_M": {
"id": "ry-ZJ3vH-_M",
"output": {
"nodeId": "BJWkhwSbdG",
"nodeId": "Syx7m9BXuM",
"pinKey": "ryNjTHyOz"
},
"input": {
"nodeId": "rkxJ2vrbOG",
"pinKey": "H13YRHyOM"
}
},
"ryf-y2DS-_f": {
"id": "ryf-y2DS-_f",
"Hk1bmQcHmOG": {
"id": "Hk1bmQcHmOG",
"output": {
"nodeId": "BJWkhwSbdG",
"pinKey": "HytsTHkOf"
},
"input": {
"nodeId": "rkxJ2vrbOG",
"nodeId": "SJm79rXOz",
"pinKey": "SkUhpHkdf"
}
},
"ryQWkhwS-OM": {
"id": "ryQWkhwS-OM",
"output": {
"nodeId": "BJWkhwSbdG",
"pinKey": "Hkl2pHkuz"
},
"input": {
"nodeId": "rkxJ2vrbOG",
"pinKey": "S16hpryOG"
"nodeId": "Syx7m9BXuM",
"pinKey": "HytsTHkOf"
}
},
"Hy4-ynvBWdz": {
"id": "Hy4-ynvBWdz",
"H1g-QXcBmdf": {
"id": "H1g-QXcBmdf",
"output": {
"nodeId": "ryz12Pr-uG",
"nodeId": "SJm79rXOz",
"pinKey": "S16hpryOG"
},
"input": {
"nodeId": "Syx7m9BXuM",
"pinKey": "Hkl2pHkuz"
}
},
"ryWZmX9B7Of": {
"id": "ryWZmX9B7Of",
"output": {
"nodeId": "Syx7m9BXuM",
"pinKey": "H13YRHyOM"
},
"input": {
"nodeId": "rk-7X5SmdM",
"pinKey": "ryNjTHyOz"
},
"input": {
"nodeId": "BJWkhwSbdG",
"pinKey": "H13YRHyOM"
}
},
"ByHZJhwHWOf": {
"id": "ByHZJhwHWOf",
"SJfb7QcHQdG": {
"id": "SJfb7QcHQdG",
"output": {
"nodeId": "ryz12Pr-uG",
"pinKey": "HytsTHkOf"
},
"input": {
"nodeId": "BJWkhwSbdG",
"nodeId": "Syx7m9BXuM",
"pinKey": "SkUhpHkdf"
}
},
"BkIbJhDSZuG": {
"id": "BkIbJhDSZuG",
"output": {
"nodeId": "ryz12Pr-uG",
"pinKey": "Hkl2pHkuz"
},
"input": {
"nodeId": "BJWkhwSbdG",
"pinKey": "S16hpryOG"
"nodeId": "rk-7X5SmdM",
"pinKey": "HytsTHkOf"
}
},
"SJw-1hPBZ_G": {
"id": "SJw-1hPBZ_G",
"BkQ-7QqSX_G": {
"id": "BkQ-7QqSX_G",
"output": {
"nodeId": "BkQy2DS-dM",
"nodeId": "Syx7m9BXuM",
"pinKey": "S16hpryOG"
},
"input": {
"nodeId": "rk-7X5SmdM",
"pinKey": "Hkl2pHkuz"
}
},
"S1V-m7qHX_f": {
"id": "S1V-m7qHX_f",
"output": {
"nodeId": "rk-7X5SmdM",
"pinKey": "H13YRHyOM"
},
"input": {
"nodeId": "HkfQm9HQOG",
"pinKey": "ryNjTHyOz"
},
"input": {
"nodeId": "ryz12Pr-uG",
"pinKey": "H13YRHyOM"
}
},
"HyuZyhwSZOM": {
"id": "HyuZyhwSZOM",
"BJrWX79SXuz": {
"id": "BJrWX79SXuz",
"output": {
"nodeId": "BkQy2DS-dM",
"pinKey": "HytsTHkOf"
},
"input": {
"nodeId": "ryz12Pr-uG",
"nodeId": "rk-7X5SmdM",
"pinKey": "SkUhpHkdf"
}
},
"ryKWJ3vr-OM": {
"id": "ryKWJ3vr-OM",
"output": {
"nodeId": "BkQy2DS-dM",
"pinKey": "Hkl2pHkuz"
},
"input": {
"nodeId": "ryz12Pr-uG",
"nodeId": "HkfQm9HQOG",
"pinKey": "HytsTHkOf"
}
},
"r18ZQ79rXdf": {
"id": "r18ZQ79rXdf",
"output": {
"nodeId": "rk-7X5SmdM",
"pinKey": "S16hpryOG"
},
"input": {
"nodeId": "HkfQm9HQOG",
"pinKey": "Hkl2pHkuz"
}
},
"Hkv-XXcrXOG": {
"id": "Hkv-XXcrXOG",
"output": {
"nodeId": "HkfQm9HQOG",
"pinKey": "H13YRHyOM"
},
"input": {
"nodeId": "HkQX79Hm_f",
"pinKey": "ryNjTHyOz"
}
},
"ryd-mX5r7_G": {
"id": "ryd-mX5r7_G",
"output": {
"nodeId": "HkfQm9HQOG",
"pinKey": "SkUhpHkdf"
},
"input": {
"nodeId": "HkQX79Hm_f",
"pinKey": "HytsTHkOf"
}
},
"BkYZQX9BQOM": {
"id": "BkYZQX9BQOM",
"output": {
"nodeId": "HkfQm9HQOG",
"pinKey": "S16hpryOG"
},
"input": {
"nodeId": "HkQX79Hm_f",
"pinKey": "Hkl2pHkuz"
}
}
},

View File

@@ -1,5 +1,5 @@
{
"description": "Computes bitwise AND of two bytes. A resulting bit at a particular position is 1 only if corresponding bits of inputs are both 1.",
"description": "Computes bitwise AND of two or more bytes. A resulting bit at a particular position is 1 only if corresponding bits of all inputs are 1.",
"nodes": [
{
"id": "ByjTuuxef",
@@ -9,6 +9,14 @@
},
"type": "xod/patch-nodes/input-number"
},
{
"id": "HkpP80W_f",
"position": {
"x": 136,
"y": 102
},
"type": "xod/patch-nodes/variadic-1"
},
{
"id": "S1YR_dgeG",
"position": {

View File

@@ -1,11 +1,19 @@
{
"description": "Computes bitwise OR of two bytes. A resulting bit at a particular position is 0 only if corresponding bits of inputs are both 0.",
"description": "Computes bitwise OR of two or more bytes. A resulting bit at a particular position is 0 only if all corresponding bits of inputs are 0.",
"nodes": [
{
"id": "HkiYIAWuz",
"position": {
"x": 102,
"y": 0
},
"type": "xod/patch-nodes/variadic-1"
},
{
"id": "SkC1aTZeM",
"position": {
"x": 33,
"y": -1
"x": 34,
"y": 0
},
"type": "xod/patch-nodes/input-number"
},
@@ -20,8 +28,8 @@
{
"id": "r1zA16pbxM",
"position": {
"x": -1,
"y": -1
"x": 0,
"y": 0
},
"type": "xod/patch-nodes/input-number"
},

View File

@@ -1,6 +1,14 @@
{
"description": "Computes bitwise XOR of two bytes. A resulting bit at a particular position is 1 only if either of corresponding bits of inputs is 1 and another is 0.",
"description": "Computes bitwise XOR of two or more bytes. A resulting bit at a particular position is 1 only if an odd number of corresponding bits of inputs is 1.",
"nodes": [
{
"id": "B1b5LAbOz",
"position": {
"x": 102,
"y": 0
},
"type": "xod/patch-nodes/variadic-1"
},
{
"id": "BkbqIa6ZgM",
"position": {

View File

@@ -7,7 +7,7 @@ struct State {
{{ GENERATED_CODE }}
void evaluate(Context ctx) {
auto x = getValue<input_X>(ctx);
auto y = getValue<input_Y>(ctx);
emitValue<output_SUM>(ctx, x + y);
auto x = getValue<input_IN1>(ctx);
auto y = getValue<input_IN2>(ctx);
emitValue<output_OUT>(ctx, x + y);
}

View File

@@ -1,21 +1,27 @@
{
"description": "Adds two numbers",
"description": "Adds numbers",
"nodes": [
{
"id": "BJnQUR_BwyZ",
"label": "X",
"position": {
"x": 10,
"y": 16
"x": 0,
"y": 0
},
"type": "xod/patch-nodes/input-number"
},
{
"id": "HkqmLAOrD1W",
"label": "Y",
"id": "By-kyWjDG",
"position": {
"x": 138,
"y": 16
"x": 272,
"y": 0
},
"type": "xod/patch-nodes/variadic-1"
},
{
"id": "HkqmLAOrD1W",
"position": {
"x": 136,
"y": 0
},
"type": "xod/patch-nodes/input-number"
},
@@ -24,10 +30,9 @@
"__in__": 0
},
"id": "SyomIRurDJ-",
"label": "SUM",
"position": {
"x": 10,
"y": 224
"x": 0,
"y": 204
},
"type": "xod/patch-nodes/output-number"
},

View File

@@ -7,7 +7,7 @@ struct State {
{{ GENERATED_CODE }}
void evaluate(Context ctx) {
auto a = getValue<input_A>(ctx);
auto b = getValue<input_B>(ctx);
emitValue<output_AND>(ctx, a && b);
auto a = getValue<input_IN1>(ctx);
auto b = getValue<input_IN2>(ctx);
emitValue<output_OUT>(ctx, a && b);
}

View File

@@ -1,24 +1,22 @@
{
"description": "Outputs false if and only if both inputs are true",
"description": "Outputs true if and only if all inputs are true",
"nodes": [
{
"boundValues": {
"__in__": false
},
"id": "B1gN80uHvk-",
"label": "AND",
"position": {
"x": 10,
"y": 224
"x": 0,
"y": 204
},
"type": "xod/patch-nodes/output-boolean"
},
{
"id": "SJMVU0urvkZ",
"label": "A",
"position": {
"x": 10,
"y": 16
"x": 0,
"y": 0
},
"type": "xod/patch-nodes/input-boolean"
},
@@ -32,12 +30,19 @@
},
{
"id": "r1bVLR_BPJW",
"label": "B",
"position": {
"x": 138,
"y": 16
"x": 136,
"y": 0
},
"type": "xod/patch-nodes/input-boolean"
},
{
"id": "ry_ukWsPM",
"position": {
"x": 272,
"y": 0
},
"type": "xod/patch-nodes/variadic-1"
}
]
}

View File

@@ -4,8 +4,8 @@ struct State {
{{ GENERATED_CODE }}
void evaluate(Context ctx) {
bool p1 = isInputDirty<input_P1>(ctx);
bool p2 = isInputDirty<input_P2>(ctx);
bool p1 = isInputDirty<input_IN1>(ctx);
bool p2 = isInputDirty<input_IN2>(ctx);
if (p1 || p2)
emitValue<output_ANY>(ctx, true);
emitValue<output_OUT>(ctx, true);
}

View File

@@ -6,22 +6,28 @@
"__in__": false
},
"id": "ByHmL0uHPk-",
"label": "ANY",
"position": {
"x": 10,
"y": 224
"x": 0,
"y": 204
},
"type": "xod/patch-nodes/output-pulse"
},
{
"id": "ByU7LRuSPkW",
"label": "P2",
"position": {
"x": 138,
"y": 16
"x": 136,
"y": 0
},
"type": "xod/patch-nodes/input-pulse"
},
{
"id": "HJIw1ZsPz",
"position": {
"x": 272,
"y": 0
},
"type": "xod/patch-nodes/variadic-1"
},
{
"id": "noNativeImpl",
"position": {
@@ -32,10 +38,9 @@
},
{
"id": "ryv7IRdSP1b",
"label": "P1",
"position": {
"x": 10,
"y": 16
"x": 0,
"y": 0
},
"type": "xod/patch-nodes/input-pulse"
}

View File

@@ -9,8 +9,8 @@ struct State {
void evaluate(Context ctx) {
auto state = getState(ctx);
auto head = getValue<input_HEAD>(ctx);
auto tail = getValue<input_TAIL>(ctx);
auto head = getValue<input_IN1>(ctx);
auto tail = getValue<input_IN2>(ctx);
state->view = ConcatListView<char>(head, tail);
emitValue<output_STR>(ctx, XString(&state->view));
emitValue<output_OUT>(ctx, XString(&state->view));
}

View File

@@ -1,40 +1,45 @@
{
"description": "Concatenates (adds together) two strings",
"description": "Concatenates (adds together) strings",
"nodes": [
{
"id": "Bk_h9jpZW",
"position": {
"x": 138,
"y": 120
"x": 0,
"y": 102
},
"type": "xod/patch-nodes/not-implemented-in-xod"
},
{
"id": "BkeKcj6ZZ",
"label": "TAIL",
"position": {
"x": 138,
"y": 16
"x": 136,
"y": 0
},
"type": "xod/patch-nodes/input-string"
},
{
"id": "Hkqu9oaWb",
"label": "HEAD",
"position": {
"x": 10,
"y": 16
"x": 0,
"y": 0
},
"type": "xod/patch-nodes/input-string"
},
{
"id": "rksccsp-W",
"label": "STR",
"position": {
"x": 10,
"y": 224
"x": 0,
"y": 204
},
"type": "xod/patch-nodes/output-string"
},
{
"id": "ry63AlsPf",
"position": {
"x": 272,
"y": 0
},
"type": "xod/patch-nodes/variadic-1"
}
]
}

View File

@@ -0,0 +1,155 @@
{
"description": "Rounds input `X` up to the first threshold `T0`, `T1`, ..., `T𝑛` greater or equal to the `X`. If `X` is even greater than the last threshold, the value is round down to it.",
"links": [
{
"id": "BJqR9pWYZ",
"input": {
"nodeId": "ryua56WYb",
"pinKey": "r1AgIROHDJW"
},
"output": {
"nodeId": "r1SqqabFZ",
"pinKey": "__out__"
}
},
{
"id": "HJ0_LU7Oz",
"input": {
"nodeId": "rkVicaZFZ",
"pinKey": "__in__"
},
"output": {
"nodeId": "ryLFq6btW",
"pinKey": "__out__"
}
},
{
"id": "HJPC5T-FZ",
"input": {
"nodeId": "ryua56WYb",
"pinKey": "ryTeUROHD1b"
},
"output": {
"nodeId": "rJl5qpZYZ",
"pinKey": "__out__"
}
},
{
"id": "Hkc35TZKb",
"input": {
"nodeId": "HJw2cTbFW",
"pinKey": "SJqZ8COrDkW"
},
"output": {
"nodeId": "r1SqqabFZ",
"pinKey": "__out__"
}
},
{
"id": "Sk_yopZY-",
"input": {
"nodeId": "rkpc9pZYb",
"pinKey": "__in__"
},
"output": {
"nodeId": "ryua56WYb",
"pinKey": "S13xLCuHvkW"
}
},
{
"id": "r1325T-tb",
"input": {
"nodeId": "HJw2cTbFW",
"pinKey": "HJjZLRdBw1-"
},
"output": {
"nodeId": "ryLFq6btW",
"pinKey": "__out__"
}
},
{
"id": "ryZR5aWKW",
"input": {
"nodeId": "ryua56WYb",
"pinKey": "S1yZIA_rDJZ"
},
"output": {
"nodeId": "HJw2cTbFW",
"pinKey": "HktZUCdrPkZ"
}
}
],
"nodes": [
{
"id": "HJw2cTbFW",
"position": {
"x": 68,
"y": 102
},
"type": "@/less"
},
{
"id": "SyLXO0Wuz",
"position": {
"x": 272,
"y": 0
},
"type": "xod/patch-nodes/variadic-1"
},
{
"id": "r1SqqabFZ",
"label": "T1",
"position": {
"x": 204,
"y": 0
},
"type": "xod/patch-nodes/input-number"
},
{
"id": "rJl5qpZYZ",
"label": "T0",
"position": {
"x": 170,
"y": 0
},
"type": "xod/patch-nodes/input-number"
},
{
"description": "Utility output needed for expanding node. Shoud be ignored by the end user.",
"id": "rkVicaZFZ",
"label": "_",
"position": {
"x": 34,
"y": 306
},
"type": "xod/patch-nodes/output-number"
},
{
"description": "The rounding result. Equals to one of Tx.",
"id": "rkpc9pZYb",
"label": "T",
"position": {
"x": 136,
"y": 306
},
"type": "xod/patch-nodes/output-number"
},
{
"id": "ryLFq6btW",
"label": "X",
"position": {
"x": 34,
"y": 0
},
"type": "xod/patch-nodes/input-number"
},
{
"id": "ryua56WYb",
"position": {
"x": 136,
"y": 204
},
"type": "@/if-else"
}
]
}

View File

@@ -7,7 +7,7 @@ struct State {
{{ GENERATED_CODE }}
void evaluate(Context ctx) {
auto x = getValue<input_X>(ctx);
auto y = getValue<input_Y>(ctx);
emitValue<output_PROD>(ctx, x * y);
auto x = getValue<input_IN1>(ctx);
auto y = getValue<input_IN2>(ctx);
emitValue<output_OUT>(ctx, x * y);
}

View File

@@ -1,12 +1,11 @@
{
"description": "Multiplies two numbers",
"description": "Multiplies numbers",
"nodes": [
{
"id": "B1GfLR_SPk-",
"label": "X",
"position": {
"x": 10,
"y": 16
"x": 0,
"y": 0
},
"type": "xod/patch-nodes/input-number"
},
@@ -15,27 +14,33 @@
"__in__": 0
},
"id": "BkQzLCurwJZ",
"label": "PROD",
"position": {
"x": 10,
"y": 224
"x": 0,
"y": 204
},
"type": "xod/patch-nodes/output-number"
},
{
"id": "SJ4zUC_BD1-",
"label": "Y",
"id": "H1eCJbsPf",
"position": {
"x": 138,
"y": 16
"x": 272,
"y": 0
},
"type": "xod/patch-nodes/variadic-1"
},
{
"id": "SJ4zUC_BD1-",
"position": {
"x": 136,
"y": 0
},
"type": "xod/patch-nodes/input-number"
},
{
"id": "noNativeImpl",
"position": {
"x": 100,
"y": 100
"x": 102,
"y": 102
},
"type": "xod/patch-nodes/not-implemented-in-xod"
}

View File

@@ -7,7 +7,7 @@ struct State {
{{ GENERATED_CODE }}
void evaluate(Context ctx) {
auto a = getValue<input_A>(ctx);
auto b = getValue<input_B>(ctx);
emitValue<output_NAND>(ctx, !(a && b));
auto a = getValue<input_IN1>(ctx);
auto b = getValue<input_IN2>(ctx);
emitValue<output_OUT>(ctx, !(a && b));
}

View File

@@ -1,21 +1,27 @@
{
"description": "Outputs false if and only if both inputs are true",
"description": "Outputs false if and only if all inputs are true",
"nodes": [
{
"id": "BkwGIROSw1Z",
"label": "A",
"id": "BJbWl-jDG",
"position": {
"x": 10,
"y": 16
"x": 272,
"y": 0
},
"type": "xod/patch-nodes/variadic-1"
},
{
"id": "BkwGIROSw1Z",
"position": {
"x": 0,
"y": 0
},
"type": "xod/patch-nodes/input-boolean"
},
{
"id": "HkHG8COBPJ-",
"label": "B",
"position": {
"x": 138,
"y": 16
"x": 136,
"y": 0
},
"type": "xod/patch-nodes/input-boolean"
},
@@ -32,10 +38,9 @@
"__in__": false
},
"id": "r18G80_Hvyb",
"label": "NAND",
"position": {
"x": 10,
"y": 224
"x": 0,
"y": 204
},
"type": "xod/patch-nodes/output-boolean"
}

View File

@@ -7,7 +7,7 @@ struct State {
{{ GENERATED_CODE }}
void evaluate(Context ctx) {
auto a = getValue<input_A>(ctx);
auto b = getValue<input_B>(ctx);
emitValue<output_NOR>(ctx, !(a || b));
auto a = getValue<input_IN1>(ctx);
auto b = getValue<input_IN2>(ctx);
emitValue<output_OUT>(ctx, !(a || b));
}

View File

@@ -1,12 +1,11 @@
{
"description": "Outputs true if and only if both inputs are false",
"description": "Outputs true if and only if all inputs are false",
"nodes": [
{
"id": "S1dG8AOBPJW",
"label": "B",
"position": {
"x": 138,
"y": 16
"x": 136,
"y": 0
},
"type": "xod/patch-nodes/input-boolean"
},
@@ -20,22 +19,28 @@
},
{
"id": "r1tz8CdBDkb",
"label": "A",
"position": {
"x": 10,
"y": 16
"x": 0,
"y": 0
},
"type": "xod/patch-nodes/input-boolean"
},
{
"id": "rJWMxZjPM",
"position": {
"x": 272,
"y": 0
},
"type": "xod/patch-nodes/variadic-1"
},
{
"boundValues": {
"__in__": false
},
"id": "rJqfIRdHwkW",
"label": "NOR",
"position": {
"x": 10,
"y": 224
"x": 0,
"y": 204
},
"type": "xod/patch-nodes/output-boolean"
}

View File

@@ -0,0 +1,169 @@
{
"description": "Selects either `X0` or `X1` based on `IDX` index value.",
"links": [
{
"id": "BkCNBaWFW",
"input": {
"nodeId": "SJrESpZKW",
"pinKey": "r1AgIROHDJW"
},
"output": {
"nodeId": "BkGyBpZKZ",
"pinKey": "__out__"
}
},
{
"id": "Hk64BaWKZ",
"input": {
"nodeId": "SJrESpZKW",
"pinKey": "ryTeUROHD1b"
},
"output": {
"nodeId": "S13CNpbK-",
"pinKey": "__out__"
}
},
{
"id": "SJX4STWYb",
"input": {
"nodeId": "rJcQrTWtZ",
"pinKey": "HJjZLRdBw1-"
},
"output": {
"nodeId": "rJXCVpWtZ",
"pinKey": "__out__"
}
},
{
"id": "rJGSBpbFZ",
"input": {
"nodeId": "SJrESpZKW",
"pinKey": "S1yZIA_rDJZ"
},
"output": {
"nodeId": "rJcQrTWtZ",
"pinKey": "HktZUCdrPkZ"
}
},
{
"id": "rJYVHTbYb",
"input": {
"nodeId": "rJCJSpbt-",
"pinKey": "__in__"
},
"output": {
"nodeId": "SJrESpZKW",
"pinKey": "S13xLCuHvkW"
}
},
{
"id": "ryWq4yXOG",
"input": {
"nodeId": "HyNBEJXdG",
"pinKey": "__in__"
},
"output": {
"nodeId": "HywtN1QdM",
"pinKey": "HyRmUCdBDkZ"
}
},
{
"id": "rymc4kmuf",
"input": {
"nodeId": "HywtN1QdM",
"pinKey": "BypX80uSD1Z"
},
"output": {
"nodeId": "rJXCVpWtZ",
"pinKey": "__out__"
}
}
],
"nodes": [
{
"id": "BkGyBpZKZ",
"label": "X1",
"position": {
"x": 204,
"y": 0
},
"type": "xod/patch-nodes/input-number"
},
{
"description": "Utility output needed for expanding node. Shoud be ignored by the end user.\n",
"id": "HyNBEJXdG",
"label": "_",
"position": {
"x": 34,
"y": 306
},
"type": "xod/patch-nodes/output-number"
},
{
"boundValues": {
"rkJ4URuHDJ-": 1
},
"id": "HywtN1QdM",
"position": {
"x": 34,
"y": 204
},
"type": "@/subtract"
},
{
"id": "S13CNpbK-",
"label": "X0",
"position": {
"x": 170,
"y": 0
},
"type": "xod/patch-nodes/input-number"
},
{
"id": "SJrESpZKW",
"position": {
"x": 136,
"y": 204
},
"type": "@/if-else"
},
{
"description": "The selected value. Equals to one of `Xi` input.",
"id": "rJCJSpbt-",
"position": {
"x": 136,
"y": 306
},
"type": "xod/patch-nodes/output-number"
},
{
"description": "Index to select. All values below 1 are considered to be 0. Values of 1 and above are considered to be 1.",
"id": "rJXCVpWtZ",
"label": "IDX",
"position": {
"x": 102,
"y": 0
},
"type": "xod/patch-nodes/input-number"
},
{
"boundValues": {
"SJqZ8COrDkW": 1
},
"id": "rJcQrTWtZ",
"position": {
"x": 102,
"y": 102
},
"type": "@/less"
},
{
"id": "ryJ0VH7Of",
"position": {
"x": 272,
"y": 0
},
"type": "xod/patch-nodes/variadic-1"
}
]
}

View File

@@ -7,7 +7,7 @@ struct State {
{{ GENERATED_CODE }}
void evaluate(Context ctx) {
auto a = getValue<input_A>(ctx);
auto b = getValue<input_B>(ctx);
emitValue<output_OR>(ctx, a || b);
auto a = getValue<input_IN1>(ctx);
auto b = getValue<input_IN2>(ctx);
emitValue<output_OUT>(ctx, a || b);
}

View File

@@ -1,21 +1,27 @@
{
"description": "Outputs false if and only if both inputs are false",
"description": "Outputs false if and only if all inputs are false",
"nodes": [
{
"id": "BJaG80urD1-",
"label": "A",
"id": "BJS2bbsPG",
"position": {
"x": 10,
"y": 16
"x": 272,
"y": 0
},
"type": "xod/patch-nodes/variadic-1"
},
{
"id": "BJaG80urD1-",
"position": {
"x": 0,
"y": 0
},
"type": "xod/patch-nodes/input-boolean"
},
{
"id": "HJCfI0dBDkb",
"label": "B",
"position": {
"x": 138,
"y": 16
"x": 136,
"y": 0
},
"type": "xod/patch-nodes/input-boolean"
},
@@ -24,10 +30,9 @@
"__in__": false
},
"id": "SJyXI0OrD1-",
"label": "OR",
"position": {
"x": 10,
"y": 224
"x": 0,
"y": 204
},
"type": "xod/patch-nodes/output-boolean"
},

View File

@@ -1,5 +1,5 @@
{
"description": "Outputs either `X1` or `X2` value based on which pulse came last — `S1` or `S2`. By default outputs `X1`.",
"description": "Outputs `X𝑛` value based on which `S𝑛` pulse came last. By default outputs `X1`.",
"links": [
{
"id": "BkDeLCaL-",
@@ -23,6 +23,17 @@
"pinKey": "__out__"
}
},
{
"id": "S1c4DAWdf",
"input": {
"nodeId": "BJ97PAWOM",
"pinKey": "ByU7LRuSPkW"
},
"output": {
"nodeId": "rJUjrCTUb",
"pinKey": "__out__"
}
},
{
"id": "Sk-xI0pL-",
"input": {
@@ -34,6 +45,17 @@
"pinKey": "__out__"
}
},
{
"id": "SkKEw0b_M",
"input": {
"nodeId": "BJ97PAWOM",
"pinKey": "ryv7IRdSP1b"
},
"output": {
"nodeId": "rkmiHCaIZ",
"pinKey": "__out__"
}
},
{
"id": "SkSgU0TLb",
"input": {
@@ -56,6 +78,17 @@
"pinKey": "__out__"
}
},
{
"id": "rkVSvAbdM",
"input": {
"nodeId": "rkWHDAW_f",
"pinKey": "__in__"
},
"output": {
"nodeId": "BJ97PAWOM",
"pinKey": "ByHmL0uHPk-"
}
},
{
"id": "rysRHCaIb",
"input": {
@@ -69,28 +102,44 @@
}
],
"nodes": [
{
"id": "BJ97PAWOM",
"position": {
"x": 408,
"y": 204
},
"type": "@/any"
},
{
"id": "BkiBD0buG",
"position": {
"x": 476,
"y": 0
},
"type": "xod/patch-nodes/variadic-2"
},
{
"id": "S10qrR6UZ",
"label": "X1",
"position": {
"x": 10,
"y": 16
"x": 68,
"y": 0
},
"type": "xod/patch-nodes/input-number"
},
{
"id": "S1oJLRpLW",
"position": {
"x": 138,
"y": 224
"x": 102,
"y": 204
},
"type": "@/if-else"
},
{
"id": "S1yaHC6UW",
"position": {
"x": 138,
"y": 328
"x": 102,
"y": 306
},
"type": "xod/patch-nodes/output-number"
},
@@ -98,17 +147,25 @@
"id": "rJUjrCTUb",
"label": "S2",
"position": {
"x": 394,
"y": 16
"x": 340,
"y": 0
},
"type": "xod/patch-nodes/input-pulse"
},
{
"id": "rkWHDAW_f",
"position": {
"x": 408,
"y": 306
},
"type": "xod/patch-nodes/output-pulse"
},
{
"id": "rkmiHCaIZ",
"label": "S1",
"position": {
"x": 266,
"y": 16
"x": 136,
"y": 0
},
"type": "xod/patch-nodes/input-pulse"
},
@@ -116,16 +173,16 @@
"id": "rygjH06LW",
"label": "X2",
"position": {
"x": 138,
"y": 16
"x": 272,
"y": 0
},
"type": "xod/patch-nodes/input-number"
},
{
"id": "ryj6SCpL-",
"position": {
"x": 266,
"y": 224
"x": 238,
"y": 204
},
"type": "@/flip-flop"
}

View File

@@ -9,5 +9,5 @@ struct State {
void evaluate(Context ctx) {
auto x = getValue<input_X>(ctx);
auto y = getValue<input_Y>(ctx);
emitValue<output_DIFF>(ctx, x - y);
emitValue<output_OUT>(ctx, x - y);
}

View File

@@ -5,8 +5,8 @@
"id": "BypX80uSD1Z",
"label": "X",
"position": {
"x": 10,
"y": 16
"x": 0,
"y": 0
},
"type": "xod/patch-nodes/input-number"
},
@@ -15,18 +15,17 @@
"__in__": 0
},
"id": "HyRmUCdBDkZ",
"label": "DIFF",
"position": {
"x": 10,
"y": 224
"x": 0,
"y": 204
},
"type": "xod/patch-nodes/output-number"
},
{
"id": "noNativeImpl",
"position": {
"x": 100,
"y": 100
"x": 0,
"y": 102
},
"type": "xod/patch-nodes/not-implemented-in-xod"
},
@@ -34,10 +33,18 @@
"id": "rkJ4URuHDJ-",
"label": "Y",
"position": {
"x": 138,
"y": 16
"x": 102,
"y": 0
},
"type": "xod/patch-nodes/input-number"
},
{
"id": "ry8ts1m_f",
"position": {
"x": 204,
"y": 0
},
"type": "xod/patch-nodes/variadic-1"
}
]
}

View File

@@ -7,7 +7,7 @@ struct State {
{{ GENERATED_CODE }}
void evaluate(Context ctx) {
auto a = getValue<input_A>(ctx);
auto b = getValue<input_B>(ctx);
emitValue<output_XOR>(ctx, a != b);
auto a = getValue<input_IN1>(ctx);
auto b = getValue<input_IN2>(ctx);
emitValue<output_OUT>(ctx, a != b);
}

View File

@@ -3,10 +3,9 @@
"nodes": [
{
"id": "HkOV8CdSvyW",
"label": "A",
"position": {
"x": 10,
"y": 16
"x": 0,
"y": 0
},
"type": "xod/patch-nodes/input-boolean"
},
@@ -15,29 +14,35 @@
"__in__": false
},
"id": "Hkw48AdSPyb",
"label": "XOR",
"position": {
"x": 10,
"y": 224
"x": 0,
"y": 204
},
"type": "xod/patch-nodes/output-boolean"
},
{
"id": "SkKNUR_SwyW",
"label": "B",
"position": {
"x": 138,
"y": 16
"x": 136,
"y": 0
},
"type": "xod/patch-nodes/input-boolean"
},
{
"id": "noNativeImpl",
"position": {
"x": 100,
"y": 100
"x": 102,
"y": 102
},
"type": "xod/patch-nodes/not-implemented-in-xod"
},
{
"id": "r15nxZjvM",
"position": {
"x": 272,
"y": 0
},
"type": "xod/patch-nodes/variadic-1"
}
]
}