Advertisement
Guest User

Untitled

a guest
Dec 17th, 2018
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. // TODO: rewrite me
  3. function solve(solution) { // ax+b = 0
  4.   var vala, valb;
  5.  
  6.   const n = (err, v) => {
  7.     if ( err )
  8.       math('-', v, n);
  9.     else
  10.       solution(v);
  11.   }
  12.   const AdivB = (err, d) => {
  13.     if ( err )
  14.       math('/', vala, valb, AdivB);
  15.     else
  16.       math('-', d, n);
  17.   }
  18.   const cbb = (err, b) => {
  19.     if (err)
  20.       math('b', cbb);
  21.     else {
  22.       valb = b;
  23.       if (vala != 0) math('/', vala, valb, AdivB);
  24.       else solution(b == 0 ? [] : null);
  25.     }
  26.   }
  27.   const cba = (err, a) => {
  28.     if (err)
  29.       math('a', cba);
  30.     else {
  31.       vala = a;
  32.       math('b', cbb);
  33.     }
  34.   }
  35.   math('a', cba);
  36. }
  37.  
  38. function math(what, ...args_) {
  39.   var vars = {a: 3, b: 2};
  40.  
  41.   if(!args_.length) throw new Error('Callback not found!');
  42.   var args = args_.slice(0, -1), cb = args_[args.length];
  43.   function pass(error, value) {
  44.     // An AJAX request to a real server could be here.
  45.     if(Math.random() < 0.2) {
  46.       error = new Error('Network error');
  47.       value = null;
  48.     }
  49.     setTimeout(cb.bind(null, error, value), 500 + Math.random() * 500 | 0);
  50.   }
  51.   switch(what) {
  52.     case 'a':
  53.     case 'b':
  54.       pass(null, vars[what]);
  55.       break;
  56.     case '/':
  57.       if(args.length < 2) pass(new Error('Not enough arguments'));
  58.       else pass(null, args[0] / args[1]);
  59.       break;
  60.     case '-':
  61.       if(args.length < 1) pass(new Error('Not enough arguments'));
  62.       else pass(null, -args[0]);
  63.       break;
  64.     default:
  65.       pass(new Error('Invalid command'));
  66.   }
  67. }
  68.  
  69.  
  70.  
  71. function solvep(solution) {
  72.   var va = null, vb = null, div, ans;
  73.  
  74.   const f = (...args) => new Promise((success, error) => {
  75.     var args_ = args.slice(1);
  76.     args_.push((err, a) => { if (err) error(...args); else success(a); });
  77.     math(args[0], ...args_);
  78.   });
  79.  
  80.   const neg = () => new Promise ((success, error) => {
  81.       if ( div === null || div === [] )
  82.         success(div);
  83.       else
  84.         f('-', div).then((n) => { ans = n; success(ans); }, f);
  85.     });
  86.  
  87.   const getAdivB = () => new Promise ((success, error) => {
  88.       if ( va == 0 ) div = null;
  89.       if ( va == 0 && vb == 0 ) div = [];
  90.       if ( va == 0 )
  91.         success();
  92.       else
  93.         f('/', va, vb).then( (d) =>{ div = d; success(); }, f);
  94.     });
  95.  
  96.   const getAB = () => new Promise((success, error) =>
  97.     Promise.all([f('a'), f('b')]).then((v) => { va = v[0]; vb = v[1]; success(); } )
  98.   );
  99.  
  100.   getAB().then(getAdivB).then(neg).then(solution);
  101. }
  102.  
  103. async function solvea() {
  104.  
  105.   const f = (...args) => new Promise((success, error) => {
  106.     var args_ = args.slice(1);
  107.     args_.push((err, a) => { if (err) error(...args); else success(a); });
  108.     math(args[0], ...args_);
  109.   });
  110.  
  111.   const neg = (div) => new Promise ((success, error) => {
  112.       if ( div === null || div === [] )
  113.         success(div);
  114.       else
  115.         f('-', div).then((n) => success(n), f);
  116.     });
  117.  
  118.   const getAdivB = (a, b) => new Promise ((success, error) => {
  119.     var dv;
  120.       if ( a == 0 ) d = null;
  121.       if ( a == 0 && b == 0 ) dv = [];
  122.       if ( a == 0 )
  123.         success(dv);
  124.       else
  125.         f('/', a, b).then( (d) => success(d), f);
  126.     });
  127.  
  128.   const get = (p) => new Promise((success, error) => {
  129.     f(p).then((a) => success(a), f)
  130.   });
  131.  
  132.   va = get('a');
  133.   vb = get('b');
  134.   va = await va;
  135.   vb = await vb;
  136.   div = await getAdivB(va, vb);
  137.   ans = await neg(div);
  138.   return ans;
  139. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement