{-# LANGUAGE OverloadedStrings #-}
module Hasmin.Types.RepeatStyle
( RepeatStyle(..)
, RSKeyword(..)
) where
import Data.Monoid ((<>))
import Data.Text.Lazy.Builder (singleton)
import Hasmin.Class
data RepeatStyle = RepeatX
| RepeatY
| RepeatStyle1 RSKeyword
| RepeatStyle2 RSKeyword RSKeyword
deriving Show
instance ToText RepeatStyle where
toBuilder RepeatX = "repeat-x"
toBuilder RepeatY = "repeat-y"
toBuilder (RepeatStyle1 x) = toBuilder x
toBuilder (RepeatStyle2 x y) = toBuilder x <> singleton ' ' <> toBuilder y
instance Minifiable RepeatStyle where
minify r = pure $ minifyRepeatStyle r
where minifyRepeatStyle :: RepeatStyle -> RepeatStyle
minifyRepeatStyle (RepeatStyle2 RsRepeat RsNoRepeat) = RepeatX
minifyRepeatStyle (RepeatStyle2 RsNoRepeat RsRepeat) = RepeatY
minifyRepeatStyle rs2@(RepeatStyle2 x y)
| x == y = RepeatStyle1 x
| otherwise = rs2
minifyRepeatStyle x = x
instance Eq RepeatStyle where
RepeatX == RepeatX = True
a@RepeatX == b@RepeatStyle2{} = b == a
RepeatStyle2 RsRepeat RsNoRepeat == RepeatX = True
RepeatY == RepeatY = True
a@RepeatY == b@RepeatStyle2{} = b == a
RepeatStyle2 RsNoRepeat RsRepeat == RepeatY = True
RepeatStyle2 RsNoRepeat RsRepeat == RepeatStyle2 RsNoRepeat RsRepeat = True
RepeatStyle2 RsRepeat RsNoRepeat == RepeatStyle2 RsRepeat RsNoRepeat = True
RepeatStyle2 RsSpace RsSpace == RepeatStyle2 RsSpace RsSpace = True
RepeatStyle2 RsSpace RsSpace == RepeatStyle1 RsSpace = True
RepeatStyle2 RsRound RsRound == RepeatStyle2 RsRound RsRound = True
RepeatStyle2 RsRound RsRound == RepeatStyle1 RsRound = True
RepeatStyle2 RsNoRepeat RsNoRepeat == RepeatStyle2 RsNoRepeat RsNoRepeat = True
RepeatStyle2 RsNoRepeat RsNoRepeat == RepeatStyle1 RsNoRepeat = True
RepeatStyle2 RsRepeat RsRepeat == RepeatStyle2 RsRepeat RsRepeat = True
RepeatStyle2 RsRepeat RsRepeat == RepeatStyle1 RsRepeat = True
RepeatStyle1 x == RepeatStyle1 y = x == y
a@RepeatStyle1{} == b@RepeatStyle2{} = b == a
RepeatStyle2 x1 y1 == RepeatStyle2 x2 y2 = x1 == x2 && y1 == y2
_ == _ = False
data RSKeyword = RsRepeat
| RsSpace
| RsRound
| RsNoRepeat
deriving (Show, Eq, Enum, Bounded)
instance ToText RSKeyword where
toBuilder RsRepeat = "repeat"
toBuilder RsSpace = "space"
toBuilder RsRound = "round"
toBuilder RsNoRepeat = "no-repeat"