module Data.Triplet where import Control.Applicative import Data.Foldable import Data.Monoid import Data.Traversable data Triplet a = Triplet a a a deriving (Eq, Read, Show) instance Functor Triplet where fmap f (Triplet l m r) = Triplet (f l) (f m) (f r) instance Applicative Triplet where pure x = Triplet x x x Triplet fl fm fr <*> Triplet xl xm xr = Triplet (fl xl) (fm xm) (fr xr) instance Foldable Triplet where foldMap f (Triplet l m r) = mconcat . map f $ [l, m, r] instance Traversable Triplet where sequenceA (Triplet l m r) = Triplet <$> l <*> m <*> r