{-# OPTIONS_GHC -Wall #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE TemplateHaskell #-}

module Data.Aviation.Casr.Logbook.Types.FlightPoint(
  FlightPoint(..)
, HasFlightPoint(..)
, pointatdate
, runwayatdate
, runway'
) where

import Control.Category ( Category((.)) )
import Control.Lens(makeClassy, Traversal', _Just)
import Data.Aviation.Casr.Logbook.Types.Time(Time, dayonly)
import Data.Eq(Eq)
import Data.Maybe(Maybe(Nothing, Just))
import Data.Ord(Ord)
import Data.String(String)
import Data.Time(Day)
import Prelude(Show)

data FlightPoint =
  FlightPoint {
    FlightPoint -> String
_point :: String
  , FlightPoint -> Maybe String
_runway :: Maybe String
  , FlightPoint -> Time
_landingTime :: Time
  } deriving (FlightPoint -> FlightPoint -> Bool
(FlightPoint -> FlightPoint -> Bool)
-> (FlightPoint -> FlightPoint -> Bool) -> Eq FlightPoint
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: FlightPoint -> FlightPoint -> Bool
== :: FlightPoint -> FlightPoint -> Bool
$c/= :: FlightPoint -> FlightPoint -> Bool
/= :: FlightPoint -> FlightPoint -> Bool
Eq, Eq FlightPoint
Eq FlightPoint =>
(FlightPoint -> FlightPoint -> Ordering)
-> (FlightPoint -> FlightPoint -> Bool)
-> (FlightPoint -> FlightPoint -> Bool)
-> (FlightPoint -> FlightPoint -> Bool)
-> (FlightPoint -> FlightPoint -> Bool)
-> (FlightPoint -> FlightPoint -> FlightPoint)
-> (FlightPoint -> FlightPoint -> FlightPoint)
-> Ord FlightPoint
FlightPoint -> FlightPoint -> Bool
FlightPoint -> FlightPoint -> Ordering
FlightPoint -> FlightPoint -> FlightPoint
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: FlightPoint -> FlightPoint -> Ordering
compare :: FlightPoint -> FlightPoint -> Ordering
$c< :: FlightPoint -> FlightPoint -> Bool
< :: FlightPoint -> FlightPoint -> Bool
$c<= :: FlightPoint -> FlightPoint -> Bool
<= :: FlightPoint -> FlightPoint -> Bool
$c> :: FlightPoint -> FlightPoint -> Bool
> :: FlightPoint -> FlightPoint -> Bool
$c>= :: FlightPoint -> FlightPoint -> Bool
>= :: FlightPoint -> FlightPoint -> Bool
$cmax :: FlightPoint -> FlightPoint -> FlightPoint
max :: FlightPoint -> FlightPoint -> FlightPoint
$cmin :: FlightPoint -> FlightPoint -> FlightPoint
min :: FlightPoint -> FlightPoint -> FlightPoint
Ord, Int -> FlightPoint -> ShowS
[FlightPoint] -> ShowS
FlightPoint -> String
(Int -> FlightPoint -> ShowS)
-> (FlightPoint -> String)
-> ([FlightPoint] -> ShowS)
-> Show FlightPoint
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> FlightPoint -> ShowS
showsPrec :: Int -> FlightPoint -> ShowS
$cshow :: FlightPoint -> String
show :: FlightPoint -> String
$cshowList :: [FlightPoint] -> ShowS
showList :: [FlightPoint] -> ShowS
Show)

makeClassy ''FlightPoint

runway' ::
  HasFlightPoint c =>
  Traversal' c String
runway' :: forall c. HasFlightPoint c => Traversal' c String
runway' =
  (Maybe String -> f (Maybe String)) -> c -> f c
forall c. HasFlightPoint c => Lens' c (Maybe String)
Lens' c (Maybe String)
runway ((Maybe String -> f (Maybe String)) -> c -> f c)
-> ((String -> f String) -> Maybe String -> f (Maybe String))
-> (String -> f String)
-> c
-> f c
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (String -> f String) -> Maybe String -> f (Maybe String)
forall a b (p :: * -> * -> *) (f :: * -> *).
(Choice p, Applicative f) =>
p a (f b) -> p (Maybe a) (f (Maybe b))
_Just

pointatdate ::
  String
  -> Day
  -> FlightPoint
pointatdate :: String -> Day -> FlightPoint
pointatdate String
a Day
d =
  String -> Maybe String -> Time -> FlightPoint
FlightPoint
    String
a
    Maybe String
forall a. Maybe a
Nothing
    (Day -> Time
dayonly Day
d)

runwayatdate ::
  String
  -> String
  -> Day
  -> FlightPoint
runwayatdate :: String -> String -> Day -> FlightPoint
runwayatdate String
a String
r Day
d =
  String -> Maybe String -> Time -> FlightPoint
FlightPoint
    String
a
    (String -> Maybe String
forall a. a -> Maybe a
Just String
r)
    (Day -> Time
dayonly Day
d)