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); }
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 static Frame Through(TaskMaster task_master, long id, SourceReference source_ref, long start, long end, Context context, Frame container) { var result = new Frame(task_master, id, source_ref, context, container); if (end < start) { return(result); } for (long it = 0; it <= (end - start); it++) { result[TaskMaster.OrdinalNameStr(it + 1)] = start + it; } return(result); }
public void Set(long ordinal, object value) { Set(TaskMaster.OrdinalNameStr(ordinal), value); }
protected override bool Run() { if (connection == null) { new Lookup(task_master, source_ref, new [] { "connection" }, context).Notify(return_value => { if (return_value is ReflectedFrame) { Object backing = ((ReflectedFrame)return_value).Backing; if (backing is DbConnection) { connection = (DbConnection)backing; if (Interlocked.Decrement(ref interlock) == 0) { task_master.Slot(this); } return; } } task_master .ReportOtherError(source_ref, "Expected “connection” to come from “sql:” import."); }); new Lookup(task_master, source_ref, new [] { "sql_query" }, context).Notify(return_value => { if (return_value is Stringish) { query = return_value.ToString(); if (Interlocked.Decrement(ref interlock) == 0) { task_master.Slot(this); } return; } task_master.ReportOtherError(source_ref, string.Format( "Expected type Str for “sql_query”, but got {0}.", Stringish.NameForType(return_value.GetType()))); }); new Lookup(task_master, source_ref, new [] { "sql_row_tmpl" }, context).Notify(return_value => { if (return_value is Template) { row_tmpl = (Template)return_value; if (Interlocked.Decrement(ref interlock) == 0) { task_master.Slot(this); } return; } task_master.ReportOtherError(source_ref, string.Format( "Expected type Template for “sql_row_tmpl”, but got {0}.", Stringish.NameForType(return_value.GetType()))); }); if (Interlocked.Decrement(ref interlock) > 0) { return(false); } } try { var command = connection.CreateCommand(); command.CommandType = System.Data.CommandType.Text; command.CommandText = query; var reader = command.ExecuteReader(); if (debug) { Console.WriteLine("SQL Query to {0}: {1}", connection, query); } NameChooser name_chooser = (rs, it) => TaskMaster.OrdinalNameStr(it); var retrievers = new List <Retriever>(); for (int col = 0; col < reader.FieldCount; col++) { var column = col; if (reader.GetName(col) == "ATTRNAME") { name_chooser = (rs, it) => rs.GetString(column); continue; } if (reader.GetName(col).StartsWith("$")) { var attr_name = reader.GetName(col).Substring(1); if (!task_master.VerifySymbol(source_ref, attr_name)) { return(false); } retrievers.Add((rs, frame, _task_master) => frame.Set(attr_name, rs.IsDBNull(column) ? Precomputation.Capture(Unit.NULL) : Lookup.Do(rs.GetString(column).Split('.')))); continue; } Unpacker unpacker; if (!unpackers.TryGetValue(reader.GetFieldType(col), out unpacker)) { task_master .ReportOtherError( source_ref, string.Format( "Cannot convert SQL type “{0}” for column “{1}” into Flabbergast type.", reader.GetFieldType(col), reader.GetName(col))); } if (!task_master.VerifySymbol(source_ref, reader.GetName(col))) { return(false); } retrievers.Add(Bind(reader.GetName(col), col, unpacker)); } var list = new MutableFrame(task_master, source_ref, context, self); for (int it = 1; reader.Read(); it++) { var frame = new MutableFrame(task_master, new JunctionReference(string.Format("SQL template instantiation row {0}", it), "<sql>", 0, 0, 0, 0, source_ref, row_tmpl.SourceReference), Context.Append(list.Context, row_tmpl.Context), list); foreach (var r in retrievers) { r(reader, frame, task_master); } foreach (var name in row_tmpl.GetAttributeNames()) { if (!frame.Has(name)) { frame.Set(name, row_tmpl[name]); } } list.Set(name_chooser(reader, it), frame); } list.Slot(); result = list; return(true); } catch (DataException e) { task_master.ReportOtherError(source_ref, e.Message); return(false); } }