hxt-9.1.0: src/Control/Arrow/ArrowNF.hs
-- ------------------------------------------------------------
{- |
Module : Control.Arrow.ArrowNF
Copyright : Copyright (C) 2011 Uwe Schmidt
License : MIT
Maintainer : Uwe Schmidt (uwe\@fh-wedel.de)
Stability : experimental
Portability: non-portable
Arrows for evaluation of normal form results
-}
-- ------------------------------------------------------------
module Control.Arrow.ArrowNF
where
import Control.Arrow
import Control.Arrow.ArrowList
import Control.DeepSeq
import Control.FlatSeq
-- |
-- complete evaluation of an arrow result using 'Control.DeepSeq'
--
-- this is sometimes useful for preventing space leaks, especially after reading
-- and validation of a document, all DTD stuff is not longer in use and can be
-- recycled by the GC.
strictA :: (Arrow a, NFData b) => a b b
strictA = arr $ \ x -> deepseq x x
class (Arrow a) => ArrowNF a where
rnfA :: (NFData c) => a b c -> a b c
rnfA f = f >>^ (\ x -> deepseq x x)
{-# INLINE rnfA #-}
-- |
-- partial evaluation of an arrow result using 'Control.FlatSeq'
--
-- There are tow arrows with force the partial evaluation. By convention
-- the 2. should be less lazy than the 1.
--
-- These arrows are sometimes useful for preventing space leaks, especially when parsing
-- complex data structures. In many cases the evaluated AST is more space efficient
-- than the unevaluaded with a lot of closures.
class (Arrow a, ArrowList a) => ArrowWNF a where
rwnfA :: (WNFData c) => a b c -> a b c
rwnfA f = f >>. \ x -> rlnf rwnf x `seq` x
{-# INLINE rwnfA #-}
rwnf2A :: (WNFData c) => a b c -> a b c
rwnf2A f = f >>. \ x -> rlnf rwnf2 x `seq` x
{-# INLINE rwnf2A #-}
-- ------------------------------------------------------------