public override void ApplySnapshot(INode node, IMap <I, S> snapshot)
        {
            StateTreeUtils.Typecheck(this, snapshot);

            var map = GetValue(node);

            var keysmap = map.Keys.Aggregate(new Map <I, bool>(), (acc, key) =>
            {
                acc[key] = false;
                return(acc);
            });

            foreach (var pair in snapshot)
            {
                map[pair.Key]     = SubType.Create(pair.Value, node.Environment);
                keysmap[pair.Key] = true;
            }

            foreach (var pair in keysmap)
            {
                if (!pair.Value)
                {
                    map.Remove(pair.Key);
                }
            }
        }
        public override void ApplyPatchLocally(INode node, string subpath, IJsonPatch patch)
        {
            var map = GetValue(node);

            switch (patch.Operation)
            {
            case JsonPatchOperation.Add:
            case JsonPatchOperation.Replace:
                map[Converter(subpath)] = SubType.Create((S)patch.Value, node.Environment);
                break;

            case JsonPatchOperation.Remove:
                map.Remove(Converter(subpath));
                break;
            }
        }