{-# LANGUAGE OverloadedStrings #-}
module Hasmin.Parser.PercentageLength where
import Control.Applicative ((<|>))
import Control.Monad (mzero)
import Data.Attoparsec.Text (Parser)
import qualified Data.Attoparsec.Text as A
import qualified Data.Map.Strict as Map
import qualified Data.Char as C
import qualified Data.Text as T
import Hasmin.Parser.Utils
import Hasmin.Parser.Numeric
import Hasmin.Parser.Dimension
import Hasmin.Types.Numeric
import Hasmin.Types.Dimension
import Hasmin.Types.PercentageLength
percentageLength :: Parser PercentageLength
percentageLength = do
n <- number
rest <- opt (A.string "%" <|> A.takeWhile1 C.isAlpha)
if T.null rest
then if n == 0
then pure $ Right NullLength
else mzero
else let r = T.toLower rest
in case Map.lookup r plMap of
Just f -> pure $ f n
Nothing -> mzero
where plMap = Map.fromList $
("%", Left . toPercentage):(fmap . fmap) (Right .) distanceConstructorsList