parsix-0.1.0.0: tests/Util.hs
{-# LANGUAGE BangPatterns #-}
module Util
( module Control.Applicative
, module Control.Monad
, module Data.Monoid
, module Text.Parsix
, module Test.Tasty
, parse, isSuccess, isFailure, result, success, failure, atPosition
) where
import Control.Applicative
import Control.Monad
import Data.Monoid
import qualified Data.Text.Unsafe as Unsafe
import Test.Tasty
import Text.Parsix
parse :: Parser a -> String -> Result a
parse p s = parseString p s "<test input>"
isSuccess, isFailure :: Result a -> Bool
isSuccess Failure {} = False
isSuccess Success {} = True
isFailure Failure {} = True
isFailure Success {} = False
result :: (Error -> b) -> (a -> b) -> Result a -> b
result f _ (Failure e) = f e
result _ g (Success a) = g a
success :: (a -> Bool) -> Result a -> Bool
success = result $ const False
failure :: (Error -> Bool) -> Result a -> Bool
failure f = result f $ const False
atPosition :: Int -> Error -> Bool
atPosition pos err = go pos 0 == codeUnits (errorPosition err)
where
inp = errorSourceText err
go 0 !cp = cp
go n !cp = go (n - 1) $ cp + Unsafe.iter_ inp cp