sparsec

simple Haskell parser combinator library
git clone git://git.rr3.xyz/sparsec
Log | Files | Refs | README | LICENSE

commit 0007a356a0d8b384665d64ddfa6ce9f6a1e29dc6
parent d5a677742259e1e6f5193f7821c59761f1d1e79b
Author: Robert Russell <robert@rr3.xyz>
Date:   Wed, 24 Dec 2025 18:03:50 -0800

Unbox Result#

Diffstat:
Msrc/Sparsec.hs | 73+++++++++++++++++++++++++++++++++++++++++--------------------------------
1 file changed, 41 insertions(+), 32 deletions(-)

diff --git a/src/Sparsec.hs b/src/Sparsec.hs @@ -68,7 +68,6 @@ import Data.Foldable import Data.Functor import GHC.Exts (Int (..), (-#)) import Numeric.Natural -import Text.Printf import Prelude hiding (fail, not, read) import Sparsec.Char @@ -111,37 +110,47 @@ instance Eq State where -------------------------------------------------------------------------------- -- Result# -data Result# e a - = Utf8Error# Loc# - | Failure# - | Error# e - | Success# a State# - -instance (Eq e, Eq a) => Eq (Result# e a) where - Utf8Error# l0 == Utf8Error# l1 = l0 `locEq#` l1 - Failure# == Failure# = True - Error# e0 == Error# e1 = e0 == e1 - Success# a0 s0 == Success# a1 s1 = a0 == a1 && s0 `stateEq#` s1 - _ == _ = False - {-# INLINE (==) #-} - -instance (Show e, Show a) => Show (Result# e a) where - show = \case - Utf8Error# l -> "utf8 error at " ++ locShow# l - Failure# -> "failure" - Error# e -> "error: " ++ show e - Success# a (State# i _) -> - if BS.null i - then printf "success: %s" (show a) - else printf "success (%d bytes remaining): %s" (BS.length i) (show a) - -instance Functor (Result# e) where - fmap f = \case - Utf8Error# l -> Utf8Error# l - Failure# -> Failure# - Error# e -> Error# e - Success# a s -> Success# (f a) s - {-# INLINE fmap #-} +newtype Result# e a = Result# (# Loc# | (# #) | e | (# a, State# #) #) + +pattern Utf8Error# :: Loc# -> Result# e a +pattern Utf8Error# l = Result# (# l | | | #) + +pattern Failure# :: Result# e a +pattern Failure# = Result# (# | (# #) | | #) + +pattern Error# :: e -> Result# e a +pattern Error# e = Result# (# | | e | #) + +pattern Success# :: a -> State# -> Result# e a +pattern Success# a s = Result# (# | | | (# a, s #) #) + +{-# COMPLETE Utf8Error#, Failure#, Error#, Success# #-} + +-- instance (Eq e, Eq a) => Eq (Result# e a) where +-- Utf8Error# l0 == Utf8Error# l1 = l0 `locEq#` l1 +-- Failure# == Failure# = True +-- Error# e0 == Error# e1 = e0 == e1 +-- Success# a0 s0 == Success# a1 s1 = a0 == a1 && s0 `stateEq#` s1 +-- _ == _ = False +-- {-# INLINE (==) #-} + +-- instance (Show e, Show a) => Show (Result# e a) where +-- show = \case +-- Utf8Error# l -> "utf8 error at " ++ locShow# l +-- Failure# -> "failure" +-- Error# e -> "error: " ++ show e +-- Success# a (State# i _) -> +-- if BS.null i +-- then printf "success: %s" (show a) +-- else printf "success (%d bytes remaining): %s" (BS.length i) (show a) + +-- instance Functor (Result# e) where +-- fmap f = \case +-- Utf8Error# l -> Utf8Error# l +-- Failure# -> Failure# +-- Error# e -> Error# e +-- Success# a s -> Success# (f a) s +-- {-# INLINE fmap #-} -------------------------------------------------------------------------------- -- Result