{-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE QuasiQuotes #-} module WWW.Colors ( Gruvbox (..) , gruvboxVar , gruvboxDark , gruvboxDarkH , gruvboxDarkS , gruvboxLight , gruvboxLightH , gruvboxLightS ) where -- import Data.Colour import Data.String import Diagrams.Attributes import WWW.Colors.Instances() import WWW.Colors.QQ data Gruvbox a = Gruvbox { _bg, _red, _green, _yellow, _blue, _purple, _aqua, _gray, _gray', _red', _green', _yellow', _blue', _purple', _aqua', _fg, _bg0h, _bg0, _bg0s, _bg1, _bg2, _bg3, _bg4, _gray'', _orange, _fg4, _fg3, _fg2, _fg1, _fg0, _orange' :: !a } deriving stock (Foldable, Functor, Eq, Show, Traversable) instance Applicative Gruvbox where pure a = Gruvbox a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a {-# INLINE pure #-} (<*>) :: Gruvbox (a -> b) -> Gruvbox a -> Gruvbox b g <*> x = Gruvbox { _bg = ag _bg g x , _red = ag _red g x , _green = ag _green g x , _yellow = ag _yellow g x , _blue = ag _blue g x , _purple = ag _purple g x , _aqua = ag _aqua g x , _gray = ag _gray g x , _gray' = ag _gray' g x , _red' = ag _red' g x , _green' = ag _green' g x , _yellow' = ag _yellow' g x , _blue' = ag _blue' g x , _purple' = ag _purple' g x , _aqua' = ag _aqua' g x , _fg = ag _fg g x , _bg0h = ag _bg0h g x , _bg0 = ag _bg0 g x , _bg0s = ag _bg0s g x , _bg1 = ag _bg1 g x , _bg2 = ag _bg2 g x , _bg3 = ag _bg3 g x , _bg4 = ag _bg4 g x , _gray'' = ag _gray'' g x , _orange = ag _orange g x , _fg4 = ag _fg4 g x , _fg3 = ag _fg3 g x , _fg2 = ag _fg2 g x , _fg1 = ag _fg1 g x , _fg0 = ag _fg0 g x , _orange' = ag _orange g x } {-# INLINE (<*>) #-} ag :: (forall x . Gruvbox x -> x) -> Gruvbox (a -> b) -> Gruvbox a -> b ag f g x = f g $ f x {-# INLINE ag #-} gruvboxVar :: IsString s => Gruvbox s gruvboxVar = Gruvbox { _bg = "bg" , _red = "red" , _green = "green" , _yellow = "yellow" , _blue = "blue" , _purple = "purple" , _aqua = "aqua" , _gray = "gray" , _gray' = "gray'" , _red' = "red'" , _green' = "green'" , _yellow' = "yellow'" , _blue' = "blue'" , _purple' = "purple'" , _aqua' = "aqua'" , _fg = "fg" , _bg0h = "bg0h" , _bg0 = "bg0" , _bg0s = "bg0s" , _bg1 = "bg1" , _bg2 = "bg2" , _bg3 = "bg3" , _bg4 = "bg4" , _gray'' = "gray''" , _orange = "orange" , _fg4 = "fg4" , _fg3 = "fg3" , _fg2 = "fg2" , _fg1 = "fg1" , _fg0 = "fg0" , _orange' = "orange'" } hard :: Gruvbox a -> Gruvbox a hard gb = gb { _bg = _bg0h gb } soft :: Gruvbox a -> Gruvbox a soft gb = gb { _bg = _bg0s gb } gruvboxDark :: Gruvbox SomeColor gruvboxDark = SomeColor <$> Gruvbox { _bg = [hex|#282828|] , _red = [hex|#cc241d|] , _green = [hex|#98971a|] , _yellow = [hex|#d79921|] , _blue = [hex|#458588|] , _purple = [hex|b16286|] , _aqua = [hex|689d6a|] , _gray = [hex|a89984|] , _gray' = [hex|928374|] , _red' = [hex|fb4934|] , _green' = [hex|b8bb26|] , _yellow' = [hex|fabd2f|] , _blue' = [hex|83a598|] , _purple' = [hex|d3869b|] , _aqua' = [hex|8ec07c|] , _fg = [hex|ebdbb2|] , _bg0h = [hex|1d2021|] , _bg0 = [hex|282828|] , _bg0s = [hex|32302f|] , _bg1 = [hex|3c3836|] , _bg2 = [hex|504945|] , _bg3 = [hex|665c54|] , _bg4 = [hex|7c6f64|] , _gray'' = [hex|928374|] , _orange = [hex|d65d0e|] , _fg4 = [hex|a89984|] , _fg3 = [hex|bdae93|] , _fg2 = [hex|d5c4a1|] , _fg1 = [hex|ebdbb2|] , _fg0 = [hex|fbf1c7|] , _orange' = [hex|fe8019|] } gruvboxDarkH :: Gruvbox SomeColor gruvboxDarkH = hard gruvboxDark gruvboxDarkS :: Gruvbox SomeColor gruvboxDarkS = soft gruvboxDark gruvboxLight :: Gruvbox SomeColor gruvboxLight = let gb = someToColor' <$> gruvboxDark in SomeColor <$> gb { _bg = [hex|fbf1c7|] , _gray = [hex|7c6f64|] , _red' = [hex|9d0006|] , _green' = [hex|79740e|] , _yellow' = [hex|b57614|] , _blue' = [hex|076678|] , _purple' = [hex|8f3f71|] , _aqua' = [hex|427b58|] , _fg = [hex|3c3836|] , _bg0h = [hex|f9f5d7|] , _bg0 = [hex|fbf1c7|] , _bg0s = [hex|f2e5bc|] , _bg1 = [hex|ebdbb2|] , _bg2 = [hex|d5c4a1|] , _bg3 = [hex|bdae93|] , _bg4 = [hex|a89984|] , _fg4 = [hex|7c6f64|] , _fg3 = [hex|665c54|] , _fg2 = [hex|504945|] , _fg1 = [hex|3c3836|] , _fg0 = [hex|282828|] , _orange' = [hex|af3a03|] } gruvboxLightH :: Gruvbox SomeColor gruvboxLightH = hard gruvboxLight gruvboxLightS :: Gruvbox SomeColor gruvboxLightS = soft gruvboxLight