packages feed

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