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

module Data.Aviation.Casr.Logbook.Meta.ExamMeta(
  ExamMeta(ExamMeta)
, HasExamMeta(..)
) where

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

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

makeClassy ''ExamMeta
makeWrapped ''ExamMeta

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

instance Monoid ExamMeta where
  mempty :: ExamMeta
mempty =
    [ExamExpense] -> ExamMeta
ExamMeta [ExamExpense]
forall a. Monoid a => a
mempty