public static BoxedValue Box(SuffixString value) { var box = new BoxedValue(); box.Clr = value; box.Tag = TypeTags.SuffixString; return(box); }
/// <summary> /// /// </summary> /// <param name="left"></param> /// <param name="right"></param> /// <returns></returns> public static SuffixString Concat(object left, object right) { var leftValue = left.ToString(); var rightValue = right.ToString(); var @new = new SuffixString(); @new.Length = leftValue.Length + rightValue.Length; @new.Builder = new StringBuilder(leftValue, @new.Length); @new.Builder.Append(rightValue); return(@new); }
/// <summary> /// Implements the binary `+` operator. /// </summary> public static BoxedValue add(BoxedValue l, BoxedValue r) { if (l.Tag == TypeTags.SuffixString) { var newString = SuffixString.Concat( l.SuffixString, TypeConverter.ToString(TypeConverter.ToPrimitive(r))); return(BoxedValue.Box(newString)); } if (l.Tag == TypeTags.String || r.Tag == TypeTags.String || r.Tag == TypeTags.SuffixString) { var newString = SuffixString.Concat( TypeConverter.ToString(TypeConverter.ToPrimitive(l)), TypeConverter.ToString(TypeConverter.ToPrimitive(r))); return(BoxedValue.Box(newString)); } var lPrim = TypeConverter.ToPrimitive(l); var rPrim = TypeConverter.ToPrimitive(r); if (lPrim.Tag == TypeTags.SuffixString) { var newString = SuffixString.Concat( lPrim.SuffixString, TypeConverter.ToString(rPrim)); return(BoxedValue.Box(newString)); } if (lPrim.Tag == TypeTags.String || rPrim.Tag == TypeTags.String || rPrim.Tag == TypeTags.SuffixString) { var newString = SuffixString.Concat( TypeConverter.ToString(lPrim), TypeConverter.ToString(rPrim)); return(BoxedValue.Box(newString)); } return(BoxedValue.Box(TypeConverter.ToNumber(lPrim) + TypeConverter.ToNumber(rPrim))); }
/* * override x.Finalize() = * if x.Parent !== null then * x.Parent.Suffixes <- x.Parent.Suffixes - 1 * if x.Suffixes = 0 * then x.Builder.Remove(x.Parent.Length, x.Length-x.Parent.Length) |> ignore * else x.Parent.Suffixes <- x.Parent.Suffixes + x.Suffixes */ /// <summary> /// /// </summary> /// <param name="current"></param> /// <param name="right"></param> /// <returns></returns> public static SuffixString Concat(SuffixString current, object right) { SuffixString @new; StringBuilder builder; var value = right.ToString(); if (current.Length == current.Builder.Length) { builder = current.Builder.Append(value); } else { var newLength = current.Length + value.Length; builder = new StringBuilder(current.ToString(), newLength); builder.Append(value); } @new = new SuffixString(); @new.Length = builder.Length; @new.Builder = builder; return(@new); }
public static BoxedValue ToBoxedValue(SuffixString s) { return(BoxedValue.Box(s)); }