Format imported Cloner code

This commit is contained in:
2020-12-10 12:35:48 -07:00
parent 3afad56f71
commit 738628595e
2 changed files with 37 additions and 36 deletions

View File

@@ -1,53 +1,54 @@
package kiss.cloner; package kiss.cloner;
import Array; import Array;
import haxe.ds.ObjectMap; import haxe.ds.ObjectMap;
import Type.ValueType; import Type.ValueType;
import haxe.ds.IntMap; import haxe.ds.IntMap;
import haxe.ds.StringMap; import haxe.ds.StringMap;
class Cloner {
var cache:ObjectMap<Dynamic,Dynamic>; class Cloner {
var classHandles:Map<String,Dynamic->Dynamic>; var cache:ObjectMap<Dynamic, Dynamic>;
var classHandles:Map<String, Dynamic->Dynamic>;
var stringMapCloner:MapCloner<String>; var stringMapCloner:MapCloner<String>;
var intMapCloner:MapCloner<Int>; var intMapCloner:MapCloner<Int>;
public function new():Void { public function new():Void {
stringMapCloner = new MapCloner(this,StringMap); stringMapCloner = new MapCloner(this, StringMap);
intMapCloner = new MapCloner(this,IntMap); intMapCloner = new MapCloner(this, IntMap);
classHandles = new Map<String,Dynamic->Dynamic>(); classHandles = new Map<String, Dynamic->Dynamic>();
classHandles.set('String',returnString); classHandles.set('String', returnString);
classHandles.set('Array',cloneArray); classHandles.set('Array', cloneArray);
classHandles.set('haxe.ds.StringMap',stringMapCloner.clone); classHandles.set('haxe.ds.StringMap', stringMapCloner.clone);
classHandles.set('haxe.ds.IntMap',intMapCloner.clone); classHandles.set('haxe.ds.IntMap', intMapCloner.clone);
} }
function returnString(v:String):String { function returnString(v:String):String {
return v; return v;
} }
public function clone <T> (v:T):T { public function clone<T>(v:T):T {
cache = new ObjectMap<Dynamic,Dynamic>(); cache = new ObjectMap<Dynamic, Dynamic>();
var outcome:T = _clone(v); var outcome:T = _clone(v);
cache = null; cache = null;
return outcome; return outcome;
} }
public function _clone <T> (v:T):T { public function _clone<T>(v:T):T {
#if js #if js
if(Std.is(v, String)) if (Std.is(v, String))
return v; return v;
#end #end
#if neko #if neko
try { try {
if(Type.getClassName(cast v) != null) if (Type.getClassName(cast v) != null)
return v; return v;
}catch(e:Dynamic) {} } catch (e:Dynamic) {}
#else #else
if(Type.getClassName(cast v) != null) if (Type.getClassName(cast v) != null)
return v; return v;
#end #end
switch(Type.typeof(v)){ switch (Type.typeof(v)) {
case TNull: case TNull:
return null; return null;
case TInt: case TInt:
@@ -61,8 +62,8 @@ class Cloner {
case TFunction: case TFunction:
return v; return v;
case TClass(c): case TClass(c):
if(!cache.exists(v)) if (!cache.exists(v))
cache.set(v,handleClass(c, v)); cache.set(v, handleClass(c, v));
return cache.get(v); return cache.get(v);
case TEnum(e): case TEnum(e):
return v; return v;
@@ -71,7 +72,7 @@ class Cloner {
} }
} }
function handleAnonymous (v:Dynamic):Dynamic { function handleAnonymous(v:Dynamic):Dynamic {
var properties:Array<String> = Reflect.fields(v); var properties:Array<String> = Reflect.fields(v);
var anonymous:Dynamic = {}; var anonymous:Dynamic = {};
for (i in 0...properties.length) { for (i in 0...properties.length) {
@@ -81,21 +82,21 @@ class Cloner {
return anonymous; return anonymous;
} }
function handleClass <T> (c:Class<T>,inValue:T):T { function handleClass<T>(c:Class<T>, inValue:T):T {
var handle:T->T = classHandles.get(Type.getClassName(c)); var handle:T->T = classHandles.get(Type.getClassName(c));
if(handle == null) if (handle == null)
handle = cloneClass; handle = cloneClass;
return handle(inValue); return handle(inValue);
} }
function cloneArray <T> (inValue:Array<T>):Array<T> { function cloneArray<T>(inValue:Array<T>):Array<T> {
var array:Array<T> = inValue.copy(); var array:Array<T> = inValue.copy();
for (i in 0...array.length) for (i in 0...array.length)
array[i] = _clone(array[i]); array[i] = _clone(array[i]);
return array; return array;
} }
function cloneClass <T> (inValue:T):T { function cloneClass<T>(inValue:T):T {
var classValue = Type.getClass(inValue); var classValue = Type.getClass(inValue);
var outValue:T = Type.createEmptyInstance(classValue); var outValue:T = Type.createEmptyInstance(classValue);
var fields:Array<String> = Type.getInstanceFields(classValue); var fields:Array<String> = Type.getInstanceFields(classValue);
@@ -111,5 +112,4 @@ class Cloner {
} }
return outValue; return outValue;
} }
}
}

View File

@@ -1,25 +1,26 @@
package kiss.cloner; package kiss.cloner;
import haxe.Constraints.IMap; import haxe.Constraints.IMap;
import kiss.cloner.Cloner; import kiss.cloner.Cloner;
import Type.ValueType; import Type.ValueType;
class MapCloner<K>{
class MapCloner<K> {
var cloner:Cloner; var cloner:Cloner;
var type:Class<IMap<K,Dynamic>>; var type:Class<IMap<K, Dynamic>>;
var noArgs:Array<Dynamic>; var noArgs:Array<Dynamic>;
public function new(cloner:Cloner, type:Class<IMap<K,Dynamic>>):Void { public function new(cloner:Cloner, type:Class<IMap<K, Dynamic>>):Void {
this.cloner = cloner; this.cloner = cloner;
this.type = type; this.type = type;
noArgs = []; noArgs = [];
} }
public function clone <K,Dynamic> (inValue:IMap<K,Dynamic>):IMap<K,Dynamic> { public function clone<K, Dynamic>(inValue:IMap<K, Dynamic>):IMap<K, Dynamic> {
var inMap:IMap<K,Dynamic> = inValue; var inMap:IMap<K, Dynamic> = inValue;
var map:IMap<K,Dynamic> = cast Type.createInstance(type, noArgs); var map:IMap<K, Dynamic> = cast Type.createInstance(type, noArgs);
for (key in inMap.keys()) { for (key in inMap.keys()) {
map.set(key, cloner._clone(inMap.get(key))); map.set(key, cloner._clone(inMap.get(key)));
} }
return map; return map;
} }
} }