@@ -12,9 +12,8 @@ module Data.Terminfo.Parse ( module Data.Terminfo.Parse
1212import Control.Applicative ( Applicative(..), pure, (<*>) )
1313import Control.Monad ( liftM )
1414import Control.Monad.Trans
15−import Control.Parallel.Strategies
15+import Control.DeepSeq
1616
17−import Data.Array.Unboxed
1817import Data.Monoid
1918import Data.Word
2019
@@ -35,8 +34,8 @@ data CapExpression = CapExpression
3534 }
3635
3736instance NFData CapExpression where
38− rnf (CapExpression ops !_bytes !_str !_c !_p_ops)
39− = rnf ops
37+ rnf (CapExpression ops !_bytes !str !c !p_ops)
38+ = rnf ops `seq` rnf str `seq` rnf c `seq` rnf p_ops
4039
4140type CapParam = Word
4241
@@ -59,17 +58,29 @@ data CapOp =
5958 deriving ( Show )
6059
6160instance NFData CapOp where
62− rnf ( Bytes offset count next_offset ) = rnf offset
63− rnf (PushParam !_pn) = ()
64− rnf (PushValue !_v) = ()
65− rnf (Conditional c_expr c_parts) = rnf c_expr >| rnf c_parts
66− rnf _ = ()
61+ rnf (Bytes offset _count next_offset) = rnf offset `seq` rnf next_offset
62+ rnf (PushParam pn) = rnf pn
63+ rnf (PushValue v) = rnf v
64+ rnf (Conditional c_expr c_parts) = rnf c_expr `seq` rnf c_parts
65+ rnf BitwiseOr = ()
66+ rnf BitwiseXOr = ()
67+ rnf BitwiseAnd = ()
68+ rnf ArithPlus = ()
69+ rnf ArithMinus = ()
70+ rnf CompareEq = ()
71+ rnf CompareLt = ()
72+ rnf CompareGt = ()
73+ rnf DecOut = ()
74+ rnf CharOut = ()
6775
6876type ParamOps = [ParamOp]
6977data ParamOp =
7078 IncFirstTwo
7179 deriving ( Show )
7280
81+instance NFData ParamOp where
82+ rnf IncFirstTwo = ()
83+
7384parse_cap_expression :: ( Applicative m
7485 , MonadIO m
7586 )
@@ -84,6 +95,7 @@ parse_cap_expression cap_string =
8495 Left e -> return $ Left e
8596 Right build_results -> pure Right <*> construct_cap_expression cap_string build_results
8697
98+construct_cap_expression :: MonadIO m => [Char] -> BuildResults -> m CapExpression
8799construct_cap_expression cap_string build_results = do
88100 byte_array <- liftIO $ newArray (map ( toEnum . fromEnum ) cap_string )
89101 let expr = CapExpression
@@ -95,7 +107,7 @@ construct_cap_expression cap_string build_results = do
95107 , param_count = out_param_count build_results
96108 , param_ops = out_param_ops build_results
97109 }
98− return (demanding expr (rnf expr))
110+ return $! rnf expr `seq` expr
99111
100112type CapParser a = GenParser Char BuildState a
101113