{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}

module Data.Aviation.Casa.AbbreviationsAndAcronyms.Render.Config(
  Config(..)
, HasConfig(..)
, standardConfig
, ConfigReader(..)
, runConfig
, readColours
, readHeadingSeparatorColours
, readHeadingNameColours
, readHeadingMeaningColours
, readHeadingSourceColours
, readHeadingScoreColours
, readAcronymSeparatorColours
, readAcronymNameColours
, readAcronymMeaningColours
, readAcronymSourceColours
, readAcronymScoreColours
, readSpacing
, readSeparatorSpacing
, readNameSpacing
, readMeaningSpacing
, readSourceSpacing
, readScoreSpacing
, exactWidthSpacingStandardColours
) where

import Control.Applicative(Applicative(pure, (<*>)))
import Control.Category((.), id)
import Control.Lens(Rewrapped, Wrapped(_Wrapped'), Unwrapped, Lens', iso, (^.))
import Control.Monad(Monad(return, (>>=)))
import Data.Aviation.Casa.AbbreviationsAndAcronyms.Acronym(HasAcronym)
import Data.Aviation.Casa.AbbreviationsAndAcronyms.Render.Colours(HasColours(colours), Colours, headingSeparatorColours, headingNameColours, headingMeaningColours, headingSourceColours, headingScoreColours, acronymSeparatorColours, acronymNameColours, acronymMeaningColours, acronymSourceColours, acronymScoreColours, standardColours)
import Data.Aviation.Casa.AbbreviationsAndAcronyms.Render.Score(HasShowScore)
import Data.Aviation.Casa.AbbreviationsAndAcronyms.Render.Spacing(HasSpacing(spacing), Spacing, separatorSpacing, nameSpacing, meaningSpacing, sourceSpacing, scoreSpacing, standardSpacing, exactWidthSpacing)
import Data.Functor(Functor(fmap), (<$>))
import Data.Int(Int)
import Data.String(String)

data Config =
  Config
    Colours
    Spacing

standardConfig ::
  Config
standardConfig :: Config
standardConfig =
  Colours -> Spacing -> Config
Config
    Colours
standardColours
    Spacing
standardSpacing

class HasConfig a where
  config ::
    Lens'
      a
      Config

instance HasConfig Config where
  config :: (Config -> f Config) -> Config -> f Config
config =
    (Config -> f Config) -> Config -> f Config
forall k (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id

instance HasColours Config where
  colours :: (Colours -> f Colours) -> Config -> f Config
colours Colours -> f Colours
f (Config Colours
c Spacing
s) =
    (Colours -> Config) -> f Colours -> f Config
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Colours
c' -> Colours -> Spacing -> Config
Config Colours
c' Spacing
s) (Colours -> f Colours
f Colours
c)
    
instance HasSpacing Config where
  spacing :: (Spacing -> f Spacing) -> Config -> f Config
spacing Spacing -> f Spacing
f (Config Colours
c Spacing
s) =
    (Spacing -> Config) -> f Spacing -> f Config
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Spacing
s' -> Colours -> Spacing -> Config
Config Colours
c Spacing
s') (Spacing -> f Spacing
f Spacing
s)

newtype ConfigReader a =
  ConfigReader
    (Config -> a)

instance ConfigReader a_aaRr ~ t_aaRq =>
  Rewrapped (ConfigReader a_a86d) t_aaRq

instance Wrapped (ConfigReader a_a86d) where
  type Unwrapped (ConfigReader a_a86d) = Config -> a_a86d
  _Wrapped' :: p (Unwrapped (ConfigReader a_a86d))
  (f (Unwrapped (ConfigReader a_a86d)))
-> p (ConfigReader a_a86d) (f (ConfigReader a_a86d))
_Wrapped' = ((ConfigReader a_a86d -> Config -> a_a86d)
-> ((Config -> a_a86d) -> ConfigReader a_a86d)
-> Iso
     (ConfigReader a_a86d)
     (ConfigReader a_a86d)
     (Config -> a_a86d)
     (Config -> a_a86d)
forall s a b t. (s -> a) -> (b -> t) -> Iso s t a b
iso (\(ConfigReader Config -> a_a86d
x_aaRp) -> Config -> a_a86d
x_aaRp)) (Config -> a_a86d) -> ConfigReader a_a86d
forall a. (Config -> a) -> ConfigReader a
ConfigReader

runConfig ::
  ConfigReader a
  -> Config
  -> a
runConfig :: ConfigReader a -> Config -> a
runConfig (ConfigReader Config -> a
a) =
  Config -> a
a

instance Functor ConfigReader where
  fmap :: (a -> b) -> ConfigReader a -> ConfigReader b
fmap a -> b
f (ConfigReader Config -> a
g) =
    (Config -> b) -> ConfigReader b
forall a. (Config -> a) -> ConfigReader a
ConfigReader (a -> b
f (a -> b) -> (Config -> a) -> Config -> b
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Config -> a
g)

instance Applicative ConfigReader where
  pure :: a -> ConfigReader a
pure =
    (Config -> a) -> ConfigReader a
forall a. (Config -> a) -> ConfigReader a
ConfigReader ((Config -> a) -> ConfigReader a)
-> (a -> Config -> a) -> a -> ConfigReader a
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. a -> Config -> a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
  ConfigReader Config -> a -> b
f <*> :: ConfigReader (a -> b) -> ConfigReader a -> ConfigReader b
<*> ConfigReader Config -> a
a =
    (Config -> b) -> ConfigReader b
forall a. (Config -> a) -> ConfigReader a
ConfigReader (\Config
x -> Config -> a -> b
f Config
x (Config -> a
a Config
x))

instance Monad ConfigReader where
  return :: a -> ConfigReader a
return =
    a -> ConfigReader a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
  ConfigReader Config -> a
a >>= :: ConfigReader a -> (a -> ConfigReader b) -> ConfigReader b
>>= a -> ConfigReader b
f =
    (Config -> b) -> ConfigReader b
forall a. (Config -> a) -> ConfigReader a
ConfigReader (\Config
x -> ConfigReader b -> Config -> b
forall a. ConfigReader a -> Config -> a
runConfig (a -> ConfigReader b
f (Config -> a
a Config
x)) Config
x)

readColours ::
  ConfigReader Colours
readColours :: ConfigReader Colours
readColours =
  (Config -> Colours) -> ConfigReader Colours
forall a. (Config -> a) -> ConfigReader a
ConfigReader
    (Config -> Getting Colours Config Colours -> Colours
forall s a. s -> Getting a s a -> a
^. Getting Colours Config Colours
forall a. HasColours a => Lens' a Colours
colours)

readHeadingSeparatorColours ::
  ConfigReader (String -> String)
readHeadingSeparatorColours :: ConfigReader (String -> String)
readHeadingSeparatorColours =
  (Colours
-> Getting (String -> String) Colours (String -> String)
-> String
-> String
forall s a. s -> Getting a s a -> a
^. Getting (String -> String) Colours (String -> String)
forall a. HasColours a => Lens' a (String -> String)
headingSeparatorColours) (Colours -> String -> String)
-> ConfigReader Colours -> ConfigReader (String -> String)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ConfigReader Colours
readColours

readHeadingNameColours ::
  ConfigReader (String -> String)
readHeadingNameColours :: ConfigReader (String -> String)
readHeadingNameColours =
  (Colours
-> Getting (String -> String) Colours (String -> String)
-> String
-> String
forall s a. s -> Getting a s a -> a
^. Getting (String -> String) Colours (String -> String)
forall a. HasColours a => Lens' a (String -> String)
headingNameColours) (Colours -> String -> String)
-> ConfigReader Colours -> ConfigReader (String -> String)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ConfigReader Colours
readColours

readHeadingMeaningColours ::
  ConfigReader (String -> String)
readHeadingMeaningColours :: ConfigReader (String -> String)
readHeadingMeaningColours =
  (Colours
-> Getting (String -> String) Colours (String -> String)
-> String
-> String
forall s a. s -> Getting a s a -> a
^. Getting (String -> String) Colours (String -> String)
forall a. HasColours a => Lens' a (String -> String)
headingMeaningColours) (Colours -> String -> String)
-> ConfigReader Colours -> ConfigReader (String -> String)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ConfigReader Colours
readColours

readHeadingSourceColours ::
  ConfigReader (String -> String)
readHeadingSourceColours :: ConfigReader (String -> String)
readHeadingSourceColours =
  (Colours
-> Getting (String -> String) Colours (String -> String)
-> String
-> String
forall s a. s -> Getting a s a -> a
^. Getting (String -> String) Colours (String -> String)
forall a. HasColours a => Lens' a (String -> String)
headingSourceColours) (Colours -> String -> String)
-> ConfigReader Colours -> ConfigReader (String -> String)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ConfigReader Colours
readColours

readHeadingScoreColours ::
  ConfigReader (String -> String)
readHeadingScoreColours :: ConfigReader (String -> String)
readHeadingScoreColours =
  (Colours
-> Getting (String -> String) Colours (String -> String)
-> String
-> String
forall s a. s -> Getting a s a -> a
^. Getting (String -> String) Colours (String -> String)
forall a. HasColours a => Lens' a (String -> String)
headingScoreColours) (Colours -> String -> String)
-> ConfigReader Colours -> ConfigReader (String -> String)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ConfigReader Colours
readColours

readAcronymSeparatorColours ::
  ConfigReader (String -> String)
readAcronymSeparatorColours :: ConfigReader (String -> String)
readAcronymSeparatorColours =
  (Colours
-> Getting (String -> String) Colours (String -> String)
-> String
-> String
forall s a. s -> Getting a s a -> a
^. Getting (String -> String) Colours (String -> String)
forall a. HasColours a => Lens' a (String -> String)
acronymSeparatorColours) (Colours -> String -> String)
-> ConfigReader Colours -> ConfigReader (String -> String)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ConfigReader Colours
readColours

readAcronymNameColours ::
  ConfigReader (String -> String)
readAcronymNameColours :: ConfigReader (String -> String)
readAcronymNameColours =
  (Colours
-> Getting (String -> String) Colours (String -> String)
-> String
-> String
forall s a. s -> Getting a s a -> a
^. Getting (String -> String) Colours (String -> String)
forall a. HasColours a => Lens' a (String -> String)
acronymNameColours) (Colours -> String -> String)
-> ConfigReader Colours -> ConfigReader (String -> String)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ConfigReader Colours
readColours

readAcronymMeaningColours ::
  ConfigReader (String -> String)
readAcronymMeaningColours :: ConfigReader (String -> String)
readAcronymMeaningColours =
  (Colours
-> Getting (String -> String) Colours (String -> String)
-> String
-> String
forall s a. s -> Getting a s a -> a
^. Getting (String -> String) Colours (String -> String)
forall a. HasColours a => Lens' a (String -> String)
acronymMeaningColours) (Colours -> String -> String)
-> ConfigReader Colours -> ConfigReader (String -> String)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ConfigReader Colours
readColours

readAcronymSourceColours ::
  ConfigReader (String -> String)
readAcronymSourceColours :: ConfigReader (String -> String)
readAcronymSourceColours =
  (Colours
-> Getting (String -> String) Colours (String -> String)
-> String
-> String
forall s a. s -> Getting a s a -> a
^. Getting (String -> String) Colours (String -> String)
forall a. HasColours a => Lens' a (String -> String)
acronymSourceColours) (Colours -> String -> String)
-> ConfigReader Colours -> ConfigReader (String -> String)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ConfigReader Colours
readColours

readAcronymScoreColours ::
  ConfigReader (String -> String)
readAcronymScoreColours :: ConfigReader (String -> String)
readAcronymScoreColours =
  (Colours
-> Getting (String -> String) Colours (String -> String)
-> String
-> String
forall s a. s -> Getting a s a -> a
^. Getting (String -> String) Colours (String -> String)
forall a. HasColours a => Lens' a (String -> String)
acronymScoreColours) (Colours -> String -> String)
-> ConfigReader Colours -> ConfigReader (String -> String)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ConfigReader Colours
readColours

readSpacing ::
  ConfigReader Spacing
readSpacing :: ConfigReader Spacing
readSpacing =
  (Config -> Spacing) -> ConfigReader Spacing
forall a. (Config -> a) -> ConfigReader a
ConfigReader
    (Config -> Getting Spacing Config Spacing -> Spacing
forall s a. s -> Getting a s a -> a
^. Getting Spacing Config Spacing
forall a. HasSpacing a => Lens' a Spacing
spacing) 

readSeparatorSpacing ::
  ConfigReader Int
readSeparatorSpacing :: ConfigReader Int
readSeparatorSpacing =
  (Spacing -> Getting Int Spacing Int -> Int
forall s a. s -> Getting a s a -> a
^. Getting Int Spacing Int
forall a. HasSpacing a => Lens' a Int
separatorSpacing) (Spacing -> Int) -> ConfigReader Spacing -> ConfigReader Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ConfigReader Spacing
readSpacing

readNameSpacing ::
  ConfigReader Int
readNameSpacing :: ConfigReader Int
readNameSpacing =
  (Spacing -> Getting Int Spacing Int -> Int
forall s a. s -> Getting a s a -> a
^. Getting Int Spacing Int
forall a. HasSpacing a => Lens' a Int
nameSpacing) (Spacing -> Int) -> ConfigReader Spacing -> ConfigReader Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ConfigReader Spacing
readSpacing

readMeaningSpacing ::
  ConfigReader Int
readMeaningSpacing :: ConfigReader Int
readMeaningSpacing =
  (Spacing -> Getting Int Spacing Int -> Int
forall s a. s -> Getting a s a -> a
^. Getting Int Spacing Int
forall a. HasSpacing a => Lens' a Int
meaningSpacing) (Spacing -> Int) -> ConfigReader Spacing -> ConfigReader Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ConfigReader Spacing
readSpacing

readSourceSpacing ::
  ConfigReader Int
readSourceSpacing :: ConfigReader Int
readSourceSpacing =
  (Spacing -> Getting Int Spacing Int -> Int
forall s a. s -> Getting a s a -> a
^. Getting Int Spacing Int
forall a. HasSpacing a => Lens' a Int
sourceSpacing) (Spacing -> Int) -> ConfigReader Spacing -> ConfigReader Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ConfigReader Spacing
readSpacing

readScoreSpacing ::
  ConfigReader Int
readScoreSpacing :: ConfigReader Int
readScoreSpacing =
  (Spacing -> Getting Int Spacing Int -> Int
forall s a. s -> Getting a s a -> a
^. Getting Int Spacing Int
forall a. HasSpacing a => Lens' a Int
scoreSpacing) (Spacing -> Int) -> ConfigReader Spacing -> ConfigReader Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ConfigReader Spacing
readSpacing

exactWidthSpacingStandardColours ::
  (HasShowScore a, HasAcronym a) =>
  [a]
  -> Config  
exactWidthSpacingStandardColours :: [a] -> Config
exactWidthSpacingStandardColours [a]
x =
  Colours -> Spacing -> Config
Config
    Colours
standardColours
    ([a] -> Spacing
forall a. (HasShowScore a, HasAcronym a) => [a] -> Spacing
exactWidthSpacing [a]
x)