{-# 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)