Symbol, sum experiments

JavaScript

function makeSummator () {
	let accum = 0;
  
	function sum (number) {  
    accum += number;
    return sum;
  }
  
  sum.toString = () => {
  	console.error('toString');
	  return accum;
  };
  
  sum[Symbol.toPrimitive] = function (hint) {
  	console.error('hint', hint);
    
    switch (hint) {
      case 'string':
        return accum;        
      case 'number':
        return accum;
      case 'default':
        return accum;
      default:
        return accum;
    }
  }
  
  return sum;
}

function add(...args) {
  function recSum(num) {
    return add(...args, num)
  }
  
  recSum.valueOf = function() {
    return args.reduce((acc, n) => acc + n, 0)
  };
  
  return recSum;
}

const sum = makeSummator();

console.error(sum(1)(2)(4)(5));
console.error(+sum(1)(2)(4)(5));

//console.error('add', add(1)(2)(4)(5));
//console.error('add', +add(1)(2)(4)(5));

class Riba {
	/* get [Symbol.toStringTag]() {
	    return Riba.name;
	  } */

  constructor (data) {
    this.data = data;
    
  }
  
  /* get data () {
    return this.data;
  }
  
  set data (data) {
    this.data = data;
  } */
  
  /* toString (...args) {
    console.error('toString', args);
    return 'string';
  }
  
  valueOf (...args) {
    console.error('valueOf', args);
    return 1;
  } */
}

const riba = new Riba(1);

//console.error('riba', riba);
/* console.error('riba', Object.prototype.toString.call(riba));
console.error('convert to string', riba + 'string');
console.error('conver to number', +riba);
console.error('conver to number', Number(riba));
console.error('conver to number', riba * 1);
console.error('conver to number', parseInt(riba)); */