{-# LANGUAGE UnicodeSyntax #-} module Data.URI.Internal ( finishOff , parseAttempt , parseAttempt' ) where import Control.Applicative import Control.Exception.Base import Control.Monad.Unicode import Data.Ascii (Ascii) import qualified Data.Ascii as A import Data.Attempt import Data.Attoparsec.Char8 import Data.ByteString (ByteString) import Prelude.Unicode finishOff ∷ Parser α → Parser α {-# INLINE finishOff #-} finishOff = ((endOfInput *>) ∘ return =≪) parseAttempt ∷ Exception e ⇒ (String → e) → Parser α → ByteString → Attempt α {-# INLINEABLE parseAttempt #-} parseAttempt f p bs = case parseOnly (finishOff p) bs of Right α → Success α Left e → Failure $ f e parseAttempt' ∷ Parser α → Ascii → Attempt α {-# INLINE parseAttempt' #-} parseAttempt' = (∘ A.toByteString) ∘ parseAttempt StringException