module Data.Geo.Route.Osrm(
  Osrm(..)
) where

import Prelude(Show(show))
import Data.Eq(Eq((==)))
import Data.Function(id, (.))
import Data.Functor(Functor(fmap))
import Data.List((++), intercalate)
import Data.String(String)
import Control.Lens((#), (^.))
import Data.Geo.Coordinate.Latitude(HasLatitude(latitude), latitude, fracLatitude)
import Data.Geo.Coordinate.Longitude(HasLongitude(longitude), longitude, fracLongitude)
import Data.Geo.Coordinate.Coordinate(Coordinate, HasCoordinate(coordinate))
import Text.Printf(printf)

class Osrm o where
  allCoordinates ::
    o
    -> [Coordinate]
  osrm ::
    o
    -> String
  osrm =
    let removeAdjacentDuplicates ::
          Eq a =>
          [a]
          -> [a]
        removeAdjacentDuplicates [] =
          []
        removeAdjacentDuplicates [h] =
          [h]
        removeAdjacentDuplicates (h:x:xs) =
          (if h == x then id else (h:)) (removeAdjacentDuplicates (x:xs))
    in ("http://map.project-osrm.org/?" ++) .
       intercalate "&" .
       fmap (\c -> let c' = c ^. coordinate
                   in printf "loc=%0.6f,%0.6f" (fracLatitude # (c' ^. latitude)) (fracLongitude # (c' ^. longitude))) .
       removeAdjacentDuplicates .
       allCoordinates