-- | -- Module : Streamly.Internal.Data.Tuple.Strict -- Copyright : (c) 2019 Composewell Technologies -- (c) 2013 Gabriel Gonzalez -- License : BSD3 -- Maintainer : streamly@composewell.com -- Stability : experimental -- Portability : GHC -- -- | Strict data types to be used as accumulator for strict left folds and -- scans. For more comprehensive strict data types see -- https://hackage.haskell.org/package/strict-base-types . The names have been -- suffixed by a prime so that programmers can easily distinguish the strict -- versions from the lazy ones. -- -- One major advantage of strict data structures as accumulators in folds and -- scans is that it helps the compiler optimize the code much better by -- unboxing. In a big tight loop the difference could be huge. -- module Streamly.Internal.Data.Tuple.Strict ( Tuple' (..) , Tuple3' (..) -- XXX Remove this type, use a fuse annotation in Tuple3' itself or use a -- custom type where fuse annotation is needed. , Tuple3Fused' (..) , Tuple4' (..) ) where import Fusion.Plugin.Types (Fuse(..)) -- | A strict '(,)' data Tuple' a b = Tuple' !a !b deriving Show -- XXX Add TupleFused' -- | A strict '(,,)' {-# ANN type Tuple3Fused' Fuse #-} data Tuple3' a b c = Tuple3' !a !b !c deriving Show -- | A strict '(,,)' data Tuple3Fused' a b c = Tuple3Fused' !a !b !c deriving Show -- | A strict '(,,,)' data Tuple4' a b c d = Tuple4' !a !b !c !d deriving Show