{-# LANGUAGE OverloadedStrings #-} ----------------------------------------------------------------------------- -- | -- Module : Hasmin.Parser.PercentageLength -- Copyright : (c) 2017 Cristian Adrián Ontivero -- License : BSD3 -- Stability : experimental -- Portability : unknown -- ----------------------------------------------------------------------------- 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 -- if true, then it was just a value 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