ЛР№3 Обчислювальний граф (15 балів)

Реалізувати на JavaScript обчислювальний напрямлений граф для обчислення значень виразів.

На вхід графа подаються параметри із часовою міткою, проходячи через граф, дані перетворюються, відповідно до арифметичного виразу,  в задане число.

Вузлами графа є об'єкти, відповідальні за елементарні операції ( додавання, віднімання, множення, ділення ), які виконуються за умови наявності на вхідних ребрах даних із однаковою часовою міткою. Якщо на вхідних ребрах відсутні дані із однаковою часовою міткою, то вони зберігаються у сховищі даних відповідного ребра до тих пір, поки не з'явиться можливість їх обробити.

Арифметичний вираз обирається відповідно до варіанту

  1. a * b + c / ( d - e )
  2. a + ( b - c / d ) * e
  3. ( a - b ) * c + d / e
  4. a + ( b + c / d ) * e
  5. a - ( b + c - d ) / e
  6. a + b / ( c + d * e )
  7. a + b - c / ( d * e - f)
  8. a / b - c / ( d + e / f )
  9. a / ( b + c / (d + e / f ) )
  10. a * ( b + c * (d - e ) )
  11. a / ( b / c - d * e )
  12. a - b * ( c + d * e  )
  13. a  * ( b + c / d - e / ( f  - g ) )
  14. a / b + c * ( d  - e )
  15. a * ( b + c / ( d + e ) )
  16. a + b / c + d / e
  17. a - b * c / ( d * e )

Приклад коду:

// контейнер повідомлення
var message=function(value, token){
     this.value=value;
     this.token=token;
}

var input=function(){
   this.subscribers=[];
   this.send:function(message){
         for(var i=0; i<this.subscribers.length; i++){
              this.subscribers[i](message);
         }
   }
}
var output=function(a){
   a.subscribers.push(function(message){
        console.log(message);
   });
}

var plus=function(a,b){
   // перелік підписок
   this.subscribers=[];

   // підписка на події від джерел a та b
   var self=this;
   a.subscribers.push(function(message){
        self.queueA.push(message);
        self.calc();
   });
   b.subscribers.push(function(message){
        self.queueB.push(message);
        self.calc();
   });

   this.queueA=[];
   this.queueB=[];
   this.calc=function(){
         // знайти в масивах this.queueA та this.queueB
         // повідомлення з однаковими значеннями атрибута token
         // якщо знайдено, то
         //      додати значення атрибутів value
         //      результат додавання зберегти в змінну summa
                 this.send(new message(summa, token));
   }
   this.send:function(message){
         for(var i=0; i<queue.length; i++){
              this.queue.send(message);
         }
   }
}

var a=new input();
var b=new input();
var o=new output(new plus(a,b));

var token=1;
a.send(new message(1,token))
b.send(new message(3,token))