private static void IfIsObjDo <T>(IGeoWalkContext obj, Action <GeoWalkContext <T> > actionWithItem) where T : GeoJSONObject { if (obj.Item is T) { actionWithItem(obj.Repurpose <T>()); } }
private void DispatchVisitor <T>(IGeoWalkContext currentContext, IEnumerable <T> items, IGeoJsonObjectVisitor visitor) { foreach (var geoObj in items) { AcceptVisitor(currentContext.SpawnForChild((GeoJSONObject)(object)geoObj), visitor); } }
private void AcceptVisitor(IGeoWalkContext obj, IGeoJsonObjectVisitor visitor) { IfIsObjDo <Point>(obj, visitor.Visit); IfIsObjDo <MultiPoint>(obj, m => { visitor.Visit(m); DispatchVisitor(m, m.Item.Coordinates, visitor); m.CallExitActivity(); }); IfIsObjDo <LineString>(obj, visitor.Visit); IfIsObjDo <MultiLineString>(obj, mls => { visitor.Visit(mls); DispatchVisitor(mls, mls.Item.Coordinates, visitor); mls.CallExitActivity(); }); IfIsObjDo <Polygon>(obj, pl => { visitor.Visit(pl); DispatchVisitor(pl, pl.Item.Coordinates, visitor); pl.CallExitActivity(); }); IfIsObjDo <MultiPolygon>(obj, mpl => { visitor.Visit(mpl); DispatchVisitor(mpl, mpl.Item.Coordinates, visitor); mpl.CallExitActivity(); }); IfIsObjDo <GeometryCollection>(obj, gcl => { visitor.Visit(gcl); DispatchVisitor(gcl, gcl.Item.Geometries, visitor); gcl.CallExitActivity(); }); IfIsObjDo <FeatureCollection>(obj, fcl => { visitor.Visit(fcl); DispatchVisitor(fcl, fcl.Item.Features, visitor); fcl.CallExitActivity(); }); IfIsObjDo <Feature>(obj, f => { visitor.Visit(f); AcceptVisitor(f.SpawnForChild((GeoJSONObject)f.Item.Geometry), visitor); f.CallExitActivity(); }); }
/// <summary> /// Check if there is a parent and if its item is of type T. /// Returns true if those conditions are met. /// </summary> public static bool HasParentCorrespondingTo <T>(this IGeoWalkContext ctx) { return(ctx.Parent != null && ctx.Parent.Item is T); }
private GeoWalkContext(T item, int depth, IGeoWalkContext parent) { CurrentDepth = depth; Item = item; Parent = parent; }