ca7c2a7f8e3f6c557dea2210e81035a2fab0d412
[ghc.git] / compiler / utils / Pair.lhs
1
2 A simple homogeneous pair type with useful Functor, Applicative, and
3 Traversable instances.
4
5 \begin{code}
6 {-# LANGUAGE CPP #-}
7
8 module Pair ( Pair(..), unPair, toPair, swap ) where
9
10 #include "HsVersions.h"
11
12 import Outputable
13 import Data.Monoid
14 import Control.Applicative
15 import Data.Foldable
16 import Data.Traversable
17
18 data Pair a = Pair { pFst :: a, pSnd :: a }
19 -- Note that Pair is a *unary* type constructor
20 -- whereas (,) is binary
21
22 -- The important thing about Pair is that it has a *homogenous*
23 -- Functor instance, so you can easily apply the same function
24 -- to both components
25 instance Functor Pair where
26   fmap f (Pair x y) = Pair (f x) (f y)
27
28 instance Applicative Pair where
29   pure x = Pair x x
30   (Pair f g) <*> (Pair x y) = Pair (f x) (g y)
31
32 instance Foldable Pair where
33   foldMap f (Pair x y) = f x `mappend` f y
34
35 instance Traversable Pair where
36   traverse f (Pair x y) = Pair <$> f x <*> f y
37
38 instance Outputable a => Outputable (Pair a) where
39   ppr (Pair a b) = ppr a <+> char '~' <+> ppr b
40
41 unPair :: Pair a -> (a,a)
42 unPair (Pair x y) = (x,y)
43
44 toPair :: (a,a) -> Pair a
45 toPair (x,y) = Pair x y
46
47 swap :: Pair a -> Pair a
48 swap (Pair x y) = Pair y x
49 \end{code}