ghcup-0.2.1.0: lib/GHCup/Prelude/Attoparsec.hs
{-# LANGUAGE CPP #-}
{-# LANGUAGE OverloadedStrings #-}
{-|
Module : GHCup.Utils.Attoparsec
Description : Attoparsec utilities
Copyright : (c) Julian Ospald, 2024
License : LGPL-3.0
Maintainer : hasufell@hasufell.de
Stability : experimental
Portability : portable
-}
module GHCup.Prelude.Attoparsec where
import Control.Applicative
#if !MIN_VERSION_base(4,13,0)
import Control.Monad.Fail ( MonadFail )
#endif
import Data.ByteString ( ByteString )
import Data.ByteString.Internal ( w2c )
import Data.Functor
import Data.Attoparsec.ByteString as AP
parseList :: Parser a -> Parser [a]
parseList p = skipSpaces *> string "[" *> skipSpaces *> loop
where
loop = (:) <$> p <*> ( (skipSpaces *> string "," *> skipSpaces *> loop)
<|> ([] <$ skipSpaces <* string "]")
)
parseList' :: Parser [ByteString]
parseList' = skipSpaces *> string "[" *> skipSpaces *> loop
where
loop = (:) <$> AP.takeWhile (\c -> w2c c `notElem` [',',']'] && not (isSpace $ w2c c)) <*> ((skipSpaces *> string "," *> skipSpaces *> loop)
<|> ([] <$ skipSpaces <* string "]")
)
skipSpace :: Parser ()
skipSpace = void $ satisfy (isSpace . w2c)
skipSpaces :: Parser ()
skipSpaces = void $ many skipSpace
isSpace :: Char -> Bool
isSpace c = (c == ' ') || ('\t' <= c && c <= '\r')
{-# INLINE isSpace #-}