public override bool Combine(Operator op, object b, out StoryVar result) { result = default(StoryVar); switch (op) { case Operator.Add: { if (!(b is HarloweDatamap)) { return(false); } var bMap = (HarloweDatamap)b; var output = new Dictionary <string, StoryVar>(this.Dictionary); bMap.Dictionary.ToList().ForEach(x => output[x.Key] = x.Value); result = new HarloweDatamap(output); break; } case Operator.Subtract: { // Going out on a limb here, adding subtraction support to Harlowe: // Treat any set as keys to remove from the dictionary IEnumerable <string> keys; if (b is HarloweDatamap) { keys = ((HarloweDatamap)b).Dictionary.Keys; } else if (b is HarloweDataset) { keys = ((HarloweDataset)b).Values.Select(v => v.ToString()); } else if (b is HarloweArray) { keys = ((HarloweArray)b).Values.Select(v => v.ToString()); } else { return(false); } var keySet = new HashSet <string>(keys); // A little linq-fu result = new HarloweDatamap(this.Dictionary .Where(pair => !keySet.Contains(pair.Key)) .ToDictionary( pair => pair.Key, pair => pair.Value, System.StringComparer.OrdinalIgnoreCase ) ); break; } default: return(false); } return(true); }
public override IVarType Duplicate() { var clone = new HarloweDatamap(); foreach (var pair in this.Dictionary) { clone.Dictionary[pair.Key] = pair.Value.Duplicate(); } return(clone); }