module Text.XML.Selectors.Types
where

import Text.XML
import Text.XML.Cursor
import Data.Text (Text)
import qualified Data.Text as Text
import Control.Applicative

data Selector
  = None
  | Any -- ^ @*@
  | Append Selector Selector -- ^ @ab@ (both a and b must match)
  | Elem Name -- ^ @div@
  | Attrib AttribSelector -- ^ @a[...]@
  | Descendant -- ^ @ @ (whitespace)
  | Child -- ^ @>@
  | Sibling -- ^ @~@
  | NextSibling -- ^ @+@
  | FirstChild -- ^ @:first-child@
  | LastChild -- ^ @:last-child@
  | NthChild Int -- ^ @:nth-child(n)@; @:nth-last-child(-n)@
  | Choice [Selector] -- ^ @a,b,...@
  | Having Selector -- ^ @:has(b)@
  | Not Selector -- ^ @:not(b)@
  deriving (Int -> Selector -> ShowS
[Selector] -> ShowS
Selector -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Selector] -> ShowS
$cshowList :: [Selector] -> ShowS
show :: Selector -> String
$cshow :: Selector -> String
showsPrec :: Int -> Selector -> ShowS
$cshowsPrec :: Int -> Selector -> ShowS
Show)

selectorAppend :: Selector -> Selector -> Selector
selectorAppend :: Selector -> Selector -> Selector
selectorAppend Selector
Any Selector
x = Selector
x
selectorAppend Selector
x Selector
Any = Selector
x
selectorAppend Selector
a Selector
b = Selector -> Selector -> Selector
Append Selector
a Selector
b

instance Semigroup Selector where
  <> :: Selector -> Selector -> Selector
(<>) = Selector -> Selector -> Selector
selectorAppend

instance Monoid Selector where
  mappend :: Selector -> Selector -> Selector
mappend = forall a. Semigroup a => a -> a -> a
(<>)
  mempty :: Selector
mempty = Selector
Any

(<||>) :: Selector -> Selector -> Selector
Choice [Selector]
xs <||> :: Selector -> Selector -> Selector
<||> Choice [Selector]
ys = [Selector] -> Selector
Choice ([Selector]
xs forall a. [a] -> [a] -> [a]
++ [Selector]
ys)
Choice [Selector]
xs <||> Selector
y = [Selector] -> Selector
Choice ([Selector]
xs forall a. [a] -> [a] -> [a]
++ [Selector
y])
Selector
x <||> Choice [Selector]
ys = [Selector] -> Selector
Choice (Selector
x forall a. a -> [a] -> [a]
: [Selector]
ys)
Selector
x <||> Selector
y = [Selector] -> Selector
Choice [Selector
x, Selector
y]
infixl 3 <||>

data AttribSelector
  = AttribExists Name -- ^ @[attr]@
  | AttribIs Name Text -- ^ @[attr=blah]@
  | AttribIsNot Name Text -- ^ @[attr!=blah]@
  | AttribStartsWith Name Text -- ^ @[attr^=blah]@
  | AttribEndsWith Name Text -- ^ @[attr$=blah]@
  | AttribContains Name Text -- ^ @[attr*=blah]@
  | AttribContainsWord Name Text -- ^ @[attr~=blah]@
  | AttribContainsPrefix Name Text -- ^ @[attr|=blah]@
  deriving (Int -> AttribSelector -> ShowS
[AttribSelector] -> ShowS
AttribSelector -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [AttribSelector] -> ShowS
$cshowList :: [AttribSelector] -> ShowS
show :: AttribSelector -> String
$cshow :: AttribSelector -> String
showsPrec :: Int -> AttribSelector -> ShowS
$cshowsPrec :: Int -> AttribSelector -> ShowS
Show, AttribSelector -> AttribSelector -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: AttribSelector -> AttribSelector -> Bool
$c/= :: AttribSelector -> AttribSelector -> Bool
== :: AttribSelector -> AttribSelector -> Bool
$c== :: AttribSelector -> AttribSelector -> Bool
Eq)