commit 0007a356a0d8b384665d64ddfa6ce9f6a1e29dc6
parent d5a677742259e1e6f5193f7821c59761f1d1e79b
Author: Robert Russell <robert@rr3.xyz>
Date: Wed, 24 Dec 2025 18:03:50 -0800
Unbox Result#
Diffstat:
| M | src/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