namespace bts.SilverPine{
   using BGC;
   using System;
   [DataStreamUserRespresentation("throttle")]
   public class ThrottleStream : ViewStream{
      private readonly ViewStream _main_stream;
      private readonly TimeSpan _ts;
      private readonly ViewStreamDatabase _vsd;
      private DateTime _last_fire_time = DateTime.MinValue;

      public ThrottleStream (ViewStream main_stream, int throttle_seconds)
      :
      this(main_stream, TimeSpan.FromSeconds(throttle_seconds), ViewStreamDatabase.instance)
      {
      }

      public ThrottleStream (ViewStream main_stream, TimeSpan ts, ViewStreamDatabase vsd){
         _main_stream = main_stream;
         _ts = ts;
         _vsd;
      }

       protected override void myOnFirstSubscriber() {
         _main_stream.onChange += _handle_base_stream_update;
      }

      protected override void myOnLastSubscriber() {
         _main_stream.onChange -= _handle_base_stream_update;
      }

      private void _handle_base_stream_update(object dp_obj){
         if (DateTime.Now - _last_fire_time >= _ts){
            DataPacket dp_in = dp_obj;
            _last_fire_time = DateTime.Now;
            DataPacket dp = BlueDataUtility.build_dp_inc(dp_in.newRow, myLastValue as DataPacket);
            myFireEvent(dp);
         }
      }
 }
}