private SUTime.Temporal AddEndPoints(SUTime.Duration d, SUTime.Time beginTime, SUTime.Time endTime)
 {
     SUTime.Temporal t = d;
     if (d != null && (beginTime != null || endTime != null))
     {
         SUTime.Time b = beginTime;
         SUTime.Time e = endTime;
         if (b == SUTime.TimeRefUnknown)
         {
             b = new SUTime.RefTime("UNKNOWN");
         }
         else
         {
             if (b == SUTime.TimeUnknown)
             {
                 b = new SUTime.SimpleTime("UNKNOWN");
             }
         }
         if (e == SUTime.TimeRefUnknown)
         {
             e = new SUTime.RefTime("UNKNOWN");
         }
         else
         {
             if (e == SUTime.TimeUnknown)
             {
                 e = new SUTime.SimpleTime("UNKNOWN");
             }
         }
         t = new SUTime.Range(b, e, d);
     }
     return(t);
 }
 public override IValue Apply(Env env, IList <IValue> @in)
 {
     if (@in.Count >= 1)
     {
         SUTime.Temporal temporal = null;
         object          t        = @in[0].Get();
         if (t is SUTime.Temporal)
         {
             temporal = (SUTime.Temporal)@in[0].Get();
         }
         else
         {
             if (t is TimeExpression)
             {
                 temporal = ((TimeExpression)t).GetTemporal();
             }
             else
             {
                 throw new ArgumentException("Type mismatch on arg0: Cannot apply " + this + " to " + @in);
             }
         }
         string quant = null;
         int    scale = 1;
         if (@in.Count >= 2 && @in[1] != null)
         {
             object arg1 = @in[1].Get();
             if (arg1 is string)
             {
                 quant = (string)arg1;
             }
             else
             {
                 if (arg1 is IList)
                 {
                     IList <ICoreMap> cms = (IList <ICoreMap>)arg1;
                     quant = ChunkAnnotationUtils.GetTokenText(cms, typeof(CoreAnnotations.TextAnnotation));
                     if (quant != null)
                     {
                         quant = quant.ToLower();
                     }
                 }
                 else
                 {
                     throw new ArgumentException("Type mismatch on arg1: Cannot apply " + this + " to " + @in);
                 }
             }
         }
         if (@in.Count >= 3 && @in[2] != null)
         {
             Number arg2 = (Number)@in[2].Get();
             if (arg2 != null)
             {
                 scale = arg2;
             }
         }
         SUTime.Duration period = temporal.GetPeriod();
         if (period != null && scale != 1)
         {
             period = period.MultiplyBy(scale);
         }
         return(new Expressions.PrimitiveValue("PeriodicTemporalSet", new SUTime.PeriodicTemporalSet(temporal, period, quant, null)));
     }
     else
     {
         throw new ArgumentException("Invalid number of arguments to " + this.name);
     }
 }
 public override IValue Apply(Env env, IList <IValue> @in)
 {
     if (@in.Count == 2)
     {
         SUTime.Duration d = (SUTime.Duration)@in[0].Get();
         if (@in[1].Get() is Number)
         {
             int m = ((Number)@in[1].Get());
             return(new Expressions.PrimitiveValue("DURATION", d.MultiplyBy(m)));
         }
         else
         {
             if (@in[1].Get() is string)
             {
                 Number n = System.Convert.ToInt32((string)@in[1].Get());
                 if (n != null)
                 {
                     return(new Expressions.PrimitiveValue("DURATION", d.MultiplyBy(n)));
                 }
                 else
                 {
                     return(null);
                 }
             }
             else
             {
                 throw new ArgumentException("Invalid arguments to " + this.name);
             }
         }
     }
     else
     {
         if (@in.Count == 5 || @in.Count == 3)
         {
             IList <ICoreMap> durationStartTokens = (IList <ICoreMap>)@in[0].Get();
             Number           durationStartVal    = (durationStartTokens != null) ? durationStartTokens[0].Get(typeof(CoreAnnotations.NumericCompositeValueAnnotation)) : null;
             IList <ICoreMap> durationEndTokens   = (IList <ICoreMap>)@in[1].Get();
             Number           durationEndVal      = (durationEndTokens != null) ? durationEndTokens[0].Get(typeof(CoreAnnotations.NumericCompositeValueAnnotation)) : null;
             IList <ICoreMap> durationUnitTokens  = (IList <ICoreMap>)@in[2].Get();
             TimeExpression   te            = (durationUnitTokens != null) ? durationUnitTokens[0].Get(typeof(TimeExpression.Annotation)) : null;
             SUTime.Duration  durationUnit  = (SUTime.Duration)te.GetTemporal();
             SUTime.Duration  durationStart = (durationStartVal != null) ? durationUnit.MultiplyBy(durationStartVal) : null;
             SUTime.Duration  durationEnd   = (durationEndVal != null) ? durationUnit.MultiplyBy(durationEndVal) : null;
             SUTime.Duration  duration      = durationStart;
             if (duration == null)
             {
                 if (durationEnd != null)
                 {
                     duration = durationEnd;
                 }
                 else
                 {
                     duration = new SUTime.InexactDuration(durationUnit);
                 }
             }
             else
             {
                 if (durationEnd != null)
                 {
                     duration = new SUTime.DurationRange(durationStart, durationEnd);
                 }
             }
             SUTime.Time     beginTime = (@in.Count > 3) ? (SUTime.Time)@in[3].Get() : null;
             SUTime.Time     endTime   = (@in.Count > 4) ? (SUTime.Time)@in[4].Get() : null;
             SUTime.Temporal temporal  = this.AddEndPoints(duration, beginTime, endTime);
             if (temporal is SUTime.Range)
             {
                 return(new Expressions.PrimitiveValue("RANGE", temporal));
             }
             else
             {
                 return(new Expressions.PrimitiveValue("DURATION", temporal));
             }
         }
         else
         {
             throw new ArgumentException("Invalid number of arguments to " + this.name);
         }
     }
 }
 public override SUTime.Time Add(SUTime.Duration offset)
 {
     return(new SUTime.RelativeTime(this, SUTime.TemporalOp.OffsetExact, offset));
 }
 public override SUTime.Range GetRange(int flags, SUTime.Duration granularity)
 {
     return(new SUTime.Range(this, this));
 }