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