geojson 2.0.0 → 3.0.0
raw patch · 14 files changed
+237/−257 lines, 14 filesdep +containersPVP ok
version bump matches the API change (PVP)
Dependencies added: containers
API changes (from Hackage documentation)
- Data.Geospatial.Internal.BasicTypes: instance Foreign.Storable.Storable Data.Geospatial.Internal.BasicTypes.GeoPositionWithoutCRS
- Data.Geospatial.Internal.BasicTypes: instance Foreign.Storable.Storable Data.Geospatial.Internal.BasicTypes.PointXY
- Data.LineString: foldMap :: (Monoid m, Storable a) => (a -> m) -> LineString a -> m
- Data.LineString: foldr :: (Storable a) => (a -> b -> b) -> b -> LineString a -> b
- Data.LineString: instance (Data.Aeson.Types.FromJSON.FromJSON a, GHC.Show.Show a, Foreign.Storable.Storable a) => Data.Aeson.Types.FromJSON.FromJSON (Data.LineString.LineString a)
- Data.LineString: instance (Data.Aeson.Types.ToJSON.ToJSON a, Foreign.Storable.Storable a) => Data.Aeson.Types.ToJSON.ToJSON (Data.LineString.LineString a)
- Data.LineString: instance (Foreign.Storable.Storable a, GHC.Classes.Eq a) => GHC.Classes.Eq (Data.LineString.LineString a)
- Data.LineString: instance (GHC.Show.Show a, Foreign.Storable.Storable a) => GHC.Show.Show (Data.LineString.LineString a)
- Data.LineString: map :: (Storable a, Storable b) => (a -> b) -> LineString a -> LineString b
- Data.LinearRing: foldMap :: (Monoid m, Storable a) => (a -> m) -> LinearRing a -> m
- Data.LinearRing: foldr :: Storable a => (a -> b -> b) -> b -> LinearRing a -> b
- Data.LinearRing: instance (Data.Aeson.Types.ToJSON.ToJSON a, Foreign.Storable.Storable a) => Data.Aeson.Types.ToJSON.ToJSON (Data.LinearRing.LinearRing a)
- Data.LinearRing: instance (Foreign.Storable.Storable a, GHC.Classes.Eq a) => GHC.Classes.Eq (Data.LinearRing.LinearRing a)
- Data.LinearRing: instance (Foreign.Storable.Storable a, GHC.Show.Show a) => GHC.Show.Show (Data.LinearRing.LinearRing a)
- Data.LinearRing: instance (GHC.Classes.Eq a, Data.Aeson.Types.FromJSON.FromJSON a, GHC.Show.Show a, Foreign.Storable.Storable a) => Data.Aeson.Types.FromJSON.FromJSON (Data.LinearRing.LinearRing a)
- Data.LinearRing: instance (GHC.Show.Show a, Foreign.Storable.Storable a) => GHC.Show.Show (Data.LinearRing.ListToLinearRingError a)
- Data.LinearRing: instance (GHC.Show.Show a, Foreign.Storable.Storable a) => GHC.Show.Show (Data.LinearRing.VectorToLinearRingError a)
- Data.LinearRing: map :: (Storable a, Storable b) => (a -> b) -> LinearRing a -> LinearRing b
+ Data.LineString: instance (Data.Aeson.Types.FromJSON.FromJSON a, GHC.Show.Show a) => Data.Aeson.Types.FromJSON.FromJSON (Data.LineString.LineString a)
+ Data.LineString: instance Data.Aeson.Types.ToJSON.ToJSON a => Data.Aeson.Types.ToJSON.ToJSON (Data.LineString.LineString a)
+ Data.LineString: instance Data.Foldable.Foldable Data.LineString.LineString
+ Data.LineString: instance Data.Traversable.Traversable Data.LineString.LineString
+ Data.LineString: instance GHC.Base.Functor Data.LineString.LineString
+ Data.LineString: instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.LineString.LineString a)
+ Data.LineString: instance GHC.Show.Show a => GHC.Show.Show (Data.LineString.LineString a)
+ Data.LinearRing: instance (GHC.Classes.Eq a, Data.Aeson.Types.FromJSON.FromJSON a, GHC.Show.Show a) => Data.Aeson.Types.FromJSON.FromJSON (Data.LinearRing.LinearRing a)
+ Data.LinearRing: instance Data.Aeson.Types.ToJSON.ToJSON a => Data.Aeson.Types.ToJSON.ToJSON (Data.LinearRing.LinearRing a)
+ Data.LinearRing: instance Data.Foldable.Foldable Data.LinearRing.LinearRing
+ Data.LinearRing: instance Data.Traversable.Traversable Data.LinearRing.LinearRing
+ Data.LinearRing: instance GHC.Base.Functor Data.LinearRing.LinearRing
+ Data.LinearRing: instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.LinearRing.LinearRing a)
+ Data.LinearRing: instance GHC.Show.Show a => GHC.Show.Show (Data.LinearRing.LinearRing a)
+ Data.LinearRing: instance GHC.Show.Show a => GHC.Show.Show (Data.LinearRing.ListToLinearRingError a)
+ Data.LinearRing: instance GHC.Show.Show a => GHC.Show.Show (Data.LinearRing.VectorToLinearRingError a)
- Data.Geospatial: Collection :: (Vector GeospatialGeometry) -> GeospatialGeometry
+ Data.Geospatial: Collection :: (Seq GeospatialGeometry) -> GeospatialGeometry
- Data.Geospatial: GeoFeatureCollection :: Maybe BoundingBoxWithoutCRS -> Vector (GeoFeature a) -> GeoFeatureCollection a
+ Data.Geospatial: GeoFeatureCollection :: Maybe BoundingBoxWithoutCRS -> Seq (GeoFeature a) -> GeoFeatureCollection a
- Data.Geospatial: GeoMultiLine :: Vector (LineString GeoPositionWithoutCRS) -> GeoMultiLine
+ Data.Geospatial: GeoMultiLine :: Seq (LineString GeoPositionWithoutCRS) -> GeoMultiLine
- Data.Geospatial: GeoMultiPoint :: Vector GeoPositionWithoutCRS -> GeoMultiPoint
+ Data.Geospatial: GeoMultiPoint :: Seq GeoPositionWithoutCRS -> GeoMultiPoint
- Data.Geospatial: GeoMultiPolygon :: Vector (Vector (LinearRing GeoPositionWithoutCRS)) -> GeoMultiPolygon
+ Data.Geospatial: GeoMultiPolygon :: Seq (Seq (LinearRing GeoPositionWithoutCRS)) -> GeoMultiPolygon
- Data.Geospatial: GeoPolygon :: Vector (LinearRing GeoPositionWithoutCRS) -> GeoPolygon
+ Data.Geospatial: GeoPolygon :: Seq (LinearRing GeoPositionWithoutCRS) -> GeoPolygon
- Data.Geospatial: [_geofeatures] :: GeoFeatureCollection a -> Vector (GeoFeature a)
+ Data.Geospatial: [_geofeatures] :: GeoFeatureCollection a -> Seq (GeoFeature a)
- Data.Geospatial: [_unGeoMultiLine] :: GeoMultiLine -> Vector (LineString GeoPositionWithoutCRS)
+ Data.Geospatial: [_unGeoMultiLine] :: GeoMultiLine -> Seq (LineString GeoPositionWithoutCRS)
- Data.Geospatial: [_unGeoMultiPoint] :: GeoMultiPoint -> Vector GeoPositionWithoutCRS
+ Data.Geospatial: [_unGeoMultiPoint] :: GeoMultiPoint -> Seq GeoPositionWithoutCRS
- Data.Geospatial: [_unGeoMultiPolygon] :: GeoMultiPolygon -> Vector (Vector (LinearRing GeoPositionWithoutCRS))
+ Data.Geospatial: [_unGeoMultiPolygon] :: GeoMultiPolygon -> Seq (Seq (LinearRing GeoPositionWithoutCRS))
- Data.Geospatial: [_unGeoPolygon] :: GeoPolygon -> Vector (LinearRing GeoPositionWithoutCRS)
+ Data.Geospatial: [_unGeoPolygon] :: GeoPolygon -> Seq (LinearRing GeoPositionWithoutCRS)
- Data.Geospatial: _Collection :: Prism' GeospatialGeometry (Vector GeospatialGeometry)
+ Data.Geospatial: _Collection :: Prism' GeospatialGeometry (Seq GeospatialGeometry)
- Data.Geospatial: bbox :: forall a_aLJe. Lens' (GeoFeature a_aLJe) (Maybe BoundingBoxWithoutCRS)
+ Data.Geospatial: bbox :: forall a_aJIa. Lens' (GeoFeature a_aJIa) (Maybe BoundingBoxWithoutCRS)
- Data.Geospatial: boundingbox :: forall a_aNkW. Lens' (GeoFeatureCollection a_aNkW) (Maybe BoundingBoxWithoutCRS)
+ Data.Geospatial: boundingbox :: forall a_aLhR. Lens' (GeoFeatureCollection a_aLhR) (Maybe BoundingBoxWithoutCRS)
- Data.Geospatial: class HasGeoPositionWithoutCRS c_aotb
+ Data.Geospatial: class HasGeoPositionWithoutCRS c_ao1b
- Data.Geospatial: featureId :: forall a_aLJe. Lens' (GeoFeature a_aLJe) (Maybe FeatureID)
+ Data.Geospatial: featureId :: forall a_aJIa. Lens' (GeoFeature a_aJIa) (Maybe FeatureID)
- Data.Geospatial: geoPositionWithoutCRS :: HasGeoPositionWithoutCRS c_aotb => Lens' c_aotb GeoPositionWithoutCRS
+ Data.Geospatial: geoPositionWithoutCRS :: HasGeoPositionWithoutCRS c_ao1b => Lens' c_ao1b GeoPositionWithoutCRS
- Data.Geospatial: geofeatures :: forall a_aNkW a_aNnB. Lens (GeoFeatureCollection a_aNkW) (GeoFeatureCollection a_aNnB) (Vector (GeoFeature a_aNkW)) (Vector (GeoFeature a_aNnB))
+ Data.Geospatial: geofeatures :: forall a_aLhR a_aLkq. Lens (GeoFeatureCollection a_aLhR) (GeoFeatureCollection a_aLkq) (Seq (GeoFeature a_aLhR)) (Seq (GeoFeature a_aLkq))
- Data.Geospatial: geometry :: forall a_aLJe. Lens' (GeoFeature a_aLJe) GeospatialGeometry
+ Data.Geospatial: geometry :: forall a_aJIa. Lens' (GeoFeature a_aJIa) GeospatialGeometry
- Data.Geospatial: mergeGeoLines :: Vector GeoLine -> GeoMultiLine
+ Data.Geospatial: mergeGeoLines :: Seq GeoLine -> GeoMultiLine
- Data.Geospatial: mergeGeoPoints :: Vector GeoPoint -> GeoMultiPoint
+ Data.Geospatial: mergeGeoPoints :: Seq GeoPoint -> GeoMultiPoint
- Data.Geospatial: mergeGeoPolygons :: Vector GeoPolygon -> GeoMultiPolygon
+ Data.Geospatial: mergeGeoPolygons :: Seq GeoPolygon -> GeoMultiPolygon
- Data.Geospatial: properties :: forall a_aLJe a_aLQP. Lens (GeoFeature a_aLJe) (GeoFeature a_aLQP) a_aLJe a_aLQP
+ Data.Geospatial: properties :: forall a_aJIa a_aJPD. Lens (GeoFeature a_aJIa) (GeoFeature a_aJPD) a_aJIa a_aJPD
- Data.Geospatial: splitGeoMultiLine :: GeoMultiLine -> Vector GeoLine
+ Data.Geospatial: splitGeoMultiLine :: GeoMultiLine -> Seq GeoLine
- Data.Geospatial: splitGeoMultiPoint :: GeoMultiPoint -> Vector GeoPoint
+ Data.Geospatial: splitGeoMultiPoint :: GeoMultiPoint -> Seq GeoPoint
- Data.Geospatial: splitGeoMultiPolygon :: GeoMultiPolygon -> Vector GeoPolygon
+ Data.Geospatial: splitGeoMultiPolygon :: GeoMultiPolygon -> Seq GeoPolygon
- Data.Geospatial: unBoundingBoxWithoutCrs :: BoundingBoxWithoutCRS -> Vector Double
+ Data.Geospatial: unBoundingBoxWithoutCrs :: BoundingBoxWithoutCRS -> Seq Double
- Data.Geospatial: unGeoMultiLine :: Iso' GeoMultiLine (Vector (LineString GeoPositionWithoutCRS))
+ Data.Geospatial: unGeoMultiLine :: Iso' GeoMultiLine (Seq (LineString GeoPositionWithoutCRS))
- Data.Geospatial: unGeoMultiPoint :: Iso' GeoMultiPoint (Vector GeoPositionWithoutCRS)
+ Data.Geospatial: unGeoMultiPoint :: Iso' GeoMultiPoint (Seq GeoPositionWithoutCRS)
- Data.Geospatial: unGeoMultiPolygon :: Iso' GeoMultiPolygon (Vector (Vector (LinearRing GeoPositionWithoutCRS)))
+ Data.Geospatial: unGeoMultiPolygon :: Iso' GeoMultiPolygon (Seq (Seq (LinearRing GeoPositionWithoutCRS)))
- Data.Geospatial: unGeoPolygon :: Iso' GeoPolygon (Vector (LinearRing GeoPositionWithoutCRS))
+ Data.Geospatial: unGeoPolygon :: Iso' GeoPolygon (Seq (LinearRing GeoPositionWithoutCRS))
- Data.Geospatial.Internal.BasicTypes: BoundingBoxWithoutCRS :: Vector Double -> BoundingBoxWithoutCRS
+ Data.Geospatial.Internal.BasicTypes: BoundingBoxWithoutCRS :: Seq Double -> BoundingBoxWithoutCRS
- Data.Geospatial.Internal.BasicTypes: [unBoundingBoxWithoutCrs] :: BoundingBoxWithoutCRS -> Vector Double
+ Data.Geospatial.Internal.BasicTypes: [unBoundingBoxWithoutCrs] :: BoundingBoxWithoutCRS -> Seq Double
- Data.Geospatial.Internal.BasicTypes: class HasGeoPositionWithoutCRS c_aotb
+ Data.Geospatial.Internal.BasicTypes: class HasGeoPositionWithoutCRS c_ao1b
- Data.Geospatial.Internal.BasicTypes: geoPositionWithoutCRS :: HasGeoPositionWithoutCRS c_aotb => Lens' c_aotb GeoPositionWithoutCRS
+ Data.Geospatial.Internal.BasicTypes: geoPositionWithoutCRS :: HasGeoPositionWithoutCRS c_ao1b => Lens' c_ao1b GeoPositionWithoutCRS
- Data.Geospatial.Internal.GeoFeature: bbox :: forall a_aLJe. Lens' (GeoFeature a_aLJe) (Maybe BoundingBoxWithoutCRS)
+ Data.Geospatial.Internal.GeoFeature: bbox :: forall a_aJIa. Lens' (GeoFeature a_aJIa) (Maybe BoundingBoxWithoutCRS)
- Data.Geospatial.Internal.GeoFeature: featureId :: forall a_aLJe. Lens' (GeoFeature a_aLJe) (Maybe FeatureID)
+ Data.Geospatial.Internal.GeoFeature: featureId :: forall a_aJIa. Lens' (GeoFeature a_aJIa) (Maybe FeatureID)
- Data.Geospatial.Internal.GeoFeature: geometry :: forall a_aLJe. Lens' (GeoFeature a_aLJe) GeospatialGeometry
+ Data.Geospatial.Internal.GeoFeature: geometry :: forall a_aJIa. Lens' (GeoFeature a_aJIa) GeospatialGeometry
- Data.Geospatial.Internal.GeoFeature: properties :: forall a_aLJe a_aLQP. Lens (GeoFeature a_aLJe) (GeoFeature a_aLQP) a_aLJe a_aLQP
+ Data.Geospatial.Internal.GeoFeature: properties :: forall a_aJIa a_aJPD. Lens (GeoFeature a_aJIa) (GeoFeature a_aJPD) a_aJIa a_aJPD
- Data.Geospatial.Internal.GeoFeatureCollection: GeoFeatureCollection :: Maybe BoundingBoxWithoutCRS -> Vector (GeoFeature a) -> GeoFeatureCollection a
+ Data.Geospatial.Internal.GeoFeatureCollection: GeoFeatureCollection :: Maybe BoundingBoxWithoutCRS -> Seq (GeoFeature a) -> GeoFeatureCollection a
- Data.Geospatial.Internal.GeoFeatureCollection: [_geofeatures] :: GeoFeatureCollection a -> Vector (GeoFeature a)
+ Data.Geospatial.Internal.GeoFeatureCollection: [_geofeatures] :: GeoFeatureCollection a -> Seq (GeoFeature a)
- Data.Geospatial.Internal.GeoFeatureCollection: boundingbox :: forall a_aNkW. Lens' (GeoFeatureCollection a_aNkW) (Maybe BoundingBoxWithoutCRS)
+ Data.Geospatial.Internal.GeoFeatureCollection: boundingbox :: forall a_aLhR. Lens' (GeoFeatureCollection a_aLhR) (Maybe BoundingBoxWithoutCRS)
- Data.Geospatial.Internal.GeoFeatureCollection: geofeatures :: forall a_aNkW a_aNnB. Lens (GeoFeatureCollection a_aNkW) (GeoFeatureCollection a_aNnB) (Vector (GeoFeature a_aNkW)) (Vector (GeoFeature a_aNnB))
+ Data.Geospatial.Internal.GeoFeatureCollection: geofeatures :: forall a_aLhR a_aLkq. Lens (GeoFeatureCollection a_aLhR) (GeoFeatureCollection a_aLkq) (Seq (GeoFeature a_aLhR)) (Seq (GeoFeature a_aLkq))
- Data.Geospatial.Internal.Geometry: Collection :: (Vector GeospatialGeometry) -> GeospatialGeometry
+ Data.Geospatial.Internal.Geometry: Collection :: (Seq GeospatialGeometry) -> GeospatialGeometry
- Data.Geospatial.Internal.Geometry: GeoMultiLine :: Vector (LineString GeoPositionWithoutCRS) -> GeoMultiLine
+ Data.Geospatial.Internal.Geometry: GeoMultiLine :: Seq (LineString GeoPositionWithoutCRS) -> GeoMultiLine
- Data.Geospatial.Internal.Geometry: GeoMultiPoint :: Vector GeoPositionWithoutCRS -> GeoMultiPoint
+ Data.Geospatial.Internal.Geometry: GeoMultiPoint :: Seq GeoPositionWithoutCRS -> GeoMultiPoint
- Data.Geospatial.Internal.Geometry: GeoMultiPolygon :: Vector (Vector (LinearRing GeoPositionWithoutCRS)) -> GeoMultiPolygon
+ Data.Geospatial.Internal.Geometry: GeoMultiPolygon :: Seq (Seq (LinearRing GeoPositionWithoutCRS)) -> GeoMultiPolygon
- Data.Geospatial.Internal.Geometry: GeoPolygon :: Vector (LinearRing GeoPositionWithoutCRS) -> GeoPolygon
+ Data.Geospatial.Internal.Geometry: GeoPolygon :: Seq (LinearRing GeoPositionWithoutCRS) -> GeoPolygon
- Data.Geospatial.Internal.Geometry: [_unGeoMultiLine] :: GeoMultiLine -> Vector (LineString GeoPositionWithoutCRS)
+ Data.Geospatial.Internal.Geometry: [_unGeoMultiLine] :: GeoMultiLine -> Seq (LineString GeoPositionWithoutCRS)
- Data.Geospatial.Internal.Geometry: [_unGeoMultiPoint] :: GeoMultiPoint -> Vector GeoPositionWithoutCRS
+ Data.Geospatial.Internal.Geometry: [_unGeoMultiPoint] :: GeoMultiPoint -> Seq GeoPositionWithoutCRS
- Data.Geospatial.Internal.Geometry: [_unGeoMultiPolygon] :: GeoMultiPolygon -> Vector (Vector (LinearRing GeoPositionWithoutCRS))
+ Data.Geospatial.Internal.Geometry: [_unGeoMultiPolygon] :: GeoMultiPolygon -> Seq (Seq (LinearRing GeoPositionWithoutCRS))
- Data.Geospatial.Internal.Geometry: [_unGeoPolygon] :: GeoPolygon -> Vector (LinearRing GeoPositionWithoutCRS)
+ Data.Geospatial.Internal.Geometry: [_unGeoPolygon] :: GeoPolygon -> Seq (LinearRing GeoPositionWithoutCRS)
- Data.Geospatial.Internal.Geometry: _Collection :: Prism' GeospatialGeometry (Vector GeospatialGeometry)
+ Data.Geospatial.Internal.Geometry: _Collection :: Prism' GeospatialGeometry (Seq GeospatialGeometry)
- Data.Geospatial.Internal.Geometry: mergeGeoLines :: Vector GeoLine -> GeoMultiLine
+ Data.Geospatial.Internal.Geometry: mergeGeoLines :: Seq GeoLine -> GeoMultiLine
- Data.Geospatial.Internal.Geometry: mergeGeoPoints :: Vector GeoPoint -> GeoMultiPoint
+ Data.Geospatial.Internal.Geometry: mergeGeoPoints :: Seq GeoPoint -> GeoMultiPoint
- Data.Geospatial.Internal.Geometry: mergeGeoPolygons :: Vector GeoPolygon -> GeoMultiPolygon
+ Data.Geospatial.Internal.Geometry: mergeGeoPolygons :: Seq GeoPolygon -> GeoMultiPolygon
- Data.Geospatial.Internal.Geometry: splitGeoMultiLine :: GeoMultiLine -> Vector GeoLine
+ Data.Geospatial.Internal.Geometry: splitGeoMultiLine :: GeoMultiLine -> Seq GeoLine
- Data.Geospatial.Internal.Geometry: splitGeoMultiPoint :: GeoMultiPoint -> Vector GeoPoint
+ Data.Geospatial.Internal.Geometry: splitGeoMultiPoint :: GeoMultiPoint -> Seq GeoPoint
- Data.Geospatial.Internal.Geometry: splitGeoMultiPolygon :: GeoMultiPolygon -> Vector GeoPolygon
+ Data.Geospatial.Internal.Geometry: splitGeoMultiPolygon :: GeoMultiPolygon -> Seq GeoPolygon
- Data.Geospatial.Internal.Geometry: unGeoMultiLine :: Iso' GeoMultiLine (Vector (LineString GeoPositionWithoutCRS))
+ Data.Geospatial.Internal.Geometry: unGeoMultiLine :: Iso' GeoMultiLine (Seq (LineString GeoPositionWithoutCRS))
- Data.Geospatial.Internal.Geometry: unGeoMultiPoint :: Iso' GeoMultiPoint (Vector GeoPositionWithoutCRS)
+ Data.Geospatial.Internal.Geometry: unGeoMultiPoint :: Iso' GeoMultiPoint (Seq GeoPositionWithoutCRS)
- Data.Geospatial.Internal.Geometry: unGeoMultiPolygon :: Iso' GeoMultiPolygon (Vector (Vector (LinearRing GeoPositionWithoutCRS)))
+ Data.Geospatial.Internal.Geometry: unGeoMultiPolygon :: Iso' GeoMultiPolygon (Seq (Seq (LinearRing GeoPositionWithoutCRS)))
- Data.Geospatial.Internal.Geometry: unGeoPolygon :: Iso' GeoPolygon (Vector (LinearRing GeoPositionWithoutCRS))
+ Data.Geospatial.Internal.Geometry: unGeoPolygon :: Iso' GeoPolygon (Seq (LinearRing GeoPositionWithoutCRS))
- Data.Geospatial.Internal.Geometry.GeoMultiLine: GeoMultiLine :: Vector (LineString GeoPositionWithoutCRS) -> GeoMultiLine
+ Data.Geospatial.Internal.Geometry.GeoMultiLine: GeoMultiLine :: Seq (LineString GeoPositionWithoutCRS) -> GeoMultiLine
- Data.Geospatial.Internal.Geometry.GeoMultiLine: [_unGeoMultiLine] :: GeoMultiLine -> Vector (LineString GeoPositionWithoutCRS)
+ Data.Geospatial.Internal.Geometry.GeoMultiLine: [_unGeoMultiLine] :: GeoMultiLine -> Seq (LineString GeoPositionWithoutCRS)
- Data.Geospatial.Internal.Geometry.GeoMultiLine: mergeGeoLines :: Vector GeoLine -> GeoMultiLine
+ Data.Geospatial.Internal.Geometry.GeoMultiLine: mergeGeoLines :: Seq GeoLine -> GeoMultiLine
- Data.Geospatial.Internal.Geometry.GeoMultiLine: splitGeoMultiLine :: GeoMultiLine -> Vector GeoLine
+ Data.Geospatial.Internal.Geometry.GeoMultiLine: splitGeoMultiLine :: GeoMultiLine -> Seq GeoLine
- Data.Geospatial.Internal.Geometry.GeoMultiLine: unGeoMultiLine :: Iso' GeoMultiLine (Vector (LineString GeoPositionWithoutCRS))
+ Data.Geospatial.Internal.Geometry.GeoMultiLine: unGeoMultiLine :: Iso' GeoMultiLine (Seq (LineString GeoPositionWithoutCRS))
- Data.Geospatial.Internal.Geometry.GeoMultiPoint: GeoMultiPoint :: Vector GeoPositionWithoutCRS -> GeoMultiPoint
+ Data.Geospatial.Internal.Geometry.GeoMultiPoint: GeoMultiPoint :: Seq GeoPositionWithoutCRS -> GeoMultiPoint
- Data.Geospatial.Internal.Geometry.GeoMultiPoint: [_unGeoMultiPoint] :: GeoMultiPoint -> Vector GeoPositionWithoutCRS
+ Data.Geospatial.Internal.Geometry.GeoMultiPoint: [_unGeoMultiPoint] :: GeoMultiPoint -> Seq GeoPositionWithoutCRS
- Data.Geospatial.Internal.Geometry.GeoMultiPoint: mergeGeoPoints :: Vector GeoPoint -> GeoMultiPoint
+ Data.Geospatial.Internal.Geometry.GeoMultiPoint: mergeGeoPoints :: Seq GeoPoint -> GeoMultiPoint
- Data.Geospatial.Internal.Geometry.GeoMultiPoint: splitGeoMultiPoint :: GeoMultiPoint -> Vector GeoPoint
+ Data.Geospatial.Internal.Geometry.GeoMultiPoint: splitGeoMultiPoint :: GeoMultiPoint -> Seq GeoPoint
- Data.Geospatial.Internal.Geometry.GeoMultiPoint: unGeoMultiPoint :: Iso' GeoMultiPoint (Vector GeoPositionWithoutCRS)
+ Data.Geospatial.Internal.Geometry.GeoMultiPoint: unGeoMultiPoint :: Iso' GeoMultiPoint (Seq GeoPositionWithoutCRS)
- Data.Geospatial.Internal.Geometry.GeoMultiPolygon: GeoMultiPolygon :: Vector (Vector (LinearRing GeoPositionWithoutCRS)) -> GeoMultiPolygon
+ Data.Geospatial.Internal.Geometry.GeoMultiPolygon: GeoMultiPolygon :: Seq (Seq (LinearRing GeoPositionWithoutCRS)) -> GeoMultiPolygon
- Data.Geospatial.Internal.Geometry.GeoMultiPolygon: [_unGeoMultiPolygon] :: GeoMultiPolygon -> Vector (Vector (LinearRing GeoPositionWithoutCRS))
+ Data.Geospatial.Internal.Geometry.GeoMultiPolygon: [_unGeoMultiPolygon] :: GeoMultiPolygon -> Seq (Seq (LinearRing GeoPositionWithoutCRS))
- Data.Geospatial.Internal.Geometry.GeoMultiPolygon: mergeGeoPolygons :: Vector GeoPolygon -> GeoMultiPolygon
+ Data.Geospatial.Internal.Geometry.GeoMultiPolygon: mergeGeoPolygons :: Seq GeoPolygon -> GeoMultiPolygon
- Data.Geospatial.Internal.Geometry.GeoMultiPolygon: splitGeoMultiPolygon :: GeoMultiPolygon -> Vector GeoPolygon
+ Data.Geospatial.Internal.Geometry.GeoMultiPolygon: splitGeoMultiPolygon :: GeoMultiPolygon -> Seq GeoPolygon
- Data.Geospatial.Internal.Geometry.GeoMultiPolygon: unGeoMultiPolygon :: Iso' GeoMultiPolygon (Vector (Vector (LinearRing GeoPositionWithoutCRS)))
+ Data.Geospatial.Internal.Geometry.GeoMultiPolygon: unGeoMultiPolygon :: Iso' GeoMultiPolygon (Seq (Seq (LinearRing GeoPositionWithoutCRS)))
- Data.Geospatial.Internal.Geometry.GeoPolygon: GeoPolygon :: Vector (LinearRing GeoPositionWithoutCRS) -> GeoPolygon
+ Data.Geospatial.Internal.Geometry.GeoPolygon: GeoPolygon :: Seq (LinearRing GeoPositionWithoutCRS) -> GeoPolygon
- Data.Geospatial.Internal.Geometry.GeoPolygon: [_unGeoPolygon] :: GeoPolygon -> Vector (LinearRing GeoPositionWithoutCRS)
+ Data.Geospatial.Internal.Geometry.GeoPolygon: [_unGeoPolygon] :: GeoPolygon -> Seq (LinearRing GeoPositionWithoutCRS)
- Data.Geospatial.Internal.Geometry.GeoPolygon: unGeoPolygon :: Iso' GeoPolygon (Vector (LinearRing GeoPositionWithoutCRS))
+ Data.Geospatial.Internal.Geometry.GeoPolygon: unGeoPolygon :: Iso' GeoPolygon (Seq (LinearRing GeoPositionWithoutCRS))
- Data.LineString: combineToVector :: (Storable a, Storable b) => (a -> a -> b) -> LineString a -> Vector b
+ Data.LineString: combineToVector :: (a -> a -> b) -> LineString a -> Seq b
- Data.LineString: fromLineString :: (Storable a) => LineString a -> [a]
+ Data.LineString: fromLineString :: LineString a -> [a]
- Data.LineString: fromList :: (Validate v, Storable a) => [a] -> v ListToLineStringError (LineString a)
+ Data.LineString: fromList :: (Validate v) => [a] -> v ListToLineStringError (LineString a)
- Data.LineString: fromVector :: (Validate v, Storable a) => Vector a -> v VectorToLineStringError (LineString a)
+ Data.LineString: fromVector :: (Validate v) => Seq a -> v VectorToLineStringError (LineString a)
- Data.LineString: lineStringLast :: (Storable a) => LineString a -> a
+ Data.LineString: lineStringLast :: LineString a -> a
- Data.LineString: lineStringLength :: (Storable a) => LineString a -> Int
+ Data.LineString: lineStringLength :: LineString a -> Int
- Data.LineString: makeLineString :: (Storable a) => a -> a -> Vector a -> LineString a
+ Data.LineString: makeLineString :: a -> a -> Seq a -> LineString a
- Data.LineString: toVector :: (Storable a) => LineString a -> Vector a
+ Data.LineString: toVector :: LineString a -> Seq a
- Data.LinearRing: combineToVector :: (Storable a, Storable b) => (a -> a -> b) -> LinearRing a -> Vector b
+ Data.LinearRing: combineToVector :: (a -> a -> b) -> LinearRing a -> Seq b
- Data.LinearRing: fromLinearRing :: (Storable a) => LinearRing a -> [a]
+ Data.LinearRing: fromLinearRing :: LinearRing a -> [a]
- Data.LinearRing: fromList :: (Eq a, Show a, Storable a, Validate v, Functor (v (NonEmpty (ListToLinearRingError a)))) => [a] -> v (NonEmpty (ListToLinearRingError a)) (LinearRing a)
+ Data.LinearRing: fromList :: (Eq a, Show a, Validate v, Functor (v (NonEmpty (ListToLinearRingError a)))) => [a] -> v (NonEmpty (ListToLinearRingError a)) (LinearRing a)
- Data.LinearRing: fromListWithEqCheck :: (Eq a, Show a, Storable a, Validate v, Applicative (v (NonEmpty (ListToLinearRingError a)))) => [a] -> v (NonEmpty (ListToLinearRingError a)) (LinearRing a)
+ Data.LinearRing: fromListWithEqCheck :: (Eq a, Show a, Validate v, Applicative (v (NonEmpty (ListToLinearRingError a)))) => [a] -> v (NonEmpty (ListToLinearRingError a)) (LinearRing a)
- Data.LinearRing: fromVector :: (Eq a, Show a, Storable a, Validate v, Functor (v (NonEmpty (ListToLinearRingError a)))) => Vector a -> v (NonEmpty (VectorToLinearRingError a)) (LinearRing a)
+ Data.LinearRing: fromVector :: (Eq a, Show a, Validate v, Functor (v (NonEmpty (ListToLinearRingError a)))) => Seq a -> v (NonEmpty (VectorToLinearRingError a)) (LinearRing a)
- Data.LinearRing: makeLinearRing :: (Eq a, Show a, Storable a) => a -> a -> a -> Vector a -> LinearRing a
+ Data.LinearRing: makeLinearRing :: (Eq a, Show a) => a -> a -> a -> Seq a -> LinearRing a
- Data.LinearRing: ringLength :: (Storable a) => LinearRing a -> Int
+ Data.LinearRing: ringLength :: LinearRing a -> Int
- Data.LinearRing: toVector :: (Storable a) => LinearRing a -> Vector a
+ Data.LinearRing: toVector :: LinearRing a -> Seq a
Files
- geojson.cabal +4/−2
- src/Data/Geospatial/Internal/BasicTypes.hs +11/−46
- src/Data/Geospatial/Internal/GeoFeatureCollection.hs +2/−2
- src/Data/Geospatial/Internal/Geometry.hs +2/−2
- src/Data/Geospatial/Internal/Geometry/GeoMultiLine.hs +6/−6
- src/Data/Geospatial/Internal/Geometry/GeoMultiPoint.hs +6/−6
- src/Data/Geospatial/Internal/Geometry/GeoMultiPolygon.hs +6/−6
- src/Data/Geospatial/Internal/Geometry/GeoPolygon.hs +3/−3
- src/Data/LineString.hs +62/−56
- src/Data/LinearRing.hs +78/−62
- test/Arbitrary.hs +2/−10
- test/Data/LineStringTests.hs +16/−16
- test/Data/LinearRingTests.hs +20/−20
- test/Fixture.hs +19/−20
geojson.cabal view
@@ -1,5 +1,5 @@ name: geojson-version: 2.0.0+version: 3.0.0 license: BSD3 license-file: LICENCE author: Dom De Re@@ -27,12 +27,13 @@ source-repository this type: git location: https://github.com/indicatrix/hs-geojson.git- tag: 2.0.0+ tag: 3.0.0 library hs-source-dirs: src build-depends: base < 5 && >= 4 , aeson >= 0.8+ , containers >= 0.5.10.1 , deepseq >= 1.4 , lens >= 4.11 , semigroups >= 0.16@@ -67,6 +68,7 @@ build-depends: base < 5 && >= 4 , aeson >= 0.8 , bytestring >= 0.10+ , containers >= 0.5.10.1 , geojson , tasty , tasty-hspec
src/Data/Geospatial/Internal/BasicTypes.hs view
@@ -38,14 +38,14 @@ ) where import Control.DeepSeq-import Control.Lens.TH (makeClassy)-import qualified Data.Aeson as Aeson-import qualified Data.Aeson.Types as AesonTypes-import qualified Data.Maybe as DataMaybe-import qualified Data.Scientific as Scientific-import qualified Data.Text as Text-import qualified Data.Vector.Storable as VectorStorable-import Foreign.Storable+import Control.Lens.TH (makeClassy)+import qualified Data.Aeson as Aeson+import qualified Data.Aeson.Types as AesonTypes+import qualified Data.Foldable as Foldable+import qualified Data.Maybe as DataMaybe+import qualified Data.Scientific as Scientific+import qualified Data.Sequence as Sequence+import qualified Data.Text as Text import GHC.Generics type Latitude = Double@@ -115,41 +115,6 @@ x <- Aeson.parseJSON o DataMaybe.maybe (fail "Illegal coordinates") pure (_toGeoPoint x) -sizeOfDouble :: Int-sizeOfDouble = sizeOf (undefined :: Double)-{-# INLINE sizeOfDouble #-}--alignmentOfDouble :: Int-alignmentOfDouble = alignment (undefined :: Double)-{-# INLINE alignmentOfDouble #-}--instance VectorStorable.Storable PointXY where- sizeOf _ = 2 * sizeOfDouble- alignment _ = alignmentOfDouble- {-# INLINE peek #-}- peek p = PointXY <$> peekByteOff p 0 <*> peekByteOff p (1 * sizeOfDouble)- {-# INLINE poke #-}- poke p (PointXY x y) = pokeByteOff p 0 x *> pokeByteOff p (1 * sizeOfDouble) y--instance VectorStorable.Storable GeoPositionWithoutCRS where- sizeOf _ = 5 * sizeOfDouble- alignment _ = alignmentOfDouble- {-# INLINE peek #-}- peek p = do- t <- peekByteOff p 0- case (t :: Double) of- 0 -> pure GeoEmpty- 1 -> fmap GeoPointXY $ PointXY <$> peekByteOff p (1 * sizeOfDouble) <*> peekByteOff p (2 * sizeOfDouble)- 2 -> fmap GeoPointXYZ $ PointXYZ <$> peekByteOff p (1 * sizeOfDouble) <*> peekByteOff p (2 * sizeOfDouble) <*> peekByteOff p (3 * sizeOfDouble)- _ -> fmap GeoPointXYZM $ PointXYZM <$> peekByteOff p (1 * sizeOfDouble) <*> peekByteOff p (2 * sizeOfDouble) <*> peekByteOff p (3 * sizeOfDouble) <*> peekByteOff p (4 * sizeOfDouble)- {-# INLINE poke #-}- poke p val =- case val of- GeoEmpty -> pokeByteOff p 0 (0 :: Double) *> pokeByteOff p (1 * sizeOfDouble) (0 :: Double)- (GeoPointXY (PointXY x y)) -> pokeByteOff p 0 (1 :: Double) *> pokeByteOff p (1 * sizeOfDouble) x *> pokeByteOff p (2 * sizeOfDouble) y- (GeoPointXYZ (PointXYZ x y z)) -> pokeByteOff p 0 (2 :: Double) *> pokeByteOff p (1 * sizeOfDouble) x *> pokeByteOff p (2 * sizeOfDouble) y *> pokeByteOff p (3 * sizeOfDouble) z- (GeoPointXYZM (PointXYZM x y z m)) -> pokeByteOff p 0 (3 :: Double) *> pokeByteOff p (1 * sizeOfDouble) x *> pokeByteOff p (2 * sizeOfDouble) y *> pokeByteOff p (3 * sizeOfDouble) z *> pokeByteOff p (4 * sizeOfDouble) m- type Name = Text.Text type Code = Int type Href = Text.Text@@ -184,12 +149,12 @@ -- e.g for WGS84: minLongitude, minLatitude, maxLongitude, maxLatitude -- The spec mentions that it can be part of a geometry object too but doesnt give an example, -- This implementation will ignore bboxes on Geometry objects, they can be added if required.-newtype BoundingBoxWithoutCRS = BoundingBoxWithoutCRS { unBoundingBoxWithoutCrs :: VectorStorable.Vector Double } deriving (Eq, Show, Generic, NFData)+newtype BoundingBoxWithoutCRS = BoundingBoxWithoutCRS { unBoundingBoxWithoutCrs :: Sequence.Seq Double } deriving (Eq, Show, Generic, NFData) instance Aeson.FromJSON BoundingBoxWithoutCRS where parseJSON obj = do doubles <- Aeson.parseJSON obj :: AesonTypes.Parser [Double]- pure . BoundingBoxWithoutCRS $ VectorStorable.fromList doubles+ pure . BoundingBoxWithoutCRS $ Sequence.fromList doubles instance Aeson.ToJSON BoundingBoxWithoutCRS where- toJSON = Aeson.toJSON . VectorStorable.toList . unBoundingBoxWithoutCrs+ toJSON = Aeson.toJSON . Foldable.toList . unBoundingBoxWithoutCrs
src/Data/Geospatial/Internal/GeoFeatureCollection.hs view
@@ -32,15 +32,15 @@ (.:), (.:?), (.=)) import Data.List ((++)) import Data.Maybe (Maybe (..))+import qualified Data.Sequence as Sequence import Data.Text (Text)-import qualified Data.Vector as Vector import Prelude (Eq (..), Show, ($)) -- | See Section 2.3 /Feature Collection Objects/ of the GeoJSON spec -- data GeoFeatureCollection a = GeoFeatureCollection { _boundingbox :: Maybe BoundingBoxWithoutCRS- , _geofeatures :: Vector.Vector (GeoFeature a)+ , _geofeatures :: Sequence.Seq (GeoFeature a) } deriving (Show, Eq) makeLenses ''GeoFeatureCollection
src/Data/Geospatial/Internal/Geometry.hs view
@@ -56,8 +56,8 @@ object, (.:), (.=)) import Data.Aeson.Types (Parser)+import qualified Data.Sequence as Sequence import Data.Text (Text)-import qualified Data.Vector as Vector import GHC.Generics (Generic) @@ -70,7 +70,7 @@ | MultiPolygon GeoMultiPolygon | Line GeoLine | MultiLine GeoMultiLine- | Collection (Vector.Vector GeospatialGeometry) deriving (Show, Eq, Generic, NFData)+ | Collection (Sequence.Seq GeospatialGeometry) deriving (Show, Eq, Generic, NFData) makePrisms ''GeospatialGeometry
src/Data/Geospatial/Internal/Geometry/GeoMultiLine.hs view
@@ -29,22 +29,22 @@ import Data.Aeson (FromJSON (..), ToJSON (..), Value (..))-import qualified Data.Vector as Vector+import qualified Data.Sequence as Sequence import GHC.Generics (Generic) -newtype GeoMultiLine = GeoMultiLine { _unGeoMultiLine :: Vector.Vector (LineString GeoPositionWithoutCRS) } deriving (Show, Eq, Generic, NFData)+newtype GeoMultiLine = GeoMultiLine { _unGeoMultiLine :: Sequence.Seq(LineString GeoPositionWithoutCRS) } deriving (Show, Eq, Generic, NFData) makeLenses ''GeoMultiLine -- | Split GeoMultiLine coordinates into multiple GeoLines-splitGeoMultiLine:: GeoMultiLine -> Vector.Vector GeoLine-splitGeoMultiLine = Vector.map GeoLine . _unGeoMultiLine+splitGeoMultiLine:: GeoMultiLine -> Sequence.Seq GeoLine+splitGeoMultiLine = fmap GeoLine . _unGeoMultiLine -- | Merge multiple GeoLines into one GeoMultiLine-mergeGeoLines :: Vector.Vector GeoLine -> GeoMultiLine-mergeGeoLines = GeoMultiLine . Vector.map _unGeoLine+mergeGeoLines :: Sequence.Seq GeoLine -> GeoMultiLine+mergeGeoLines = GeoMultiLine . fmap _unGeoLine -- instances
src/Data/Geospatial/Internal/Geometry/GeoMultiPoint.hs view
@@ -26,20 +26,20 @@ import Control.Lens (makeLenses) import Control.Monad (mzero) import qualified Data.Aeson as Aeson-import qualified Data.Vector as Vector+import qualified Data.Sequence as Sequence import GHC.Generics (Generic) -newtype GeoMultiPoint = GeoMultiPoint { _unGeoMultiPoint :: Vector.Vector GeoPositionWithoutCRS } deriving (Show, Eq, Generic, NFData)+newtype GeoMultiPoint = GeoMultiPoint { _unGeoMultiPoint :: Sequence.Seq GeoPositionWithoutCRS } deriving (Show, Eq, Generic, NFData) makeLenses ''GeoMultiPoint -- | Split GeoMultiPoint coordinates into multiple GeoPoints-splitGeoMultiPoint:: GeoMultiPoint -> Vector.Vector GeoPoint-splitGeoMultiPoint = Vector.map GeoPoint . _unGeoMultiPoint+splitGeoMultiPoint:: GeoMultiPoint -> Sequence.Seq GeoPoint+splitGeoMultiPoint = fmap GeoPoint . _unGeoMultiPoint -- | Merge multiple GeoPoints into one GeoMultiPoint-mergeGeoPoints :: Vector.Vector GeoPoint -> GeoMultiPoint-mergeGeoPoints = GeoMultiPoint . Vector.map _unGeoPoint+mergeGeoPoints :: Sequence.Seq GeoPoint -> GeoMultiPoint+mergeGeoPoints = GeoMultiPoint . fmap _unGeoPoint -- instances
src/Data/Geospatial/Internal/Geometry/GeoMultiPolygon.hs view
@@ -27,18 +27,18 @@ import Control.Lens (makeLenses) import Control.Monad (mzero) import qualified Data.Aeson as Aeson-import qualified Data.Vector as Vector+import qualified Data.Sequence as Sequence import GHC.Generics (Generic) -newtype GeoMultiPolygon = GeoMultiPolygon { _unGeoMultiPolygon :: Vector.Vector (Vector.Vector (LinearRing.LinearRing GeoPositionWithoutCRS)) } deriving (Show, Eq, Generic, NFData)+newtype GeoMultiPolygon = GeoMultiPolygon { _unGeoMultiPolygon :: Sequence.Seq (Sequence.Seq (LinearRing.LinearRing GeoPositionWithoutCRS)) } deriving (Show, Eq, Generic, NFData) -- | Split GeoMultiPolygon coordinates into multiple GeoPolygons-splitGeoMultiPolygon :: GeoMultiPolygon -> Vector.Vector GeoPolygon-splitGeoMultiPolygon = Vector.map GeoPolygon . _unGeoMultiPolygon+splitGeoMultiPolygon :: GeoMultiPolygon -> Sequence.Seq GeoPolygon+splitGeoMultiPolygon = fmap GeoPolygon . _unGeoMultiPolygon -- | Merge multiple GeoPolygons into one GeoMultiPolygon-mergeGeoPolygons :: Vector.Vector GeoPolygon -> GeoMultiPolygon-mergeGeoPolygons = GeoMultiPolygon . Vector.map GeoPolygon._unGeoPolygon+mergeGeoPolygons :: Sequence.Seq GeoPolygon -> GeoMultiPolygon+mergeGeoPolygons = GeoMultiPolygon . fmap GeoPolygon._unGeoPolygon makeLenses ''GeoMultiPolygon
src/Data/Geospatial/Internal/Geometry/GeoPolygon.hs view
@@ -23,12 +23,12 @@ import Data.Geospatial.Internal.BasicTypes import Data.Geospatial.Internal.Geometry.Aeson import qualified Data.LinearRing as LinearRing-import qualified Data.Vector as Vector+import qualified Data.Sequence as Sequence import GHC.Generics (Generic) -newtype GeoPolygon = GeoPolygon { _unGeoPolygon :: Vector.Vector (LinearRing.LinearRing GeoPositionWithoutCRS) } deriving (Show, Eq, Generic, NFData)+newtype GeoPolygon = GeoPolygon { _unGeoPolygon :: Sequence.Seq (LinearRing.LinearRing GeoPositionWithoutCRS) } deriving (Show, Eq, Generic, NFData) --- Vector.Vector (LinearRing.LinearRing DoubleArray)+-- Sequence.Seq (LinearRing.LinearRing DoubleArray) makeLenses ''GeoPolygon
src/Data/LineString.hs view
@@ -24,32 +24,30 @@ , fromVector , fromLineString , fromList- , Data.LineString.map- , Data.LineString.foldr- , Data.LineString.foldMap , makeLineString , lineStringHead , lineStringLast , lineStringLength ) where -import Prelude hiding (foldr)+import Prelude hiding (foldr) -import Control.Applicative (Applicative (..))+import Control.Applicative (Applicative (..)) import Control.DeepSeq-import Control.Lens (( # ), (^?))-import Control.Monad (mzero)-import Data.Aeson (FromJSON (..), ToJSON (..), Value)-import Data.Aeson.Types (Parser, typeMismatch)-import Data.Maybe (fromMaybe)-import qualified Data.Validation as Validation-import qualified Data.Vector.Storable as VectorStorable-import GHC.Generics (Generic)+import Control.Lens (( # ), (^?))+import Control.Monad (mzero)+import Data.Aeson (FromJSON (..), ToJSON (..), Value)+import Data.Aeson.Types (Parser, typeMismatch)+import qualified Data.Foldable as Foldable+import Data.Maybe (fromMaybe)+import qualified Data.Sequence as Sequence+import qualified Data.Validation as Validation+import GHC.Generics (Generic) -- | -- a LineString has at least 2 elements ---data LineString a = LineString a a (VectorStorable.Vector a) deriving (Eq, Generic, NFData)+data LineString a = LineString a a (Sequence.Seq a) deriving (Eq, Generic, NFData) -- | -- When converting a List to a LineString, here is a list of things that can go wrong:@@ -84,82 +82,88 @@ -- | -- returns the last element in the string ---lineStringLast :: (VectorStorable.Storable a) => LineString a -> a+lineStringLast :: LineString a -> a lineStringLast (LineString _ x xs) = fromMaybe x (safeLast xs) -- | -- returns the number of elements in the list, including the replicated element at the end of the list. ---lineStringLength :: (VectorStorable.Storable a) => LineString a -> Int-lineStringLength (LineString _ _ xs) = 2 + VectorStorable.length xs+lineStringLength :: LineString a -> Int+lineStringLength (LineString _ _ xs) = 2 + Sequence.length xs -- | -- This function converts it into a list and appends the given element to the end. ---fromLineString :: (VectorStorable.Storable a) => LineString a -> [a]-fromLineString (LineString x y zs) = x : y : VectorStorable.toList zs+fromLineString :: LineString a -> [a]+fromLineString (LineString x y zs) = x : y : Foldable.toList zs -- | -- creates a LineString out of a list of elements, -- if there are enough elements (needs at least 2) elements ---fromList :: (Validation.Validate v, VectorStorable.Storable a) => [a] -> v ListToLineStringError (LineString a)+fromList :: (Validation.Validate v) => [a] -> v ListToLineStringError (LineString a) fromList [] = Validation._Failure # ListEmpty fromList [_] = Validation._Failure # SingletonList-fromList (x:y:zs) = Validation._Success # LineString x y (VectorStorable.fromList zs)+fromList (x:y:zs) = Validation._Success # LineString x y (Sequence.fromList zs) {-# INLINE fromList #-} -- | -- create a vector from a LineString by combining values. -- LineString 1 2 [3,4] (,) --> Vector [(1,2),(2,3),(3,4)] ---combineToVector :: (VectorStorable.Storable a, VectorStorable.Storable b) => (a -> a -> b) -> LineString a -> VectorStorable.Vector b-combineToVector combine (LineString a b rest) = VectorStorable.cons (combine a b) combineRest+combineToVector :: (a -> a -> b) -> LineString a -> Sequence.Seq b+combineToVector combine (LineString a b rest) = combine a b Sequence.<| combineRest where combineRest =- if VectorStorable.null rest+ if Sequence.null rest then- VectorStorable.empty+ Sequence.empty else- (VectorStorable.zipWith combine <*> VectorStorable.tail) (VectorStorable.cons b rest)+ (Sequence.zipWith combine <*> sequenceTail) (b Sequence.<| rest) {-# INLINE combineToVector #-} +sequenceTail :: Sequence.Seq a -> Sequence.Seq a+sequenceTail (_ Sequence.:<| tailS) = tailS+sequenceTail _ = Sequence.empty+ -- | -- create a vector from a LineString. -- LineString 1 2 [3,4] --> Vector [1,2,3,4] ---toVector :: (VectorStorable.Storable a) => LineString a -> VectorStorable.Vector a-toVector (LineString a b rest) = VectorStorable.cons a (VectorStorable.cons b rest)+toVector :: LineString a -> Sequence.Seq a+toVector (LineString a b rest) = a Sequence.<| ( b Sequence.<| rest) {-# INLINE toVector #-} -- | -- creates a LineString out of a vector of elements, -- if there are enough elements (needs at least 2) elements ---fromVector :: (Validation.Validate v, VectorStorable.Storable a) => VectorStorable.Vector a -> v VectorToLineStringError (LineString a)-fromVector v =- if VectorStorable.null v then- Validation._Failure # VectorEmpty+fromVector :: (Validation.Validate v) => Sequence.Seq a -> v VectorToLineStringError (LineString a)+fromVector v@(headS Sequence.:<| tailS) =+ if Sequence.null v then+ Validation._Failure # SingletonVector else- fromVector' (VectorStorable.head v) (VectorStorable.tail v)+ fromVector' headS tailS+fromVector _ = Validation._Failure # VectorEmpty {-# INLINE fromVector #-} -fromVector' :: (Validation.Validate v, VectorStorable.Storable a) => a -> VectorStorable.Vector a -> v VectorToLineStringError (LineString a)-fromVector' first v =- if VectorStorable.null v then+fromVector' :: (Validation.Validate v) => a -> Sequence.Seq a -> v VectorToLineStringError (LineString a)+fromVector' first v@(headS Sequence.:<| tailS) =+ if Sequence.null v then Validation._Failure # SingletonVector else- Validation._Success # LineString first (VectorStorable.head v) (VectorStorable.tail v)+ Validation._Success # LineString first headS tailS+fromVector' _ _ = Validation._Failure # SingletonVector {-# INLINE fromVector' #-} -- | -- Creates a LineString -- @makeLineString x y zs@ creates a `LineString` homomorphic to the list @[x, y] ++ zs@ ---makeLineString :: (VectorStorable.Storable a) =>+makeLineString :: a -- ^ The first element -> a -- ^ The second element- -> VectorStorable.Vector a -- ^ The rest of the optional elements+ -> Sequence.Seq a -- ^ The rest of the optional elements -> LineString a makeLineString = LineString @@ -173,29 +177,27 @@ show VectorEmpty = "Vector Empty" show SingletonVector = "Singleton Vector" -instance (Show a, VectorStorable.Storable a) => Show (LineString a) where+instance (Show a) => Show (LineString a) where show = show . fromLineString -map :: (VectorStorable.Storable a, VectorStorable.Storable b) => (a -> b) -> LineString a -> LineString b-map f (LineString x y zs) = LineString (f x) (f y) (VectorStorable.map f zs)-{-# INLINE map #-}+instance Functor LineString where+ fmap f (LineString x y zs) = LineString (f x) (f y) (fmap f zs) --- | This will run through the entire ring, closing the--- loop by also passing the initial element in again at the end.+-- | This will run through the line string. ---foldr :: (VectorStorable.Storable a) => (a -> b -> b) -> b -> LineString a -> b-foldr f u (LineString x y zs) = f x (f y (VectorStorable.foldr f u zs))-{-# INLINE foldr #-}+instance Foldable LineString where+ -- foldr :: (a -> b -> b) -> b -> LineString a -> b+ foldr f u (LineString x y zs) = f x (f y (Foldable.foldr f u zs)) -foldMap :: (Monoid m, VectorStorable.Storable a) => (a -> m) -> LineString a -> m-foldMap f = foldr (mappend . f) mempty-{-# INLINE foldMap #-}+instance Traversable LineString where+ -- sequenceA :: (Traversable t, Applicative f) => t (f a) -> f (t a)+ sequenceA (LineString fx fy fzs) = LineString <$> fx <*> fy <*> sequenceA fzs -instance (ToJSON a, VectorStorable.Storable a) => ToJSON (LineString a) where+instance (ToJSON a) => ToJSON (LineString a) where -- toJSON :: a -> Value toJSON = toJSON . fromLineString -instance (FromJSON a, Show a, VectorStorable.Storable a) => FromJSON (LineString a) where+instance (FromJSON a, Show a) => FromJSON (LineString a) where -- parseJSON :: Value -> Parser a parseJSON v = do xs <- parseJSON v@@ -204,12 +206,16 @@ -- helpers -fromListValidated :: (VectorStorable.Storable a) => [a] -> Validation.Validation ListToLineStringError (LineString a)+fromListValidated :: [a] -> Validation.Validation ListToLineStringError (LineString a) fromListValidated = fromList parseError :: Value -> Maybe ListToLineStringError -> Parser b parseError v = maybe mzero (\e -> typeMismatch (show e) v) -safeLast :: (VectorStorable.Storable a) => VectorStorable.Vector a -> Maybe a-safeLast x = if VectorStorable.null x then Nothing else Just $ VectorStorable.last x+-- safeLast :: (VectorStorable.Storable a) => Sequence.Seq a -> Maybe a+-- safeLast x = if Sequence.null x then Nothing else Just $ Sequence.last x+safeLast :: Sequence.Seq a -> Maybe a+safeLast x = case Sequence.viewr x of+ Sequence.EmptyR -> Nothing+ _ Sequence.:> b -> Just b {-# INLINE safeLast #-}
src/Data/LinearRing.hs view
@@ -28,36 +28,34 @@ , fromList , fromListWithEqCheck , makeLinearRing- , Data.LinearRing.map- , Data.LinearRing.foldr- , Data.LinearRing.foldMap , ringHead , ringLength ) where #if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ >= 800-import Prelude hiding (foldr)+import Prelude hiding (foldr) #else import Prelude #endif -import Control.Applicative (Applicative (..))+import Control.Applicative (Applicative (..)) import Control.DeepSeq-import Control.Lens (( # ), (^?))-import Control.Monad (mzero)-import Data.Aeson (FromJSON (..), ToJSON (..), Value)-import Data.Aeson.Types (Parser, typeMismatch)-import Data.Functor ((<$>))-import Data.List (intercalate)-import Data.List.NonEmpty as NL (NonEmpty, toList)-import qualified Data.Validation as Validation-import qualified Data.Vector.Storable as VectorStorable-import GHC.Generics (Generic)+import Control.Lens (( # ), (^?))+import Control.Monad (mzero)+import Data.Aeson (FromJSON (..), ToJSON (..), Value)+import Data.Aeson.Types (Parser, typeMismatch)+import qualified Data.Foldable as Foldable+import Data.Functor ((<$>))+import Data.List (intercalate)+import Data.List.NonEmpty as NL (NonEmpty, toList)+import qualified Data.Sequence as Sequence+import qualified Data.Validation as Validation+import GHC.Generics (Generic) -- | -- a LinearRing has at least 3 (distinct) elements ---data LinearRing a = LinearRing a a a (VectorStorable.Vector a) deriving (Eq, Show, Generic, NFData)+data LinearRing a = LinearRing a a a (Sequence.Seq a) deriving (Eq, Show, Generic, NFData) -- | -- When converting a List to a LinearRing there are some things that can go wrong@@ -93,14 +91,14 @@ -- | -- returns the number of elements in the list, including the replicated element at the end of the list. ---ringLength :: (VectorStorable.Storable a) => LinearRing a -> Int-ringLength (LinearRing _ _ _ xs) = 4 + VectorStorable.length xs+ringLength :: LinearRing a -> Int+ringLength (LinearRing _ _ _ xs) = 4 + Sequence.length xs -- | -- This function converts it into a list and appends the given element to the end. ---fromLinearRing :: (VectorStorable.Storable a) => LinearRing a -> [a]-fromLinearRing (LinearRing x y z ws) = x : y : z : VectorStorable.foldr (:) [x] ws+fromLinearRing :: LinearRing a -> [a]+fromLinearRing (LinearRing x y z ws) = x : y : z : Foldable.foldr (:) [x] ws -- | -- creates a LinearRing out of a list of elements,@@ -119,7 +117,7 @@ -- -- Unfortunately it doesn't check that the last element is the same as the first at the moment... ---fromList :: (Eq a, Show a, VectorStorable.Storable a, Validation.Validate v, Functor (v (NonEmpty (ListToLinearRingError a)))) => [a] -> v (NonEmpty (ListToLinearRingError a)) (LinearRing a)+fromList :: (Eq a, Show a, Validation.Validate v, Functor (v (NonEmpty (ListToLinearRingError a)))) => [a] -> v (NonEmpty (ListToLinearRingError a)) (LinearRing a) fromList (x:y:z:ws@(_:_)) = Validation._Success # LinearRing x y z (fromListDropLast ws) fromList xs = Validation._Failure # pure (ListTooShort (length xs)) {-# INLINE fromList #-}@@ -128,30 +126,34 @@ -- The expensive version of fromList that checks whether the head and last elements -- are equal. ---fromListWithEqCheck :: (Eq a, Show a, VectorStorable.Storable a, Validation.Validate v, Applicative (v (NonEmpty (ListToLinearRingError a)))) => [a] -> v (NonEmpty (ListToLinearRingError a)) (LinearRing a)+fromListWithEqCheck :: (Eq a, Show a, Validation.Validate v, Applicative (v (NonEmpty (ListToLinearRingError a)))) => [a] -> v (NonEmpty (ListToLinearRingError a)) (LinearRing a) fromListWithEqCheck xs = checkHeadAndLastEq xs *> fromList xs -- | -- create a vector from a LinearRing by combining values. -- LinearRing 1 2 3 [4,1] (,) --> Vector [(1,2),(2,3),(3,4),(4,1)] ---combineToVector :: (VectorStorable.Storable a, VectorStorable.Storable b) => (a -> a -> b) -> LinearRing a -> VectorStorable.Vector b-combineToVector combine (LinearRing a b c rest) = VectorStorable.cons (combine a b) (VectorStorable.cons (combine b c) combineRest)+combineToVector :: (a -> a -> b) -> LinearRing a -> Sequence.Seq b+combineToVector combine (LinearRing a b c rest) = combine a b Sequence.:<| (combine b c Sequence.:<| combineRest) where combineRest =- if VectorStorable.null rest+ if Sequence.null rest then- VectorStorable.empty+ Sequence.empty else- (VectorStorable.zipWith combine <*> VectorStorable.tail) (VectorStorable.cons c rest)+ (Sequence.zipWith combine <*> sequenceTail) (c Sequence.<| rest) {-# INLINE combineToVector #-} +sequenceTail :: Sequence.Seq a -> Sequence.Seq a+sequenceTail (_ Sequence.:<| tailS) = tailS+sequenceTail _ = Sequence.empty+ -- | -- create a vector from a LinearRing. -- LinearRing 1 2 3 [4,1] --> Vector [1,2,3,4,1)] ---toVector :: (VectorStorable.Storable a) => LinearRing a -> VectorStorable.Vector a-toVector (LinearRing a b c rest) = VectorStorable.cons a (VectorStorable.cons b (VectorStorable.cons c rest))+toVector :: LinearRing a -> Sequence.Seq a+toVector (LinearRing a b c rest) = a Sequence.:<| (b Sequence.:<| (c Sequence.:<| rest)) {-# INLINE toVector #-} -- |@@ -161,15 +163,21 @@ -- fromVector (x:y:z:ws@(_:_)) = _Success # LinearRing x y z (fromListDropLast ws) -- fromList xs = _Failure # return (ListTooShort (length xs)) -fromVector :: (Eq a, Show a, VectorStorable.Storable a, Validation.Validate v, Functor (v (NonEmpty (ListToLinearRingError a)))) => VectorStorable.Vector a -> v (NonEmpty (VectorToLinearRingError a)) (LinearRing a)-fromVector v =- if VectorStorable.length v >= 3 then- if VectorStorable.head v == VectorStorable.last v then- Validation._Success # LinearRing (VectorStorable.unsafeIndex v 0) (VectorStorable.unsafeIndex v 1) (VectorStorable.unsafeIndex v 2) (VectorStorable.drop 3 v)- else- Validation._Failure # pure (FirstNotEqualToLast (VectorStorable.head v) (VectorStorable.last v))- else- Validation._Failure # pure (VectorTooShort (VectorStorable.length v))+fromVector :: (Eq a, Show a, Validation.Validate v, Functor (v (NonEmpty (ListToLinearRingError a)))) => Sequence.Seq a -> v (NonEmpty (VectorToLinearRingError a)) (LinearRing a)+fromVector as =+ case as of+ (first Sequence.:<| (second Sequence.:<| (third Sequence.:<| rest@(_ Sequence.:|> lastS)))) ->+ if first == lastS then+ Validation._Success # LinearRing first second third rest+ else+ Validation._Failure # pure (FirstNotEqualToLast first lastS)+ (first Sequence.:<| (second Sequence.:<| (third Sequence.:<| _))) ->+ if first == third then+ Validation._Success # LinearRing first second third Sequence.empty+ else+ Validation._Failure # pure (FirstNotEqualToLast first third)+ v -> Validation._Failure # pure (VectorTooShort (Sequence.length v))+ _ -> Validation._Failure # pure (VectorTooShort 0) {-# INLINE fromVector #-} -- |@@ -180,44 +188,47 @@ -- -- Repeating the first element is just redundant. ---makeLinearRing :: (Eq a, Show a, VectorStorable.Storable a) =>+makeLinearRing :: (Eq a, Show a) => a -- ^ The first element -> a -- ^ The second element -> a -- ^ The third element- -> VectorStorable.Vector a -- ^ The rest of the optional elements (WITHOUT the first element repeated at the end)+ -> Sequence.Seq a -- ^ The rest of the optional elements (WITHOUT the first element repeated at the end) -> LinearRing a makeLinearRing = LinearRing -- instances -instance (Show a, VectorStorable.Storable a) => Show (ListToLinearRingError a) where+instance (Show a) => Show (ListToLinearRingError a) where show (ListTooShort n) = "List too short: (length = " ++ show n ++ ")" show (HeadNotEqualToLast h l) = "head (" ++ show h ++ ") /= last(" ++ show l ++ ")" -instance (Show a, VectorStorable.Storable a) => Show (VectorToLinearRingError a) where+instance (Show a) => Show (VectorToLinearRingError a) where show (VectorTooShort n) = "Vector too short: (length = " ++ show n ++ ")" show (FirstNotEqualToLast h l) = "head (" ++ show h ++ ") /= last(" ++ show l ++ ")" -map :: (VectorStorable.Storable a, VectorStorable.Storable b) => (a -> b) -> LinearRing a -> LinearRing b-map f (LinearRing x y z ws) = LinearRing (f x) (f y) (f z) (VectorStorable.map f ws)-{-# INLINE map #-}+instance Functor LinearRing where+ fmap f (LinearRing x y z ws) = LinearRing (f x) (f y) (f z) (fmap f ws) --- | This will run through the entire ring, closing the+-- | This instance of Foldable will run through the entire ring, closing the -- loop by also passing the initial element in again at the end. ---foldr :: VectorStorable.Storable a => (a -> b -> b) -> b -> LinearRing a -> b-foldr f u (LinearRing x y z ws) = f x (f y (f z (VectorStorable.foldr f (f x u) ws)))-{-# INLINE foldr #-}+instance Foldable LinearRing where+ -- foldr :: (a -> b -> b) -> b -> LinearRing a -> b+ foldr f u (LinearRing x y z ws) = f x (f y (f z (Foldable.foldr f (f x u) ws))) -foldMap :: (Monoid m, VectorStorable.Storable a) => (a -> m) -> LinearRing a -> m-foldMap f = foldr (mappend . f) mempty-{-# INLINE foldMap #-}+-- |+-- When traversing this Structure, the Applicative context+-- of the last element will be appended to the end to close the loop+--+instance Traversable LinearRing where+ -- sequenceA :: (Traversable t, Applicative f) => t (f a) -> f (t a)+ sequenceA (LinearRing fx fy fz fws) = (LinearRing <$> fx <*> fy <*> fz <*> sequenceA fws) <* fx -instance (ToJSON a, VectorStorable.Storable a) => ToJSON (LinearRing a) where+instance (ToJSON a) => ToJSON (LinearRing a) where -- toJSON :: a -> Value toJSON = toJSON . fromLinearRing -instance (Eq a, FromJSON a, Show a, VectorStorable.Storable a) => FromJSON (LinearRing a) where+instance (Eq a, FromJSON a, Show a) => FromJSON (LinearRing a) where -- parseJSON :: Value -> Parser a parseJSON v = do xs <- parseJSON v@@ -226,16 +237,16 @@ -- helpers -fromListAcc :: (Eq a, Show a, VectorStorable.Storable a) => [a] -> Validation.Validation (NonEmpty (ListToLinearRingError a)) (LinearRing a)+fromListAcc :: (Eq a, Show a) => [a] -> Validation.Validation (NonEmpty (ListToLinearRingError a)) (LinearRing a) fromListAcc = fromList -showErrors :: (Show a, VectorStorable.Storable a) => NonEmpty (ListToLinearRingError a) -> String+showErrors :: (Show a) => NonEmpty (ListToLinearRingError a) -> String showErrors = intercalate ", " . NL.toList . fmap show -parseError :: (Show a, VectorStorable.Storable a) => Value -> Maybe (NonEmpty (ListToLinearRingError a)) -> Parser b+parseError :: (Show a) => Value -> Maybe (NonEmpty (ListToLinearRingError a)) -> Parser b parseError v = maybe mzero (\e -> typeMismatch (showErrors e) v) -checkHeadAndLastEq :: (Eq a, VectorStorable.Storable a, Validation.Validate v, Functor (v (NonEmpty (ListToLinearRingError a))))+checkHeadAndLastEq :: (Eq a, Validation.Validate v, Functor (v (NonEmpty (ListToLinearRingError a)))) => [a] -> v (NonEmpty (ListToLinearRingError a)) () checkHeadAndLastEq = maybe (Validation._Failure # pure (ListTooShort 0)) (\(h, l) -> if h == l then Validation._Success # () else Validation._Failure # pure (HeadNotEqualToLast h l)) . mhl@@ -252,7 +263,12 @@ safeLast [x] = Just x safeLast (_:xs) = safeLast xs -fromListDropLast :: (Eq a, VectorStorable.Storable a) => [a] -> VectorStorable.Vector a-fromListDropLast [] = VectorStorable.empty-fromListDropLast [_] = VectorStorable.empty-fromListDropLast x = VectorStorable.unsafeInit $ VectorStorable.fromList x+fromListDropLast :: (Eq a) => [a] -> Sequence.Seq a+fromListDropLast [] = Sequence.empty+fromListDropLast [_] = Sequence.empty+fromListDropLast x = sequenceHead $ Sequence.fromList x++-- All but the last+sequenceHead :: Sequence.Seq a -> Sequence.Seq a+sequenceHead (headS Sequence.:|> _) = headS+sequenceHead _ = Sequence.empty
test/Arbitrary.hs view
@@ -2,8 +2,6 @@ module Arbitrary where -import qualified Data.Vector as Vector-import qualified Data.Vector.Storable as VectorStorable import Test.Tasty.QuickCheck (Arbitrary, arbitrary) -- Local@@ -11,14 +9,8 @@ import Data.LineString (LineString, makeLineString) -instance (Arbitrary a, Eq a, Show a, VectorStorable.Storable a) => Arbitrary (LinearRing a) where+instance (Arbitrary a, Eq a, Show a) => Arbitrary (LinearRing a) where arbitrary = makeLinearRing <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary -instance (Arbitrary a, Eq a, Show a, VectorStorable.Storable a) => Arbitrary (LineString a) where+instance (Arbitrary a, Eq a, Show a) => Arbitrary (LineString a) where arbitrary = makeLineString <$> arbitrary <*> arbitrary <*> arbitrary--instance (Arbitrary a, VectorStorable.Storable a) => Arbitrary (VectorStorable.Vector a) where- arbitrary = fmap VectorStorable.fromList arbitrary--instance (Arbitrary a) => Arbitrary (Vector.Vector a) where- arbitrary = fmap Vector.fromList arbitrary
test/Data/LineStringTests.hs view
@@ -1,7 +1,7 @@ module Data.LineStringTests where +import qualified Data.Sequence as Sequence import Data.Validation (Validation (..))-import qualified Data.Vector.Storable as VectorStorable import Test.Tasty import Test.Tasty.Hspec (Spec, context, describe, it, shouldBe, testSpec)@@ -52,7 +52,7 @@ -- > (\xs -> (lineStringHead xs) == (foldr (\a -> const a) 0 xs)) (xs :: LineString Int) -- testFoldable :: LineString.LineString Int -> Property-testFoldable xs = property $ (LineString.foldr (:) [] xs == LineString.fromLineString xs) && (LineString.lineStringHead xs == LineString.foldr const 0 xs)+testFoldable xs = property $ (foldr (:) [] xs == LineString.fromLineString xs) && (LineString.lineStringHead xs == foldr const 0 xs) -- Spec @@ -75,9 +75,9 @@ testFromList = describe "fromList" $ do it "creates a LineString out of a list of elements" $ do- LineString.fromList ([0, 1] :: [Int]) `shouldBe` Success (LineString.makeLineString 0 1 VectorStorable.empty)- LineString.fromList ([0, 1, 2] :: [Int]) `shouldBe` Success (LineString.makeLineString 0 1 (VectorStorable.fromList [2]))- LineString.fromList ([0, 1, 2, 4, 5, 0] :: [Int]) `shouldBe` Success (LineString.makeLineString 0 1 (VectorStorable.fromList [2, 4, 5, 0]))+ LineString.fromList ([0, 1] :: [Int]) `shouldBe` Success (LineString.makeLineString 0 1 Sequence.empty)+ LineString.fromList ([0, 1, 2] :: [Int]) `shouldBe` Success (LineString.makeLineString 0 1 (Sequence.fromList [2]))+ LineString.fromList ([0, 1, 2, 4, 5, 0] :: [Int]) `shouldBe` Success (LineString.makeLineString 0 1 (Sequence.fromList [2, 4, 5, 0])) context "when provided with invalid input" $ it "fails" $ do LineString.fromList ([] :: [Int]) `shouldBe` Failure LineString.ListEmpty@@ -87,29 +87,29 @@ testFromVector = describe "fromVector" $ do it "creates a LineString out of a Vector of elements" $ do- LineString.fromVector (VectorStorable.fromList [0, 1] :: (VectorStorable.Vector Int)) `shouldBe` Success (LineString.makeLineString 0 1 VectorStorable.empty)- LineString.fromVector (VectorStorable.fromList [0, 1, 2] :: (VectorStorable.Vector Int)) `shouldBe` Success (LineString.makeLineString 0 1 (VectorStorable.fromList [2]))- LineString.fromVector (VectorStorable.fromList [0, 1, 2, 4, 5, 0] :: (VectorStorable.Vector Int)) `shouldBe` Success (LineString.makeLineString 0 1 (VectorStorable.fromList [2, 4, 5, 0]))+ LineString.fromVector (Sequence.fromList [0, 1] :: (Sequence.Seq Int)) `shouldBe` Success (LineString.makeLineString 0 1 Sequence.empty)+ LineString.fromVector (Sequence.fromList [0, 1, 2] :: (Sequence.Seq Int)) `shouldBe` Success (LineString.makeLineString 0 1 (Sequence.fromList [2]))+ LineString.fromVector (Sequence.fromList [0, 1, 2, 4, 5, 0] :: (Sequence.Seq Int)) `shouldBe` Success (LineString.makeLineString 0 1 (Sequence.fromList [2, 4, 5, 0])) context "when provided with invalid input" $ it "fails" $ do- LineString.fromVector (VectorStorable.fromList [] :: (VectorStorable.Vector Int)) `shouldBe` Failure LineString.VectorEmpty- LineString.fromVector (VectorStorable.fromList [0] :: (VectorStorable.Vector Int)) `shouldBe` Failure LineString.SingletonVector+ LineString.fromVector (Sequence.fromList [] :: (Sequence.Seq Int)) `shouldBe` Failure LineString.VectorEmpty+ LineString.fromVector (Sequence.fromList [0] :: (Sequence.Seq Int)) `shouldBe` Failure LineString.SingletonVector testCombineToVector :: Spec testCombineToVector = describe "combineToVector" $ it "combine a LineString using PointXY" $ do- LineString.combineToVector BasicTypes.PointXY (LineString.makeLineString 0 1 VectorStorable.empty) `shouldBe` VectorStorable.fromList [BasicTypes.PointXY 0 1]- LineString.combineToVector BasicTypes.PointXY (LineString.makeLineString 0 1 (VectorStorable.fromList [2])) `shouldBe` VectorStorable.fromList [BasicTypes.PointXY 0 1, BasicTypes.PointXY 1 2]- LineString.combineToVector BasicTypes.PointXY (LineString.makeLineString 0 1 (VectorStorable.fromList [2, 4, 5, 0])) `shouldBe` VectorStorable.fromList [BasicTypes.PointXY 0 1, BasicTypes.PointXY 1 2, BasicTypes.PointXY 2 4, BasicTypes.PointXY 4 5, BasicTypes.PointXY 5 0]+ LineString.combineToVector BasicTypes.PointXY (LineString.makeLineString 0 1 Sequence.empty) `shouldBe` Sequence.fromList [BasicTypes.PointXY 0 1]+ LineString.combineToVector BasicTypes.PointXY (LineString.makeLineString 0 1 (Sequence.fromList [2])) `shouldBe` Sequence.fromList [BasicTypes.PointXY 0 1, BasicTypes.PointXY 1 2]+ LineString.combineToVector BasicTypes.PointXY (LineString.makeLineString 0 1 (Sequence.fromList [2, 4, 5, 0])) `shouldBe` Sequence.fromList [BasicTypes.PointXY 0 1, BasicTypes.PointXY 1 2, BasicTypes.PointXY 2 4, BasicTypes.PointXY 4 5, BasicTypes.PointXY 5 0] testToVector :: Spec testToVector = describe "toVector" $ it "from a LineString to a vector" $ do- LineString.toVector (LineString.makeLineString 0 1 VectorStorable.empty) `shouldBe` VectorStorable.fromList ([0, 1] :: [Int])- LineString.toVector (LineString.makeLineString 0 1 (VectorStorable.fromList [2])) `shouldBe` VectorStorable.fromList ([0, 1, 2] :: [Int])- LineString.toVector (LineString.makeLineString 0 1 (VectorStorable.fromList [2, 4, 5, 0])) `shouldBe` VectorStorable.fromList ([0, 1, 2, 4, 5, 0] :: [Int])+ LineString.toVector (LineString.makeLineString 0 1 Sequence.empty) `shouldBe` Sequence.fromList ([0, 1] :: [Int])+ LineString.toVector (LineString.makeLineString 0 1 (Sequence.fromList [2])) `shouldBe` Sequence.fromList ([0, 1, 2] :: [Int])+ LineString.toVector (LineString.makeLineString 0 1 (Sequence.fromList [2, 4, 5, 0])) `shouldBe` Sequence.fromList ([0, 1, 2, 4, 5, 0] :: [Int]) -- TODO -- (\xs -> safeLast (fromLineString xs) == Just (lineStringHead xs)) (xs :: LineString Int)
test/Data/LinearRingTests.hs view
@@ -1,8 +1,8 @@ module Data.LinearRingTests where import qualified Data.List.NonEmpty as ListNonEmpty+import qualified Data.Sequence as Sequence import qualified Data.Validation as Validation-import qualified Data.Vector.Storable as VectorStorable import Test.Tasty import Test.Tasty.Hspec (Spec, context, describe, it, shouldBe, testSpec)@@ -54,7 +54,7 @@ -- > (\xs -> (ringHead xs) == (foldr (\a -> const a) 0 xs)) (xs :: LinearRing Int) -- testFoldable :: LinearRing.LinearRing Int -> Property-testFoldable xs = property $ (LinearRing.foldr (:) [] xs == LinearRing.fromLinearRing xs) && (LinearRing.ringHead xs == LinearRing.foldr const 0 xs)+testFoldable xs = property $ (foldr (:) [] xs == LinearRing.fromLinearRing xs) && (LinearRing.ringHead xs == foldr const 0 xs) -- Spec @@ -86,10 +86,10 @@ testFromList = describe "fromList" $ do it "creates a LinearRing out of a list of elements" $ do- LinearRing.fromList ([0, 1, 2, 3] :: [Int]) `shouldBe` Validation.Success (LinearRing.makeLinearRing 0 1 2 VectorStorable.empty)- LinearRing.fromList ([0, 1, 2, 4, 0] :: [Int]) `shouldBe` Validation.Success (LinearRing.makeLinearRing 0 1 2 (VectorStorable.fromList [4]))- LinearRing.fromList ([0, 1, 2, 4, 5, 0] :: [Int]) `shouldBe` Validation.Success (LinearRing.makeLinearRing 0 1 2 (VectorStorable.fromList [4,5]))- LinearRing.fromList ([0, 1, 2, 4, 5, 6] :: [Int]) `shouldBe` Validation.Success (LinearRing.makeLinearRing 0 1 2 (VectorStorable.fromList [4,5]))+ LinearRing.fromList ([0, 1, 2, 3] :: [Int]) `shouldBe` Validation.Success (LinearRing.makeLinearRing 0 1 2 Sequence.empty)+ LinearRing.fromList ([0, 1, 2, 4, 0] :: [Int]) `shouldBe` Validation.Success (LinearRing.makeLinearRing 0 1 2 (Sequence.fromList [4]))+ LinearRing.fromList ([0, 1, 2, 4, 5, 0] :: [Int]) `shouldBe` Validation.Success (LinearRing.makeLinearRing 0 1 2 (Sequence.fromList [4,5]))+ LinearRing.fromList ([0, 1, 2, 4, 5, 6] :: [Int]) `shouldBe` Validation.Success (LinearRing.makeLinearRing 0 1 2 (Sequence.fromList [4,5])) context "when provided with invalid input" $ it "fails" $ do LinearRing.fromList [] `shouldBe` Validation.Failure (LinearRing.ListTooShort 0 ListNonEmpty.:| [] :: ListNonEmpty.NonEmpty (LinearRing.ListToLinearRingError Int))@@ -101,32 +101,32 @@ testFromVector = describe "fromVector" $ do it "creates a LinearRing out of a vector of elements" $ do- LinearRing.fromVector (VectorStorable.fromList ([0, 1, 0] :: [Int])) `shouldBe` Validation.Success (LinearRing.makeLinearRing 0 1 0 VectorStorable.empty)- LinearRing.fromVector (VectorStorable.fromList ([0, 1, 2, 0] :: [Int])) `shouldBe` Validation.Success (LinearRing.makeLinearRing 0 1 2 (VectorStorable.fromList [0]))- LinearRing.fromVector (VectorStorable.fromList ([0, 1, 2, 4, 0] :: [Int])) `shouldBe` Validation.Success (LinearRing.makeLinearRing 0 1 2 (VectorStorable.fromList [4, 0]))- LinearRing.fromVector (VectorStorable.fromList ([0, 1, 2, 4, 5, 0]:: [Int])) `shouldBe` Validation.Success (LinearRing.makeLinearRing 0 1 2 (VectorStorable.fromList [4, 5, 0]))+ LinearRing.fromVector (Sequence.fromList ([0, 1, 0] :: [Int])) `shouldBe` Validation.Success (LinearRing.makeLinearRing 0 1 0 Sequence.empty)+ LinearRing.fromVector (Sequence.fromList ([0, 1, 2, 0] :: [Int])) `shouldBe` Validation.Success (LinearRing.makeLinearRing 0 1 2 (Sequence.fromList [0]))+ LinearRing.fromVector (Sequence.fromList ([0, 1, 2, 4, 0] :: [Int])) `shouldBe` Validation.Success (LinearRing.makeLinearRing 0 1 2 (Sequence.fromList [4, 0]))+ LinearRing.fromVector (Sequence.fromList ([0, 1, 2, 4, 5, 0]:: [Int])) `shouldBe` Validation.Success (LinearRing.makeLinearRing 0 1 2 (Sequence.fromList [4, 5, 0])) context "when provided with invalid input" $ it "fails" $ do- LinearRing.fromVector (VectorStorable.fromList []) `shouldBe` Validation.Failure (LinearRing.VectorTooShort 0 ListNonEmpty.:| [] :: ListNonEmpty.NonEmpty (LinearRing.VectorToLinearRingError Int))- LinearRing.fromVector (VectorStorable.fromList [0]) `shouldBe` Validation.Failure (LinearRing.VectorTooShort 1 ListNonEmpty.:| [] :: ListNonEmpty.NonEmpty (LinearRing.VectorToLinearRingError Int))- LinearRing.fromVector (VectorStorable.fromList [0, 1]) `shouldBe` Validation.Failure (LinearRing.VectorTooShort 2 ListNonEmpty.:| [] :: ListNonEmpty.NonEmpty (LinearRing.VectorToLinearRingError Int))- LinearRing.fromVector (VectorStorable.fromList [0, 1, 2]) `shouldBe` Validation.Failure (LinearRing.FirstNotEqualToLast 0 2 ListNonEmpty.:| [] :: ListNonEmpty.NonEmpty (LinearRing.VectorToLinearRingError Int))+ LinearRing.fromVector (Sequence.fromList []) `shouldBe` Validation.Failure (LinearRing.VectorTooShort 0 ListNonEmpty.:| [] :: ListNonEmpty.NonEmpty (LinearRing.VectorToLinearRingError Int))+ LinearRing.fromVector (Sequence.fromList [0]) `shouldBe` Validation.Failure (LinearRing.VectorTooShort 1 ListNonEmpty.:| [] :: ListNonEmpty.NonEmpty (LinearRing.VectorToLinearRingError Int))+ LinearRing.fromVector (Sequence.fromList [0, 1]) `shouldBe` Validation.Failure (LinearRing.VectorTooShort 2 ListNonEmpty.:| [] :: ListNonEmpty.NonEmpty (LinearRing.VectorToLinearRingError Int))+ LinearRing.fromVector (Sequence.fromList [0, 1, 2]) `shouldBe` Validation.Failure (LinearRing.FirstNotEqualToLast 0 2 ListNonEmpty.:| [] :: ListNonEmpty.NonEmpty (LinearRing.VectorToLinearRingError Int)) testCombineToVector :: Spec testCombineToVector = describe "combineToVector" $ it "combine a LinearRing using tuples" $ do- LinearRing.combineToVector BasicTypes.PointXY (LinearRing.makeLinearRing 0 1 2 VectorStorable.empty) `shouldBe` VectorStorable.fromList [BasicTypes.PointXY 0 1, BasicTypes.PointXY 1 2]- LinearRing.combineToVector BasicTypes.PointXY (LinearRing.makeLinearRing 0 1 2 (VectorStorable.fromList [4])) `shouldBe` VectorStorable.fromList [BasicTypes.PointXY 0 1, BasicTypes.PointXY 1 2, BasicTypes.PointXY 2 4]- LinearRing.combineToVector BasicTypes.PointXY (LinearRing.makeLinearRing 0 1 2 (VectorStorable.fromList [4,5])) `shouldBe` VectorStorable.fromList [BasicTypes.PointXY 0 1, BasicTypes.PointXY 1 2, BasicTypes.PointXY 2 4, BasicTypes.PointXY 4 5]+ LinearRing.combineToVector BasicTypes.PointXY (LinearRing.makeLinearRing 0 1 2 Sequence.empty) `shouldBe` Sequence.fromList [BasicTypes.PointXY 0 1, BasicTypes.PointXY 1 2]+ LinearRing.combineToVector BasicTypes.PointXY (LinearRing.makeLinearRing 0 1 2 (Sequence.fromList [4])) `shouldBe` Sequence.fromList [BasicTypes.PointXY 0 1, BasicTypes.PointXY 1 2, BasicTypes.PointXY 2 4]+ LinearRing.combineToVector BasicTypes.PointXY (LinearRing.makeLinearRing 0 1 2 (Sequence.fromList [4,5])) `shouldBe` Sequence.fromList [BasicTypes.PointXY 0 1, BasicTypes.PointXY 1 2, BasicTypes.PointXY 2 4, BasicTypes.PointXY 4 5] testToVector :: Spec testToVector = describe "toVector" $ it "from a LinearRing to a vector" $ do- LinearRing.toVector (LinearRing.makeLinearRing 0 1 0 VectorStorable.empty) `shouldBe` VectorStorable.fromList ([0, 1, 0] :: [Int])- LinearRing.toVector (LinearRing.makeLinearRing 0 1 2 (VectorStorable.fromList [0])) `shouldBe` VectorStorable.fromList ([0, 1, 2, 0] :: [Int])- LinearRing.toVector (LinearRing.makeLinearRing 0 1 2 (VectorStorable.fromList [4,0])) `shouldBe` VectorStorable.fromList ([0, 1, 2, 4, 0] :: [Int])+ LinearRing.toVector (LinearRing.makeLinearRing 0 1 0 Sequence.empty) `shouldBe` Sequence.fromList ([0, 1, 0] :: [Int])+ LinearRing.toVector (LinearRing.makeLinearRing 0 1 2 (Sequence.fromList [0])) `shouldBe` Sequence.fromList ([0, 1, 2, 0] :: [Int])+ LinearRing.toVector (LinearRing.makeLinearRing 0 1 2 (Sequence.fromList [4,0])) `shouldBe` Sequence.fromList ([0, 1, 2, 4, 0] :: [Int]) -- TODO
test/Fixture.hs view
@@ -20,8 +20,7 @@ import Data.Geospatial.Internal.Geometry.GeoPolygon (GeoPolygon (..)) import qualified Data.LinearRing as LinearRing import qualified Data.LineString as LineString-import qualified Data.Vector as Vector-import qualified Data.Vector.Storable as VectorStorable+import qualified Data.Sequence as Sequence -- CRS Data @@ -44,21 +43,21 @@ testNamedCRS = NamedCRS "urn:ogc:def:crs:OGC:1.3:CRS84" mkBoundingBox :: [Double] -> BasicTypes.BoundingBoxWithoutCRS-mkBoundingBox x = BasicTypes.BoundingBoxWithoutCRS $ VectorStorable.fromList x+mkBoundingBox x = BasicTypes.BoundingBoxWithoutCRS $ Sequence.fromList x -- Bounding Box Data mkGeoPoint :: Double -> Double -> BasicTypes.GeoPositionWithoutCRS mkGeoPoint x y = BasicTypes.GeoPointXY $ BasicTypes.PointXY x y -lshapedPolyVertices :: Vector.Vector (LinearRing.LinearRing BasicTypes.GeoPositionWithoutCRS)-lshapedPolyVertices = Vector.fromList [LinearRing.makeLinearRing (mkGeoPoint 120.0 (-15.0)) (mkGeoPoint 127.0 (-15.0)) (mkGeoPoint 127.0 (-25.0)) (VectorStorable.fromList [mkGeoPoint 124.0 (-25.0), mkGeoPoint 124.0 (-18.0), mkGeoPoint 120.0 (-18.0)])]+lshapedPolyVertices :: Sequence.Seq (LinearRing.LinearRing BasicTypes.GeoPositionWithoutCRS)+lshapedPolyVertices = Sequence.fromList [LinearRing.makeLinearRing (mkGeoPoint 120.0 (-15.0)) (mkGeoPoint 127.0 (-15.0)) (mkGeoPoint 127.0 (-25.0)) (Sequence.fromList [mkGeoPoint 124.0 (-25.0), mkGeoPoint 124.0 (-18.0), mkGeoPoint 120.0 (-18.0)])] lshapedPolyLineVertices :: LineString.LineString BasicTypes.GeoPositionWithoutCRS-lshapedPolyLineVertices = LineString.makeLineString (mkGeoPoint 120.0 (-15.0)) (mkGeoPoint 127.0 (-15.0)) (VectorStorable.fromList [mkGeoPoint 127.0 (-25.0), mkGeoPoint 124.0 (-25.0), mkGeoPoint 124.0 (-18.0), mkGeoPoint 120.0 (-18.0)])+lshapedPolyLineVertices = LineString.makeLineString (mkGeoPoint 120.0 (-15.0)) (mkGeoPoint 127.0 (-15.0)) (Sequence.fromList [mkGeoPoint 127.0 (-25.0), mkGeoPoint 124.0 (-25.0), mkGeoPoint 124.0 (-18.0), mkGeoPoint 120.0 (-18.0)]) -emptyVertices :: Vector.Vector (LinearRing.LinearRing BasicTypes.GeoPositionWithoutCRS)-emptyVertices = Vector.empty+emptyVertices :: Sequence.Seq (LinearRing.LinearRing BasicTypes.GeoPositionWithoutCRS)+emptyVertices = Sequence.empty emptyLineVertices :: [BasicTypes.GeoPositionWithoutCRS] emptyLineVertices = []@@ -131,7 +130,7 @@ emptyMultiPolyJSON = "{\"type\":\"MultiPolygon\",\"coordinates\":[]}" emptyMultiGeoPoly :: GeoMultiPolygon-emptyMultiGeoPoly = GeoMultiPolygon Vector.empty+emptyMultiGeoPoly = GeoMultiPolygon Sequence.empty emptyMultiPoly :: GeospatialGeometry emptyMultiPoly = MultiPolygon emptyMultiGeoPoly@@ -140,7 +139,7 @@ singlePolyMultiPolyJSON = "{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18]]]]}" singlePolyGeoMultiPoly :: GeoMultiPolygon-singlePolyGeoMultiPoly = mergeGeoPolygons (Vector.fromList [lShapedGeoPoly])+singlePolyGeoMultiPoly = mergeGeoPolygons (Sequence.fromList [lShapedGeoPoly]) singlePolyMultiPoly :: GeospatialGeometry singlePolyMultiPoly = MultiPolygon singlePolyGeoMultiPoly@@ -149,7 +148,7 @@ multiPolyJSON = "{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18]]],[]]}" geoMultiPoly :: GeoMultiPolygon-geoMultiPoly = mergeGeoPolygons (Vector.fromList [lShapedGeoPoly, emptyGeoPoly])+geoMultiPoly = mergeGeoPolygons (Sequence.fromList [lShapedGeoPoly, emptyGeoPoly]) multiPoly :: GeospatialGeometry multiPoly = MultiPolygon geoMultiPoly@@ -169,7 +168,7 @@ emptyMultiLineJSON = "{\"type\":\"MultiLineString\",\"coordinates\":[]}" emptyMultiGeoLine :: GeoMultiLine-emptyMultiGeoLine = GeoMultiLine Vector.empty+emptyMultiGeoLine = GeoMultiLine Sequence.empty emptyMultiLine :: GeospatialGeometry emptyMultiLine = MultiLine emptyMultiGeoLine@@ -178,7 +177,7 @@ singleLineMultiLineJSON = "{\"type\":\"MultiLineString\",\"coordinates\":[[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18]]]}" singleLineGeoMultiLine :: GeoMultiLine-singleLineGeoMultiLine = mergeGeoLines (Vector.fromList [lShapedGeoLine])+singleLineGeoMultiLine = mergeGeoLines (Sequence.fromList [lShapedGeoLine]) singleLineMultiLine :: GeospatialGeometry singleLineMultiLine = MultiLine singleLineGeoMultiLine@@ -187,7 +186,7 @@ multiLineJSON = "{\"coordinates\":[[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18]],[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18]]],\"type\":\"MultiLineString\"}" geoMultiLine :: GeoMultiLine-geoMultiLine = mergeGeoLines (Vector.fromList [lShapedGeoLine, lShapedGeoLine])+geoMultiLine = mergeGeoLines (Sequence.fromList [lShapedGeoLine, lShapedGeoLine]) multiLine :: GeospatialGeometry multiLine = MultiLine geoMultiLine@@ -197,13 +196,13 @@ emptyCollectionJSON = "{\"type\":\"GeometryCollection\",\"geometries\":[]}" emptyCollection :: GeospatialGeometry-emptyCollection = Collection Vector.empty+emptyCollection = Collection Sequence.empty bigassCollectionJSON :: BS.ByteString bigassCollectionJSON = "{\"geometries\":[{\"coordinates\":[[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18]]],\"type\":\"MultiLineString\"},{\"coordinates\":[],\"type\":\"MultiLineString\"},{\"coordinates\":[[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18]],[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18]]],\"type\":\"MultiLineString\"},{\"coordinates\":[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18]],\"type\":\"LineString\"},{\"coordinates\":[[[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18],[120,-15]]],[]],\"type\":\"MultiPolygon\"},{\"coordinates\":[[[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18],[120,-15]]]],\"type\":\"MultiPolygon\"},{\"coordinates\":[[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18],[120,-15]]],\"type\":\"Polygon\"},{\"coordinates\":[],\"type\":\"MultiPolygon\"},{\"coordinates\":[[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18],[120,-15]]],\"type\":\"Polygon\"}],\"type\":\"GeometryCollection\"}" bigassCollection :: GeospatialGeometry-bigassCollection = Collection $ Vector.fromList [singleLineMultiLine, emptyMultiLine, multiLine, lShapedLine, multiPoly, singlePolyMultiPoly, lShapedPoly, emptyMultiPoly, lShapedPoly]+bigassCollection = Collection $ Sequence.fromList [singleLineMultiLine, emptyMultiLine, multiLine, lShapedLine, multiPoly, singlePolyMultiPoly, lShapedPoly, emptyMultiPoly, lShapedPoly] -- Properties Data @@ -250,8 +249,8 @@ -- FeatureCollection Data -features :: Vector.Vector (GeoFeature Aeson.Value)-features = Vector.fromList [featureWithNoBBox, featureWithNoGeometry, featureWithNoBBox, featureWithNoId, featureWithNoProperties, bigFeature]+features :: Sequence.Seq (GeoFeature Aeson.Value)+features = Sequence.fromList [featureWithNoBBox, featureWithNoGeometry, featureWithNoBBox, featureWithNoId, featureWithNoProperties, bigFeature] bigAssFeatureCollectionJSON :: BS.ByteString bigAssFeatureCollectionJSON = "{\"bbox\":[-32,147.5,-29.5,151],\"features\":[{\"geometry\":{\"geometries\":[{\"coordinates\":[[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18]]],\"type\":\"MultiLineString\"},{\"coordinates\":[],\"type\":\"MultiLineString\"},{\"coordinates\":[[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18]],[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18]]],\"type\":\"MultiLineString\"},{\"coordinates\":[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18]],\"type\":\"LineString\"},{\"coordinates\":[[[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18],[120,-15]]],[]],\"type\":\"MultiPolygon\"},{\"coordinates\":[[[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18],[120,-15]]]],\"type\":\"MultiPolygon\"},{\"coordinates\":[[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18],[120,-15]]],\"type\":\"Polygon\"},{\"coordinates\":[],\"type\":\"MultiPolygon\"},{\"coordinates\":[[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18],[120,-15]]],\"type\":\"Polygon\"}],\"type\":\"GeometryCollection\"},\"id\":\"GW001\",\"type\":\"Feature\",\"properties\":{\"depth\":5,\"comment\":\"Bore run over by dump truck\"}},{\"bbox\":[-32,147.5,-29.5,151],\"geometry\":null,\"id\":\"GW001\",\"type\":\"Feature\",\"properties\":{\"depth\":5,\"comment\":\"Bore run over by dump truck\"}},{\"geometry\":{\"geometries\":[{\"coordinates\":[[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18]]],\"type\":\"MultiLineString\"},{\"coordinates\":[],\"type\":\"MultiLineString\"},{\"coordinates\":[[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18]],[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18]]],\"type\":\"MultiLineString\"},{\"coordinates\":[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18]],\"type\":\"LineString\"},{\"coordinates\":[[[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18],[120,-15]]],[]],\"type\":\"MultiPolygon\"},{\"coordinates\":[[[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18],[120,-15]]]],\"type\":\"MultiPolygon\"},{\"coordinates\":[[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18],[120,-15]]],\"type\":\"Polygon\"},{\"coordinates\":[],\"type\":\"MultiPolygon\"},{\"coordinates\":[[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18],[120,-15]]],\"type\":\"Polygon\"}],\"type\":\"GeometryCollection\"},\"id\":\"GW001\",\"type\":\"Feature\",\"properties\":{\"depth\":5,\"comment\":\"Bore run over by dump truck\"}},{\"bbox\":[-32,147.5,-29.5,151],\"geometry\":{\"geometries\":[{\"coordinates\":[[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18]]],\"type\":\"MultiLineString\"},{\"coordinates\":[],\"type\":\"MultiLineString\"},{\"coordinates\":[[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18]],[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18]]],\"type\":\"MultiLineString\"},{\"coordinates\":[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18]],\"type\":\"LineString\"},{\"coordinates\":[[[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18],[120,-15]]],[]],\"type\":\"MultiPolygon\"},{\"coordinates\":[[[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18],[120,-15]]]],\"type\":\"MultiPolygon\"},{\"coordinates\":[[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18],[120,-15]]],\"type\":\"Polygon\"},{\"coordinates\":[],\"type\":\"MultiPolygon\"},{\"coordinates\":[[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18],[120,-15]]],\"type\":\"Polygon\"}],\"type\":\"GeometryCollection\"},\"type\":\"Feature\",\"properties\":{\"depth\":5,\"comment\":\"Bore run over by dump truck\"}},{\"bbox\":[-32,147.5,-29.5,151],\"geometry\":{\"geometries\":[{\"coordinates\":[[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18]]],\"type\":\"MultiLineString\"},{\"coordinates\":[],\"type\":\"MultiLineString\"},{\"coordinates\":[[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18]],[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18]]],\"type\":\"MultiLineString\"},{\"coordinates\":[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18]],\"type\":\"LineString\"},{\"coordinates\":[[[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18],[120,-15]]],[]],\"type\":\"MultiPolygon\"},{\"coordinates\":[[[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18],[120,-15]]]],\"type\":\"MultiPolygon\"},{\"coordinates\":[[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18],[120,-15]]],\"type\":\"Polygon\"},{\"coordinates\":[],\"type\":\"MultiPolygon\"},{\"coordinates\":[[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18],[120,-15]]],\"type\":\"Polygon\"}],\"type\":\"GeometryCollection\"},\"id\":\"GW001\",\"type\":\"Feature\",\"properties\":null},{\"bbox\":[-32,147.5,-29.5,151],\"geometry\":{\"geometries\":[{\"coordinates\":[[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18]]],\"type\":\"MultiLineString\"},{\"coordinates\":[],\"type\":\"MultiLineString\"},{\"coordinates\":[[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18]],[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18]]],\"type\":\"MultiLineString\"},{\"coordinates\":[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18]],\"type\":\"LineString\"},{\"coordinates\":[[[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18],[120,-15]]],[]],\"type\":\"MultiPolygon\"},{\"coordinates\":[[[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18],[120,-15]]]],\"type\":\"MultiPolygon\"},{\"coordinates\":[[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18],[120,-15]]],\"type\":\"Polygon\"},{\"coordinates\":[],\"type\":\"MultiPolygon\"},{\"coordinates\":[[[120,-15],[127,-15],[127,-25],[124,-25],[124,-18],[120,-18],[120,-15]]],\"type\":\"Polygon\"}],\"type\":\"GeometryCollection\"},\"id\":\"GW001\",\"type\":\"Feature\",\"properties\":{\"depth\":5,\"comment\":\"Bore run over by dump truck\"}}],\"type\":\"FeatureCollection\"}"@@ -269,10 +268,10 @@ emptyFeatureCollectionJSON = "{\"type\":\"FeatureCollection\",\"features\":[]}" emptyFeatureCollection :: GeoFeatureCollection Aeson.Value-emptyFeatureCollection = GeoFeatureCollection Nothing Vector.empty+emptyFeatureCollection = GeoFeatureCollection Nothing Sequence.empty emptyFeatureCollectionWithBBoxJSON :: BS.ByteString emptyFeatureCollectionWithBBoxJSON = "{\"type\":\"FeatureCollection\",\"features\":[],\"bbox\":[-32,147.5,-29.5,151]}" emptyFeatureCollectionWithBBox :: GeoFeatureCollection Aeson.Value-emptyFeatureCollectionWithBBox = GeoFeatureCollection bbox Vector.empty+emptyFeatureCollectionWithBBox = GeoFeatureCollection bbox Sequence.empty