module Stitch.Types.Selector
  ( Selector(..) ) where

import Data.Text (Text)
import Data.Monoid
import Data.String
import qualified Data.Text as Text

-- | Represents a CSS selector. Can be combined with other 'Selector's using its 'Monoid' instance.
newtype Selector = Selector { unSelector :: [Text] }
  deriving (Show, Read, Eq, Ord)

instance IsString Selector where
  fromString = Selector . map Text.strip . Text.splitOn "," . fromString

instance Monoid Selector where
  mempty = Selector []
  Selector [] `mappend` Selector ys =
    Selector (filter (not . Text.isInfixOf "&") ys)
  Selector xs `mappend` Selector ys =
    Selector $ do
      x <- xs
      y <- ys
      if Text.isInfixOf "&" y
        then return $ Text.replace "&" x y
        else return $ x <> " " <> y