module Data.Geo.Route.Track( Track , HasTrack(..) , (-|) , (.|) , (--|) , (..|) , (|-|) , (|.|) , (|--|) , (|..|) , trackPoints ) where import Prelude(Show) import Control.Lens(Lens', (^.), lens) import Control.Monad(Monad(return, (>>=))) import Data.Eq(Eq) import Data.Function(id) import Data.Functor.Apply(Apply, liftF2) import Data.Ord(Ord) import Data.String(String) import Data.Geo.Coordinate(HasCoordinate(coordinate)) import Data.Geo.Route.Gpx(Gpx(gpx)) import Data.Geo.Route.Osrm(Osrm(allCoordinates)) import Data.Geo.Route.TrackHeader(TrackHeader, HasTrackHeader(trackHeader), emptyTrackHeader) import Data.Geo.Route.Waypoint(Waypoint, gpxWaypoint) import Data.List(concat) import Text.Printf(printf) data Track = Track TrackHeader [[Waypoint]] deriving (Eq, Ord, Show) (-|) :: Waypoint -> Waypoint -> Track w1 -| w2 = Track emptyTrackHeader [[w1, w2]] infixr 5 -| (.|) :: Apply f => f Waypoint -> f Waypoint -> f Track (.|)= liftF2 (-|) infixr 5 .| (--|) :: Waypoint -> Waypoint -> Track w1 --| w2 = Track emptyTrackHeader [[w1], [w2]] infixr 5 --| (..|) :: Apply f => f Waypoint -> f Waypoint -> f Track (..|)= liftF2 (--|) infixr 5 ..| (|-|) :: Waypoint -> Track -> Track w |-| Track r [] = Track r [[w]] w |-| Track r (h:t) = Track r ((w:h):t) infixr 5 |-| (|.|) :: Apply f => f Waypoint -> f Track -> f Track (|.|) = liftF2 (|-|) infixr 5 |.| (|--|) :: Waypoint -> Track -> Track w |--| Track r t = Track r ([w]:t) infixr 5 |--| (|..|) :: Apply f => f Waypoint -> f Track -> f Track (|..|) = liftF2 (|--|) infixr 5 |..| trackPoints :: Track -> [Waypoint] trackPoints (Track _ t) = concat t class HasTrack t where track :: Lens' t Track instance HasTrack Track where track = id instance HasTrackHeader Track where trackHeader = lens (\(Track r _) -> r) (\(Track _ t) r -> Track r t) instance Osrm Track where allCoordinates (Track _ t) = do w <- t x <- w return (x ^. coordinate) instance Gpx Track where gpx (Track r t) = printf "%s%s" (gpx r) (t >>= \listways -> printf "%s" (listways >>= gpxWaypoint "trkpt") :: String)