{-# LANGUAGE OverloadedStrings #-}
module Data.CSS.Style.Selector.LowerWhere(
        WhereLowerer(..)
    ) where

import Data.CSS.Syntax.Selector
import Data.CSS.Style.Common

lowerSelector :: Selector -> [Selector]
lowerSelector :: Selector -> [Selector]
lowerSelector (Element [Psuedoclass c :: Text
c args :: [Token]
args])
    | Text
c Text -> [Text] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` ["is", "where"], (args' :: [Selector]
args', []) <- Parser [Selector]
parseSelectors [Token]
args = [Selector]
args'
lowerSelector (Element sel :: [SimpleSelector]
sel) = [[SimpleSelector] -> Selector
Element ([SimpleSelector] -> Selector) -> [SimpleSelector] -> Selector
forall a b. (a -> b) -> a -> b
$ [SimpleSelector] -> [SimpleSelector]
lowerSelector' [SimpleSelector]
sel]
lowerSelector (Child sel :: Selector
sel x :: [SimpleSelector]
x) = [Selector -> [SimpleSelector] -> Selector
Child Selector
sel' ([SimpleSelector] -> Selector) -> [SimpleSelector] -> Selector
forall a b. (a -> b) -> a -> b
$ [SimpleSelector] -> [SimpleSelector]
lowerSelector' [SimpleSelector]
x | Selector
sel' <- Selector -> [Selector]
lowerSelector Selector
sel]
lowerSelector (Descendant sel :: Selector
sel x :: [SimpleSelector]
x) = [Selector -> [SimpleSelector] -> Selector
Descendant Selector
sel' ([SimpleSelector] -> Selector) -> [SimpleSelector] -> Selector
forall a b. (a -> b) -> a -> b
$ [SimpleSelector] -> [SimpleSelector]
lowerSelector' [SimpleSelector]
x | Selector
sel' <- Selector -> [Selector]
lowerSelector Selector
sel]
lowerSelector (Adjacent sel :: Selector
sel x :: [SimpleSelector]
x) = [Selector -> [SimpleSelector] -> Selector
Adjacent Selector
sel' ([SimpleSelector] -> Selector) -> [SimpleSelector] -> Selector
forall a b. (a -> b) -> a -> b
$ [SimpleSelector] -> [SimpleSelector]
lowerSelector' [SimpleSelector]
x | Selector
sel' <- Selector -> [Selector]
lowerSelector Selector
sel]
lowerSelector (Sibling sel :: Selector
sel x :: [SimpleSelector]
x) = [Selector -> [SimpleSelector] -> Selector
Sibling Selector
sel' ([SimpleSelector] -> Selector) -> [SimpleSelector] -> Selector
forall a b. (a -> b) -> a -> b
$ [SimpleSelector] -> [SimpleSelector]
lowerSelector' [SimpleSelector]
x | Selector
sel' <- Selector -> [Selector]
lowerSelector Selector
sel]

lowerSelector' :: [SimpleSelector] -> [SimpleSelector]
lowerSelector' :: [SimpleSelector] -> [SimpleSelector]
lowerSelector' (Psuedoclass c :: Text
c args :: [Token]
args:sel :: [SimpleSelector]
sel)
    | Text
c Text -> [Text] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` ["is", "where"], ([Element arg' :: [SimpleSelector]
arg'], []) <- Parser [Selector]
parseSelectors [Token]
args =
        [SimpleSelector]
arg' [SimpleSelector] -> [SimpleSelector] -> [SimpleSelector]
forall a. [a] -> [a] -> [a]
++ [SimpleSelector] -> [SimpleSelector]
lowerSelector' [SimpleSelector]
sel
lowerSelector' (test :: SimpleSelector
test:tests :: [SimpleSelector]
tests) = SimpleSelector
test SimpleSelector -> [SimpleSelector] -> [SimpleSelector]
forall a. a -> [a] -> [a]
: [SimpleSelector] -> [SimpleSelector]
lowerSelector' [SimpleSelector]
tests
lowerSelector' [] = []

data WhereLowerer s = WhereLowerer s

instance RuleStore s => RuleStore (WhereLowerer s) where
    new :: WhereLowerer s
new = s -> WhereLowerer s
forall s. s -> WhereLowerer s
WhereLowerer s
forall a. RuleStore a => a
new
    addStyleRule :: WhereLowerer s -> [Int] -> StyleRule' -> WhereLowerer s
addStyleRule (WhereLowerer self :: s
self) priority :: [Int]
priority rule :: StyleRule'
rule =
        s -> WhereLowerer s
forall s. s -> WhereLowerer s
WhereLowerer (s -> WhereLowerer s) -> s -> WhereLowerer s
forall a b. (a -> b) -> a -> b
$ (s -> Selector -> s) -> s -> [Selector] -> s
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl s -> Selector -> s
forall a. RuleStore a => a -> Selector -> a
addStyleRule' s
self ([Selector] -> s) -> [Selector] -> s
forall a b. (a -> b) -> a -> b
$ Selector -> [Selector]
lowerSelector Selector
sel
      where
        addStyleRule' :: a -> Selector -> a
addStyleRule' self' :: a
self' sel' :: Selector
sel' = a -> [Int] -> StyleRule' -> a
forall a. RuleStore a => a -> [Int] -> StyleRule' -> a
addStyleRule a
self' [Int]
priority (StyleRule' -> a) -> StyleRule' -> a
forall a b. (a -> b) -> a -> b
$ StyleRule'
rule {
            inner :: StyleRule
inner = Selector -> [(Text, [Token])] -> Text -> StyleRule
StyleRule Selector
sel' [(Text, [Token])]
props Text
psuedo
        }
        StyleRule sel :: Selector
sel props :: [(Text, [Token])]
props psuedo :: Text
psuedo = StyleRule' -> StyleRule
inner StyleRule'
rule
    lookupRules :: WhereLowerer s -> Element -> [StyleRule']
lookupRules (WhereLowerer self :: s
self) el :: Element
el = s -> Element -> [StyleRule']
forall a. RuleStore a => a -> Element -> [StyleRule']
lookupRules s
self Element
el