hasmin-1.0.2: src/Hasmin/Parser/TimingFunction.hs
{-# LANGUAGE OverloadedStrings #-}
-----------------------------------------------------------------------------
-- |
-- Module : Hasmin.Parser.TimingFunction
-- Copyright : (c) 2017 Cristian Adrián Ontivero
-- License : BSD3
-- Stability : experimental
-- Portability : unknown
--
-- Parsers for \<single-timing-function> values.
--
-----------------------------------------------------------------------------
module Hasmin.Parser.TimingFunction
( timingFunction
, cubicbezier
, steps
) where
import Control.Applicative (optional)
import Data.Attoparsec.Text (Parser)
import qualified Data.Attoparsec.Text as A
import Hasmin.Parser.Primitives
import Hasmin.Parser.Numeric
import Hasmin.Parser.Utils
import Hasmin.Types.TimingFunction
-- | Parser for <https://drafts.csswg.org/css-timing-1/#single-timing-function-production \<single-timing-function\>>.
timingFunction :: Parser TimingFunction
timingFunction = parserFromPairs [("ease", pure Ease)
,("ease-in", pure EaseIn)
,("ease-in-out", pure EaseInOut)
,("ease-out", pure EaseOut)
,("linear", pure Linear)
,("step-end", pure StepEnd)
,("step-start", pure StepStart)
,("steps", A.char '(' *> steps)
,("cubic-bezier", A.char '(' *> cubicbezier)]
-- | Parses what's between parenthesis in the "cubic-bezier()" function.
cubicbezier :: Parser TimingFunction
cubicbezier = functionParser $
CubicBezier <$> number <* comma <*> number <* comma
<*> number <* comma <*> number
-- | Parses what's between parenthesis in the "steps()" function.
steps :: Parser TimingFunction
steps = functionParser $ Steps <$> int <*> optional startOrEnd
where startOrEnd = comma *> parserFromPairs [("end", pure End)
,("start", pure Start)]