module Data.Universe.Instances.Traversable ( -- | A 'Foldable' instance for functions, given the input is 'Finite', and -- a 'Traversable' instance for functions, given the input is 'Ord' and -- 'Finite'. ) where import Control.Applicative import Data.Foldable import Data.Map ((!), fromList) import Data.Monoid import Data.Traversable import Data.Universe instance Finite e => Foldable ((->) e) where foldMap f g = mconcat $ map (f . g) universeF instance (Ord e, Finite e) => Traversable ((->) e) where sequenceA f = (!) . fromList <$> sequenceA [(,) x <$> f x | x <- universeF]