godprotocol
Version:
A distributed computing environment
620 lines (562 loc) • 18.3 kB
JavaScript
class Datatypes{
string = async(op, args)=>{
let me = await this.literal(),
other = args[0], result=null;
console.log(op)
switch(op){
case 'upper':
result = me.toUpperCase()
break;
case 'lower':
result = me.toLowerCase()
break;
case 'title':
result = "";
me = me.split(' ').map(m=>{
result = `${result} ${m[0].toUpperCase()}${m.slice(1).toLowerCase()}`.trim()
})
break;
case 'slice':
let start = args[0], end = args[1];
start = start && await start.literal()
end = end && await end.literal()
result = me.slice(start, end)
break;
case 'concat':
other = await args[0].literal()
result = `${me}${other}`
break;
case 'find':
let lst = args[1] && await args[1].literal()
result = me[lst?'lastIndexOf': 'indexOf'](await other.literal())
break;
case 'includes':
result = me.includes(await other.literal())
break;
case 'index':
other = await other.literal()
if (other < 0){
result = me.slice(other)[0]
}else result = me[other]
break;
case 'trim':
other = args[0]
if (other) other = await other.literal()
else other = 0
let char = args[1]
if (char) char = await char.literal()
else char = ' '
let esc_regx_char = (char) => char.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
let char_regx = esc_regx_char(char);
switch (other) {
case 1:
result = me.replace(new RegExp(`^${char_regx}+`), '');
break
case 2:
result = me.replace(new RegExp(`${char_regx}+$`), '');
break
case 0:
default:
result = me.replace(new RegExp(`^${char_regx}+|${char_regx}+$`, 'g'), '');
}
break;
case 'length':
result = me.length;
break;
case 'is_empty':
result = !!me
break;
case 'is_blank':
result = !!me.trim()
break;
case 'is_numeric':
result = !!me && !isNaN(Number(me))
break;
case "endswith":
result = me.endsWith(await other.literal())
break;
case "startswith":
result = me.startsWith(await other.literal())
break;
case 'padend':
result = me.padEnd(await other.literal(), await args[1].literal())
break;
case 'padstart':
result = me.padStart(await other.literal(), await args[1].literal())
break;
case 'count':
other = await args[0].literal()
let count = 0;
let position = 0;
while ((position = me.indexOf(other, position)) !== -1) {
count++;
position += other.length;
}
result = count;
break;
case 'reverse':
result = me.split('').reverse().join('');
break
case 'repeat':
result = me.repeat(await other.literal())
break
case 'replace':
let globally = args[2] && await args[2].literal(),
keyword = await other.literal(), replacement = await args[1].literal()
result = me.replace(keyword, replacement)
if (globally){
while(result.includes(keyword)) result = result.replace(keyword, replacement)
}
break
case 'split':
other = other ? await other.literal(): ' '
result = me.split(other)
break
case 'charcode':
let code = args[1] ? await args[1].literal() : 'ascii'
if (code === 'ascii'){
result = me.split("").map(char => char.charCodeAt(0))
}
break;
}
return result
}
number = async (op, args)=>{
let other = args[0]
other = other && await other.literal()
let me = await this.literal()
let result;
switch(op){
case '__add__':
result = me + other;
break;
case '__sub__':
result = me - other;
break;
case '__mul__':
result = me * other;
break;
case '__div__':
if (!other)result = { error:true, value:{name: 'ZeroDivision'}}
else result = me / other;
break;
case '__exp__':
result = me ** other;
break;
case '__floordiv__':
result = Math.floor(me / other);
break;
case '__mod__':
result = me % other;
break;
case '__eq__':
result = me === other
break;
case '__ne__':
result = me !== other
break;
case '__lt__':
result = me < other
break;
case '__lte__':
result = me <= other
break;
case '__gt__':
result = me > other
break;
case '__gte__':
result = me >= other
break;
case 'abs':
result = Math.abs(me)
break;
case 'sqrt':
result = Math.sqrt(me)
break;
case 'to_int':
result = parseInt(me)
break;
case 'to_float':
result = Number(me).toFixed(other)
break;
case 'to_string':
result = me.toString()
break;
case 'tan':
result = Math.tan(me)
break;
case 'sin':
result = Math.sin(me)
break;
case 'cos':
result = Math.cos(me)
break;
case 'atan':
result = Math.atan(me)
break;
case 'atan2':
result = Math.atan2(me)
break;
case 'asin':
result = Math.asin(me)
break;
case 'acos':
result = Math.acos(me)
break;
case 'tanh':
result = Math.tanh(me)
break;
case 'sinh':
result = Math.sinh(me)
break;
case 'cosh':
result = Math.cosh(me)
break;
case 'asinh':
result = Math.asinh(me)
break;
case 'acosh':
result = Math.acosh(me)
break;
case 'atanh':
result = Math.atanh(me)
break;
case 'round':
if (other){
result = Number(Number(me).toFixed(other))
}else result = Math.round(me)
break;
case 'ceil':
result = Math.ceil(me)
break;
case 'floor':
result = Math.floor(me)
break;
case 'is_prime':
if (me <= 1) result = false;
if (me <= 3) result = true;
if (me % 2 === 0 || me % 3 === 0) result = false;
for (let i = 5; i * i <= me; i += 6) {
if (me % i === 0 || me % (i + 2) === 0) {
result = false;
}
}
result = true;
break;
case 'is_odd':
result = (me % 2) === 1
break
case 'is_even':
result = (me % 2) === 0
break
case 'log':
if (!other || (other === 10))
result = Math.log10(me)
else if (other === Math.E){
result = Math.log(me)
}else result = Math.log(me) / Math.log(other)
break;
case 'factorial':
result = this.factorial(me)
break;
case 'is_perfect_square':
if (me < 0) result = false;
let sqrt = Math.sqrt(me);
result = sqrt === Math.floor(sqrt);
break
case 'to_degrees':
result = me * (180 / Math.PI)
break;
case 'to_radians':
result = me * (Math.PI / 180)
break;
}
return result
}
array = async(op, args, options={})=>{
let {config, chain } = options;
await this.literal()
let other = args[0], store, result = null;
switch(op){
case 'push':
result = this.lit.content_addr.push(other.value.path)
store = true;
break;
case 'length':
result = this.lit.content.length;
break;
case 'pop':
if (other){
result = this.lit.content_addr.splice(await other.literal(), 1)[0]
}else result = this.lit.content_addr.pop()
store= true
if(result){
result = {type:'address',value: result}
}
break;
case 'extend':
await other.literal()
result = this.lit.content_addr.push(...other.lit.content_addr)
store = true
break;
case 'slice':
let start = args[0] && await args[0].literal()
let end = args[1] && await args[1].literal()
let new_arr = this.lit.content_addr.slice(start, end)
result = new_arr
let res = await this.account.vm.instantiate({type:'array', value: result, location: config.location}, {chain, pure: true})
result = {type:'address', value: res}
break;
case 'splice':
let spl_replacement = args[2]
if (spl_replacement){
result = this.lit.content_addr.splice(args[0] && await args[0].literal(), args[1] && await args[1].literal(), spl_replacement.value.path )
}else result = this.lit.content_addr.splice(args[0] && await args[0].literal(), args[1] && await args[1].literal())
store = true;
result = {type:'address', value: await this.account.vm.instantiate({type:'array', value: result, location: config.location}, {chain, pure: true})}
break;
case 'index':
other = await other.literal()
if (typeof other === 'number'){
if (other <0){
result = this.lit.content_addr.slice(other)[0]
}else result = this.lit.content_addr[other];
}
if (result) result = {type:'address', value: result}
break;
case 'to_string':
other = other && await other.literal()
result = ''
for (let i=0; i< this.lit.content_addr.length; i++){
let item = this.lit.content_addr[i];
let cont = await this.account.vm.resolve_address(item);
cont = await this.account.vm.cloth_content(cont)
cont = await cont.literal()
if (other === 'ascii'){
if (typeof cont === 'number'){
result = `${result}${String.fromCharCode(cont)}`
}else result = `${result}void`
}else result = `${result}${cont}`
}
break;
case 'is_empty':
result = !this.lit.content_addr.length
break;
case 'clear':
this.lit.content_addr = []
store = true;
break
case "join":
let str_val = ''
let separator = (other && await other.literal()) || ','
for (let i=0; i< this.lit.content_addr.length; i++){
let item = this.lit.content_addr[i]
let val = await this.account.vm.cloth_content(await this.account.vm.resolve_address(item))
let cont = await val.literal()
if (['number', 'string', 'void', 'boolean'].includes(typeof cont))str_val = `${str_val}${i ? separator: ''}${cont}`
}
result = str_val
break;
case 'map':
let confg = other.value;
let map_arr = []
for (let i=0; i< this.lit.content_addr.length; i++){
let item = this.lit.content_addr[i];
let res = await this.account.vm.execute(confg, {call_config: {
identifier: confg.address,
arguments: [
{type:'address', value: item, position: 0},
{...await this.account.vm.parse_aircode(i, {config, chain}), position:1}
],
location: config.location
}, chain})
if (res && res.type!== 'address'){
console.log("Datatypes.js:Query")
}
map_arr.push(res.value)
}
if (args[1] && await args[1].literal()){
this.lit.content_addr = map_arr
store = true
}else result = {type:'address', value: await this.account.vm.instantiate({type:'array', value: map_arr, location: config.location}, {chain, pure: true})}
break;
case 'filter':
let fconfg = other.value;
let fil_arr = []
for (let i=0; i< this.lit.content_addr.length; i++){
let item = this.lit.content_addr[i];
let res = await this.account.vm.execute(fconfg, {call_config: {
identifier: fconfg.address,
arguments: [
{type:'address', value: item, position: 0},
{...await this.account.vm.parse_aircode(i, {config, chain}), position:1}
],
location: config.location
}, chain, cloth: true})
if (res && !!await res.literal())
fil_arr.push(item)
}
if (args[1] && await args[1].literal()){
this.lit.content_addr = fil_arr
store = true
}else result = {
type:'address',
value: await this.account.vm.instantiate({
type:'array',
value: fil_arr,
location: config.location},
{chain, pure: true})
}
break;
case 'find':
let fnconfg = other.value;
for (let i=0; i< this.lit.content_addr.length; i++){
let item = this.lit.content_addr[i];
let index = await this.account.vm.parse_aircode(i, {config, chain})
let res = await this.account.vm.execute(fnconfg, {call_config: {
identifier: fnconfg.address,
arguments: [
{type:'address', value: item, position: 0},
{...index, position:1}
],
location: config.location
}, chain, cloth: true})
if (res && !!await res.literal())
{
result = index
break
}
}
case 'includes':
other = await other.literal()
for (let i=0; i< this.lit.content_addr.length; i++){
let item = this.lit.content_addr[i];
let val = await this.account.vm.cloth_content(await this.account.vm.resolve_address(item))
if (await val.literal() === other){
result = true;
break
}
}
result = result || false
break;
case 'copy':
result = {
type:'address',
value: await this.account.vm.instantiate({
type:'array',
value: [...this.lit.content_addr],
location: config.location},
{chain, pure: true})
}
break;
case 'reverse':
this.lit.content_addr.reverse()
store = true
break;
}
if (store) {
let oracle = this.account.manager.oracle
let obj = {content: JSON.stringify(this.lit.content_addr), __classifier__: 'array', uid: this.lit.uid}
let path_split = this.value.path.split('/')
await oracle.fs.store(obj, {path: path_split.slice(0,-1).join('/'), hash: path_split[path_split.length-1], is_instance: true, type: 'twain'})
}
return result
}
twain = async(op, args, options)=>{
let {config, chain} = options
await this.literal()
let result = null, store, other = args[0];
switch(op){
case 'entries':
result = []
for (let p in this.lit.content_addr){
let pair = this.lit.content_addr[p]
result.push(await this.account.vm.instantiate({
type:'array',
value: pair,
location: config.location},
{chain, pure: true}))
}
result = {type:'address', value: await this.account.vm.instantiate({
type:'array',
value: result,
location: config.location},
{chain, pure: true})
}
break;
case 'keys':
result = []
for (let p in this.lit.content_addr){
let pair = this.lit.content_addr[p]
result.push(pair[0])
}
result = {type:'address', value: await this.account.vm.instantiate({
type:'array',
value: result,
location: config.location},
{chain, pure: true})
}
break;
case 'values':
result = []
for (let p in this.lit.content_addr){
let pair = this.lit.content_addr[p]
result.push(pair[1])
}
result = {type:'address', value: await this.account.vm.instantiate({
type:'array',
value: result,
location: config.location},
{chain, pure: true})
}
break;
case 'get':
if(typeof other === 'string'){}
else other = other && await other.literal()
let hash = await this.account.manager.oracle.hash(other, 'sha1')
let val = this.lit.content_addr[hash]
if (val)result = {type: 'address', value: val[1]}
break;
case 'set':
other = other && await other.literal()
let shash = await this.account.manager.oracle.hash(other, 'sha1')
this.lit.content_addr[shash] = [args[0].value.path, args[1].value.path]
store = true;
break;
case 'remove':
other = other && await other.literal()
let rhash = await this.account.manager.oracle.hash(other, 'sha1')
let rval = this.lit.content_addr[rhash]
if(rval)result = true
else result = false;
delete this.lit.content_addr[rhash]
store = true;
break
case 'copy':
result = {type:'address', value: await this.account.vm.instantiate({
type:'twain',
value: this.lit.content_addr,
location: config.location},
{chain, pure: true})
}
break;
case 'clear':
this.lit.content_addr = {}
store = true;
break
}
if (store) {
let oracle = this.account.manager.oracle
let obj = {content: JSON.stringify(this.lit.content_addr), __classifier__: 'twain', uid: this.lit.uid}
let path_split = this.value.path.split('/')
await oracle.fs.store(obj, {path: path_split.slice(0,-1).join('/'), hash: path_split[path_split.length-1], is_instance: true, type: 'twain'})
}
return result
}
factorial = (value)=>{
if (value === 0)
return 1
return value * this.factorial(value - 1)
}
}
export default Datatypes;