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

module Data.Aviation.Casr.Logbook.Meta.BriefingMeta(
  BriefingMeta(BriefingMeta)
, HasBriefingMeta(..)
) where

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

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

makeClassy ''BriefingMeta
makeWrapped ''BriefingMeta

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

instance Monoid BriefingMeta where
  mempty :: BriefingMeta
mempty =
    [BriefingExpense] -> BriefingMeta
BriefingMeta [BriefingExpense]
forall a. Monoid a => a
mempty