protected override bool Run() { if (input == null) { Computation input_lookup = new Lookup(master, source_reference, new [] { "arg" }, context); input_lookup.Notify(input_result => { if (input_result is Stringish) { input = input_result.ToString(); if (Interlocked.Decrement(ref interlock) == 0) { master.Slot(this); } } else { master.ReportOtherError(source_reference, "Input argument must be a string."); } }); master.Slot(input_lookup); if (Interlocked.Decrement(ref interlock) > 0) { return(false); } } var frame = new Frame(master, master.NextId(), source_reference, context, container); for (int it = 0; it < input.Length; it++) { frame[TaskMaster.OrdinalNameStr(it + 1)] = (long)Char.ConvertToUtf32(input, it); } result = frame; return(true); }
public Frame(TaskMaster task_master, SourceReference source_ref, Context context, Frame container) { this.task_master = task_master; SourceReference = source_ref; Context = Context.Prepend(this, context); Container = container ?? this; Id = TaskMaster.OrdinalName(task_master.NextId()); }
protected override bool Run() { if (!state) { var input_lookup = new Lookup(master, source_ref, new [] { "args" }, context); input_lookup.Notify(HandleArgs); master.Slot(input_lookup); var transformation_lookup = new Lookup(master, source_ref, new [] { "transformations" }, context); transformation_lookup.Notify(HandleTransformations); master.Slot(transformation_lookup); state = true; if (Interlocked.Decrement(ref interlock) > 0) { return(false); } } var output_frame = new Frame(master, master.NextId(), source_ref, context, self); for (var index = 0; index < input.Length; index++) { var buffer = new StringBuilder(); for (var it = 0; it < input[index].Length; it += Char.IsSurrogatePair(input[index], it) ? 2 : 1) { var c = Char.ConvertToUtf32(input[index], it); var is_surrogate = Char.IsSurrogatePair(input[index], it); string replacement; if (single_substitutions.TryGetValue(c, out replacement)) { buffer.Append(replacement); } else { bool matched = false; foreach (var range in ranges.Values) { if (c >= range.start && c <= range.end) { var utf8 = new byte[4]; Encoding.UTF8.GetBytes(input[index], it, is_surrogate ? 2 : 1, utf8, 0); buffer.Append(String.Format(range.replacement, c, (int)input[index][it], is_surrogate ? (int)input[index][it + 1] : 0, (int)utf8[0], (int)utf8[1], (int)utf8[2], (int)utf8[3])); matched = true; break; } } if (!matched) { buffer.Append(Char.ConvertFromUtf32(c)); } } } output_frame[TaskMaster.OrdinalNameStr(index)] = new SimpleStringish(buffer.ToString()); } result = output_frame; return(true); }
protected override bool Run() { if (mappings.Count == 0) { interlock = categories.Count + 2; Computation input_lookup = new Lookup(master, source_reference, new [] { "arg" }, context); input_lookup.Notify(input_result => { if (input_result is Stringish) { input = input_result.ToString(); if (Interlocked.Decrement(ref interlock) == 0) { master.Slot(this); } } else { master.ReportOtherError(source_reference, "Input argument must be a string."); } }); master.Slot(input_lookup); foreach (var entry in categories) { var lookup = new Lookup(master, source_reference, new [] { entry.Value }, context); lookup.Notify(cat_result => { mappings[entry.Key] = cat_result; if (Interlocked.Decrement(ref interlock) == 0) { master.Slot(this); } }); master.Slot(lookup); } if (Interlocked.Decrement(ref interlock) > 0) { return(false); } } var frame = new Frame(master, master.NextId(), source_reference, context, container); for (int it = 0; it < input.Length; it++) { frame[TaskMaster.OrdinalNameStr(it + 1)] = mappings[Char.GetUnicodeCategory(input[it])]; } result = frame; return(true); }
public Frame(TaskMaster task_master, SourceReference source_ref, Context context, Frame container) : this(TaskMaster.OrdinalName(task_master.NextId()), source_ref, context, container) { }