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

module Data.Aviation.Casr.Logbook.Types.Logbook(
  Logbook(..)
, HasLogbook(..)
, aviatorlogbook
, emptylogbook
, singleentrylogbook
) where

import Control.Lens(makeClassy)
import Data.Aviation.Casr.Logbook.Types.Aviator(Aviator)
import Data.Aviation.Casr.Logbook.Types.Entries(Entries(Entries), emptyentries, singleentry)
import Data.Aviation.Casr.Logbook.Types.Entry(Entry)
import Data.Eq(Eq)
import Data.Ord(Ord)
import Prelude(Show)

data Logbook ae se ee be =
  Logbook {
    forall ae se ee be. Logbook ae se ee be -> Aviator
_logbookaviator :: Aviator
  , forall ae se ee be. Logbook ae se ee be -> Entries ae se ee be
_logbookentries :: Entries ae se ee be
  } deriving (Logbook ae se ee be -> Logbook ae se ee be -> Bool
(Logbook ae se ee be -> Logbook ae se ee be -> Bool)
-> (Logbook ae se ee be -> Logbook ae se ee be -> Bool)
-> Eq (Logbook ae se ee be)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall ae se ee be.
(Eq ae, Eq se, Eq ee, Eq be) =>
Logbook ae se ee be -> Logbook ae se ee be -> Bool
$c== :: forall ae se ee be.
(Eq ae, Eq se, Eq ee, Eq be) =>
Logbook ae se ee be -> Logbook ae se ee be -> Bool
== :: Logbook ae se ee be -> Logbook ae se ee be -> Bool
$c/= :: forall ae se ee be.
(Eq ae, Eq se, Eq ee, Eq be) =>
Logbook ae se ee be -> Logbook ae se ee be -> Bool
/= :: Logbook ae se ee be -> Logbook ae se ee be -> Bool
Eq, Eq (Logbook ae se ee be)
Eq (Logbook ae se ee be) =>
(Logbook ae se ee be -> Logbook ae se ee be -> Ordering)
-> (Logbook ae se ee be -> Logbook ae se ee be -> Bool)
-> (Logbook ae se ee be -> Logbook ae se ee be -> Bool)
-> (Logbook ae se ee be -> Logbook ae se ee be -> Bool)
-> (Logbook ae se ee be -> Logbook ae se ee be -> Bool)
-> (Logbook ae se ee be
    -> Logbook ae se ee be -> Logbook ae se ee be)
-> (Logbook ae se ee be
    -> Logbook ae se ee be -> Logbook ae se ee be)
-> Ord (Logbook ae se ee be)
Logbook ae se ee be -> Logbook ae se ee be -> Bool
Logbook ae se ee be -> Logbook ae se ee be -> Ordering
Logbook ae se ee be -> Logbook ae se ee be -> Logbook ae se ee be
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
forall ae se ee be.
(Ord ae, Ord se, Ord ee, Ord be) =>
Eq (Logbook ae se ee be)
forall ae se ee be.
(Ord ae, Ord se, Ord ee, Ord be) =>
Logbook ae se ee be -> Logbook ae se ee be -> Bool
forall ae se ee be.
(Ord ae, Ord se, Ord ee, Ord be) =>
Logbook ae se ee be -> Logbook ae se ee be -> Ordering
forall ae se ee be.
(Ord ae, Ord se, Ord ee, Ord be) =>
Logbook ae se ee be -> Logbook ae se ee be -> Logbook ae se ee be
$ccompare :: forall ae se ee be.
(Ord ae, Ord se, Ord ee, Ord be) =>
Logbook ae se ee be -> Logbook ae se ee be -> Ordering
compare :: Logbook ae se ee be -> Logbook ae se ee be -> Ordering
$c< :: forall ae se ee be.
(Ord ae, Ord se, Ord ee, Ord be) =>
Logbook ae se ee be -> Logbook ae se ee be -> Bool
< :: Logbook ae se ee be -> Logbook ae se ee be -> Bool
$c<= :: forall ae se ee be.
(Ord ae, Ord se, Ord ee, Ord be) =>
Logbook ae se ee be -> Logbook ae se ee be -> Bool
<= :: Logbook ae se ee be -> Logbook ae se ee be -> Bool
$c> :: forall ae se ee be.
(Ord ae, Ord se, Ord ee, Ord be) =>
Logbook ae se ee be -> Logbook ae se ee be -> Bool
> :: Logbook ae se ee be -> Logbook ae se ee be -> Bool
$c>= :: forall ae se ee be.
(Ord ae, Ord se, Ord ee, Ord be) =>
Logbook ae se ee be -> Logbook ae se ee be -> Bool
>= :: Logbook ae se ee be -> Logbook ae se ee be -> Bool
$cmax :: forall ae se ee be.
(Ord ae, Ord se, Ord ee, Ord be) =>
Logbook ae se ee be -> Logbook ae se ee be -> Logbook ae se ee be
max :: Logbook ae se ee be -> Logbook ae se ee be -> Logbook ae se ee be
$cmin :: forall ae se ee be.
(Ord ae, Ord se, Ord ee, Ord be) =>
Logbook ae se ee be -> Logbook ae se ee be -> Logbook ae se ee be
min :: Logbook ae se ee be -> Logbook ae se ee be -> Logbook ae se ee be
Ord, Int -> Logbook ae se ee be -> ShowS
[Logbook ae se ee be] -> ShowS
Logbook ae se ee be -> String
(Int -> Logbook ae se ee be -> ShowS)
-> (Logbook ae se ee be -> String)
-> ([Logbook ae se ee be] -> ShowS)
-> Show (Logbook ae se ee be)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall ae se ee be.
(Show ae, Show se, Show ee, Show be) =>
Int -> Logbook ae se ee be -> ShowS
forall ae se ee be.
(Show ae, Show se, Show ee, Show be) =>
[Logbook ae se ee be] -> ShowS
forall ae se ee be.
(Show ae, Show se, Show ee, Show be) =>
Logbook ae se ee be -> String
$cshowsPrec :: forall ae se ee be.
(Show ae, Show se, Show ee, Show be) =>
Int -> Logbook ae se ee be -> ShowS
showsPrec :: Int -> Logbook ae se ee be -> ShowS
$cshow :: forall ae se ee be.
(Show ae, Show se, Show ee, Show be) =>
Logbook ae se ee be -> String
show :: Logbook ae se ee be -> String
$cshowList :: forall ae se ee be.
(Show ae, Show se, Show ee, Show be) =>
[Logbook ae se ee be] -> ShowS
showList :: [Logbook ae se ee be] -> ShowS
Show)

makeClassy ''Logbook

aviatorlogbook ::
  Aviator
  -> [Entry ae se ee be]
  -> Logbook ae se ee be
aviatorlogbook :: forall ae se ee be.
Aviator -> [Entry ae se ee be] -> Logbook ae se ee be
aviatorlogbook Aviator
a [Entry ae se ee be]
e =
  Aviator -> Entries ae se ee be -> Logbook ae se ee be
forall ae se ee be.
Aviator -> Entries ae se ee be -> Logbook ae se ee be
Logbook
    Aviator
a
    ([Entry ae se ee be] -> Entries ae se ee be
forall ae se ee be. [Entry ae se ee be] -> Entries ae se ee be
Entries [Entry ae se ee be]
e)

emptylogbook ::
  Aviator
  -> Logbook ae se ee be
emptylogbook :: forall ae se ee be. Aviator -> Logbook ae se ee be
emptylogbook Aviator
a =
  Aviator -> Entries ae se ee be -> Logbook ae se ee be
forall ae se ee be.
Aviator -> Entries ae se ee be -> Logbook ae se ee be
Logbook
    Aviator
a
    Entries ae se ee be
forall ae se ee be. Entries ae se ee be
emptyentries

singleentrylogbook ::
  Aviator
  -> Entry ae se ee be
  -> Logbook ae se ee be
singleentrylogbook :: forall ae se ee be.
Aviator -> Entry ae se ee be -> Logbook ae se ee be
singleentrylogbook Aviator
a Entry ae se ee be
e =
  Aviator -> Entries ae se ee be -> Logbook ae se ee be
forall ae se ee be.
Aviator -> Entries ae se ee be -> Logbook ae se ee be
Logbook
    Aviator
a
    (Entry ae se ee be -> Entries ae se ee be
forall ae se ee be. Entry ae se ee be -> Entries ae se ee be
singleentry Entry ae se ee be
e)