    module Data.Tuple.Strict where

    -- * Pair

    {-# INLINE mapPair #-}
    mapPair :: (a -> c, b -> d) -> (a,b) -> (c,d)
    mapPair (f,g) (x,y) = (f x, g y)

    {-# INLINE mapFst #-}
    mapFst :: (a -> c) -> (a,b) -> (c,b)
    mapFst f (a,b) = (f a, b)

    {-# INLINE mapSnd #-}
    mapSnd :: (b -> c) -> (a,b) -> (a,c)
    mapSnd f (a,b) = (a, f b)

    {-# INLINE swap #-}
    swap :: (a,b) -> (b,a)
    swap (x,y) = (y,x)

    -- * Triple

    {-# INLINE mapTriple #-}
    mapTriple :: (a -> d, b -> e, c -> f) -> (a,b,c) -> (d,e,f)
    mapTriple (f,g,h) (x,y,z) = (f x, g y, h z)

    {-# INLINE mapFst3 #-}
    mapFst3 :: (a -> d) -> (a,b,c) -> (d,b,c)
    mapFst3 f (a,b,c) = (f a, b, c)

    {-# INLINE mapSnd3 #-}
    mapSnd3 :: (b -> d) -> (a,b,c) -> (a,d,c)
    mapSnd3 f (a,b,c) = (a, f b, c)

    {-# INLINE mapThd3 #-}
    mapThd3 :: (c -> d) -> (a,b,c) -> (a,b,d)
    mapThd3 f (a,b,c) = (a, b, f c)

    {-# INLINE uncurry3 #-}
    uncurry3 :: (a -> b -> c -> d) -> ((a, b, c) -> d)
    uncurry3 f (a,b,c) = f a b c