@@ -12,9 +12,8 @@ module Data.Terminfo.Parse ( module Data.Terminfo.Parse
12import Control.Applicative ( Applicative(..), pure, (<*>) )
12import Control.Applicative ( Applicative(..), pure, (<*>) )
13import Control.Monad ( liftM )
13import Control.Monad ( liftM )
14import Control.Monad.Trans
14import Control.Monad.Trans
15−import Control.Parallel.Strategies
15+import Control.DeepSeq
17−import Data.Array.Unboxed
18import Data.Monoid
17import Data.Monoid
19import Data.Word
18import Data.Word
@@ -35,8 +34,8 @@ data CapExpression = CapExpression
37instance NFData CapExpression where
36instance NFData CapExpression where
38− rnf (CapExpression ops !_bytes !_str !_c !_p_ops)
37+ rnf (CapExpression ops !_bytes !str !c !p_ops)
39− = rnf ops
38+ = rnf ops `seq` rnf str `seq` rnf c `seq` rnf p_ops
41type CapParam = Word
40type CapParam = Word
@@ -59,17 +58,29 @@ data CapOp =
59 deriving ( Show )
58 deriving ( Show )
61instance NFData CapOp where
60instance NFData CapOp where
62− rnf ( Bytes offset count next_offset ) = rnf offset
61+ rnf (Bytes offset _count next_offset) = rnf offset `seq` rnf next_offset
63− rnf (PushParam !_pn) = ()
62+ rnf (PushParam pn) = rnf pn
64− rnf (PushValue !_v) = ()
63+ rnf (PushValue v) = rnf v
65− rnf (Conditional c_expr c_parts) = rnf c_expr >| rnf c_parts
64+ rnf (Conditional c_expr c_parts) = rnf c_expr `seq` rnf c_parts
66− rnf _ = ()
65+ rnf BitwiseOr = ()
68type ParamOps = [ParamOp]
76type ParamOps = [ParamOp]
69data ParamOp =
77data ParamOp =
70 IncFirstTwo
78 IncFirstTwo
71 deriving ( Show )
79 deriving ( Show )
81+instance NFData ParamOp where
73parse_cap_expression :: ( Applicative m
84parse_cap_expression :: ( Applicative m
74 , MonadIO m
85 , MonadIO m
@@ -84,6 +95,7 @@ parse_cap_expression cap_string =
84 Left e -> return $ Left e
95 Left e -> return $ Left e
85 Right build_results -> pure Right <*> construct_cap_expression cap_string build_results
96 Right build_results -> pure Right <*> construct_cap_expression cap_string build_results
98+construct_cap_expression :: MonadIO m => [Char] -> BuildResults -> m CapExpression
87construct_cap_expression cap_string build_results = do
99construct_cap_expression cap_string build_results = do
88 byte_array <- liftIO $ newArray (map ( toEnum . fromEnum ) cap_string )
100 byte_array <- liftIO $ newArray (map ( toEnum . fromEnum ) cap_string )
89 let expr = CapExpression
101 let expr = CapExpression
@@ -95,7 +107,7 @@ construct_cap_expression cap_string build_results = do
95 , param_count = out_param_count build_results
107 , param_count = out_param_count build_results
96 , param_ops = out_param_ops build_results
108 , param_ops = out_param_ops build_results
98− return (demanding expr (rnf expr))
110+ return $! rnf expr `seq` expr
100type CapParser a = GenParser Char BuildState a
112type CapParser a = GenParser Char BuildState a