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

module Data.Aviation.Casr.Logbook.Types.Rating(
  Rating(..)
, HasRating(..)
, nodayrating
, dayrating
, ratingAchieved'
) where

import Control.Category
import Control.Lens(makeClassy, Traversal', _Just)
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 Rating =
  Rating {
    Rating -> String
_ratingName :: String
  , Rating -> Maybe Day
_ratingAchieved :: Maybe Day
  } deriving (Rating -> Rating -> Bool
(Rating -> Rating -> Bool)
-> (Rating -> Rating -> Bool) -> Eq Rating
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Rating -> Rating -> Bool
== :: Rating -> Rating -> Bool
$c/= :: Rating -> Rating -> Bool
/= :: Rating -> Rating -> Bool
Eq, Eq Rating
Eq Rating =>
(Rating -> Rating -> Ordering)
-> (Rating -> Rating -> Bool)
-> (Rating -> Rating -> Bool)
-> (Rating -> Rating -> Bool)
-> (Rating -> Rating -> Bool)
-> (Rating -> Rating -> Rating)
-> (Rating -> Rating -> Rating)
-> Ord Rating
Rating -> Rating -> Bool
Rating -> Rating -> Ordering
Rating -> Rating -> Rating
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 :: Rating -> Rating -> Ordering
compare :: Rating -> Rating -> Ordering
$c< :: Rating -> Rating -> Bool
< :: Rating -> Rating -> Bool
$c<= :: Rating -> Rating -> Bool
<= :: Rating -> Rating -> Bool
$c> :: Rating -> Rating -> Bool
> :: Rating -> Rating -> Bool
$c>= :: Rating -> Rating -> Bool
>= :: Rating -> Rating -> Bool
$cmax :: Rating -> Rating -> Rating
max :: Rating -> Rating -> Rating
$cmin :: Rating -> Rating -> Rating
min :: Rating -> Rating -> Rating
Ord, Int -> Rating -> ShowS
[Rating] -> ShowS
Rating -> String
(Int -> Rating -> ShowS)
-> (Rating -> String) -> ([Rating] -> ShowS) -> Show Rating
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Rating -> ShowS
showsPrec :: Int -> Rating -> ShowS
$cshow :: Rating -> String
show :: Rating -> String
$cshowList :: [Rating] -> ShowS
showList :: [Rating] -> ShowS
Show)

makeClassy ''Rating

ratingAchieved' ::
  HasRating c =>
  Traversal' c Day
ratingAchieved' :: forall c. HasRating c => Traversal' c Day
ratingAchieved' =
  (Maybe Day -> f (Maybe Day)) -> c -> f c
forall c. HasRating c => Lens' c (Maybe Day)
Lens' c (Maybe Day)
ratingAchieved ((Maybe Day -> f (Maybe Day)) -> c -> f c)
-> ((Day -> f Day) -> Maybe Day -> f (Maybe Day))
-> (Day -> f Day)
-> 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
. (Day -> f Day) -> Maybe Day -> f (Maybe Day)
forall a b (p :: * -> * -> *) (f :: * -> *).
(Choice p, Applicative f) =>
p a (f b) -> p (Maybe a) (f (Maybe b))
_Just

nodayrating ::
  String
  -> Rating
nodayrating :: String -> Rating
nodayrating String
r =
  String -> Maybe Day -> Rating
Rating
    String
r
    Maybe Day
forall a. Maybe a
Nothing

dayrating ::
  String
  -> Day
  -> Rating
dayrating :: String -> Day -> Rating
dayrating String
r Day
d =
  String -> Maybe Day -> Rating
Rating
    String
r
    (Day -> Maybe Day
forall a. a -> Maybe a
Just Day
d)