module Vgrep.Ansi.Vty.Attributes
  ( Attr ()
  , combineStyles
  ) where

import Data.Bits               ((.|.))
import Graphics.Vty.Attributes (Attr (..), MaybeDefault (..), defAttr)

-- | Combines two 'Attr's. This differs from 'mappend' from the 'Monoid'
-- instance of 'Attr' in that 'Vty.Style's are combined rather than
-- overwritten.
combineStyles :: Attr -> Attr -> Attr
combineStyles :: Attr -> Attr -> Attr
combineStyles Attr
l Attr
r = Attr
defAttr
    { attrStyle :: MaybeDefault Style
attrStyle = case (Attr -> MaybeDefault Style
attrStyle Attr
l, Attr -> MaybeDefault Style
attrStyle Attr
r) of
        (SetTo Style
l', SetTo Style
r') -> Style -> MaybeDefault Style
forall v. (Eq v, Show v, Read v) => v -> MaybeDefault v
SetTo (Style
l' Style -> Style -> Style
forall a. Bits a => a -> a -> a
.|. Style
r')
        (MaybeDefault Style
l', MaybeDefault Style
r')             -> MaybeDefault Style
l' MaybeDefault Style -> MaybeDefault Style -> MaybeDefault Style
forall a. Semigroup a => a -> a -> a
<> MaybeDefault Style
r'
    , attrForeColor :: MaybeDefault Color
attrForeColor = Attr -> MaybeDefault Color
attrForeColor Attr
l MaybeDefault Color -> MaybeDefault Color -> MaybeDefault Color
forall a. Semigroup a => a -> a -> a
<> Attr -> MaybeDefault Color
attrForeColor Attr
r
    , attrBackColor :: MaybeDefault Color
attrBackColor = Attr -> MaybeDefault Color
attrBackColor Attr
l MaybeDefault Color -> MaybeDefault Color -> MaybeDefault Color
forall a. Semigroup a => a -> a -> a
<> Attr -> MaybeDefault Color
attrBackColor Attr
r
    }