{-# OPTIONS_GHC -Wall #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE InstanceSigs #-}

module Data.Aviation.Casr.Logbook.Meta.SimulatorFlightMeta(
  SimulatorFlightMeta(SimulatorFlightMeta)
, HasSimulatorFlightMeta(..)
) where

import Control.Lens(makeClassy, makeWrapped)
import Data.Aviation.Casr.Logbook.Meta.SimulatorFlightExpense
    ( SimulatorFlightExpense )
import Data.Eq(Eq)
import Data.Monoid ( (<>), Monoid(mempty) )
import Data.Ord(Ord)
import Data.Semigroup ( Semigroup )
import Prelude(Show)

newtype SimulatorFlightMeta =
  SimulatorFlightMeta
    [SimulatorFlightExpense]
  deriving (SimulatorFlightMeta -> SimulatorFlightMeta -> Bool
(SimulatorFlightMeta -> SimulatorFlightMeta -> Bool)
-> (SimulatorFlightMeta -> SimulatorFlightMeta -> Bool)
-> Eq SimulatorFlightMeta
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: SimulatorFlightMeta -> SimulatorFlightMeta -> Bool
== :: SimulatorFlightMeta -> SimulatorFlightMeta -> Bool
$c/= :: SimulatorFlightMeta -> SimulatorFlightMeta -> Bool
/= :: SimulatorFlightMeta -> SimulatorFlightMeta -> Bool
Eq, Eq SimulatorFlightMeta
Eq SimulatorFlightMeta =>
(SimulatorFlightMeta -> SimulatorFlightMeta -> Ordering)
-> (SimulatorFlightMeta -> SimulatorFlightMeta -> Bool)
-> (SimulatorFlightMeta -> SimulatorFlightMeta -> Bool)
-> (SimulatorFlightMeta -> SimulatorFlightMeta -> Bool)
-> (SimulatorFlightMeta -> SimulatorFlightMeta -> Bool)
-> (SimulatorFlightMeta
    -> SimulatorFlightMeta -> SimulatorFlightMeta)
-> (SimulatorFlightMeta
    -> SimulatorFlightMeta -> SimulatorFlightMeta)
-> Ord SimulatorFlightMeta
SimulatorFlightMeta -> SimulatorFlightMeta -> Bool
SimulatorFlightMeta -> SimulatorFlightMeta -> Ordering
SimulatorFlightMeta -> SimulatorFlightMeta -> SimulatorFlightMeta
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 :: SimulatorFlightMeta -> SimulatorFlightMeta -> Ordering
compare :: SimulatorFlightMeta -> SimulatorFlightMeta -> Ordering
$c< :: SimulatorFlightMeta -> SimulatorFlightMeta -> Bool
< :: SimulatorFlightMeta -> SimulatorFlightMeta -> Bool
$c<= :: SimulatorFlightMeta -> SimulatorFlightMeta -> Bool
<= :: SimulatorFlightMeta -> SimulatorFlightMeta -> Bool
$c> :: SimulatorFlightMeta -> SimulatorFlightMeta -> Bool
> :: SimulatorFlightMeta -> SimulatorFlightMeta -> Bool
$c>= :: SimulatorFlightMeta -> SimulatorFlightMeta -> Bool
>= :: SimulatorFlightMeta -> SimulatorFlightMeta -> Bool
$cmax :: SimulatorFlightMeta -> SimulatorFlightMeta -> SimulatorFlightMeta
max :: SimulatorFlightMeta -> SimulatorFlightMeta -> SimulatorFlightMeta
$cmin :: SimulatorFlightMeta -> SimulatorFlightMeta -> SimulatorFlightMeta
min :: SimulatorFlightMeta -> SimulatorFlightMeta -> SimulatorFlightMeta
Ord, Int -> SimulatorFlightMeta -> ShowS
[SimulatorFlightMeta] -> ShowS
SimulatorFlightMeta -> String
(Int -> SimulatorFlightMeta -> ShowS)
-> (SimulatorFlightMeta -> String)
-> ([SimulatorFlightMeta] -> ShowS)
-> Show SimulatorFlightMeta
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> SimulatorFlightMeta -> ShowS
showsPrec :: Int -> SimulatorFlightMeta -> ShowS
$cshow :: SimulatorFlightMeta -> String
show :: SimulatorFlightMeta -> String
$cshowList :: [SimulatorFlightMeta] -> ShowS
showList :: [SimulatorFlightMeta] -> ShowS
Show)

makeClassy ''SimulatorFlightMeta
makeWrapped ''SimulatorFlightMeta

instance Semigroup SimulatorFlightMeta where
  SimulatorFlightMeta [SimulatorFlightExpense]
x <> :: SimulatorFlightMeta -> SimulatorFlightMeta -> SimulatorFlightMeta
<> SimulatorFlightMeta [SimulatorFlightExpense]
y =
    [SimulatorFlightExpense] -> SimulatorFlightMeta
SimulatorFlightMeta ([SimulatorFlightExpense]
x [SimulatorFlightExpense]
-> [SimulatorFlightExpense] -> [SimulatorFlightExpense]
forall a. Semigroup a => a -> a -> a
<> [SimulatorFlightExpense]
y)

instance Monoid SimulatorFlightMeta where
  mempty :: SimulatorFlightMeta
  mempty :: SimulatorFlightMeta
mempty =
    [SimulatorFlightExpense] -> SimulatorFlightMeta
SimulatorFlightMeta [SimulatorFlightExpense]
forall a. Monoid a => a
mempty