/**
 * Point geometry object.
 * https://tools.ietf.org/html/rfc7946#section-3.1.2
 */
export type Point = {
	type: 'Point';
	coordinates: number[];
};

/**
 * LineString geometry object.
 * https://tools.ietf.org/html/rfc7946#section-3.1.4
 */
export type LineString = {
	type: 'LineString';
	coordinates: number[][];
};

/**
 * Polygon geometry object.
 * https://tools.ietf.org/html/rfc7946#section-3.1.6
 */
export type Polygon = {
	type: 'Polygon';
	coordinates: number[][][];
};

/**
 * MultiPoint geometry object.
 *  https://tools.ietf.org/html/rfc7946#section-3.1.3
 */
export type MultiPoint = {
	type: 'MultiPoint';
	coordinates: number[][];
};

/**
 * MultiLineString geometry object.
 * https://tools.ietf.org/html/rfc7946#section-3.1.5
 */
export type MultiLineString = {
	type: 'MultiLineString';
	coordinates: number[][][];
};

/**
 * MultiPolygon geometry object.
 * https://tools.ietf.org/html/rfc7946#section-3.1.7
 */
export type MultiPolygon = {
	type: 'MultiPolygon';
	coordinates: number[][][][];
};

/**
 * Geometry Collection
 * https://tools.ietf.org/html/rfc7946#section-3.1.8
 */
export type GeometryCollection = {
	type: 'GeometryCollection';
	geometries: (Point | LineString | Polygon | MultiPoint | MultiLineString | MultiPolygon)[];
};

/**
 * Union of Geometry objects.
 */
export type Geometry =
	| Point
	| LineString
	| Polygon
	| MultiPoint
	| MultiLineString
	| MultiPolygon
	| GeometryCollection;
export type Geography = Geometry;

/**
 * A feature object which contains a geometry and associated properties.
 * https://tools.ietf.org/html/rfc7946#section-3.2
 */
export type Feature = {
	type: 'Feature';
	geometry: Geometry;
	id?: string | number;
	bbox?: number[];
	properties: { [name: string]: any } | null;
};

/**
 * A collection of feature objects.
 *  https://tools.ietf.org/html/rfc7946#section-3.3
 */
export type FeatureCollection = {
	type: 'FeatureCollection';
	bbox?: number[];
	features: Feature[];
};

/**
 * Union of GeoJSON objects.
 */
export type GeoJSON = Geometry | Feature | FeatureCollection;
