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);
        }