From e536da9f989969e2c6bcef960ee43be3527ac276 Mon Sep 17 00:00:00 2001 From: Neil Brown Date: Mon, 9 Feb 2009 12:11:07 +0000 Subject: [PATCH] Added an instance of Traversable for ParItems --- checks/UsageCheckUtils.hs | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/checks/UsageCheckUtils.hs b/checks/UsageCheckUtils.hs index 2db150a..0b29002 100644 --- a/checks/UsageCheckUtils.hs +++ b/checks/UsageCheckUtils.hs @@ -18,12 +18,15 @@ with this program. If not, see . module UsageCheckUtils (Decl(..), emptyVars, flattenParItems, foldUnionVars, getVarProcCall, getVarProc, labelUsageFunctions, mapUnionVars, ParItems(..), processVarW, transformParItems, UsageLabel(..), Var(..), Vars(..), vars) where +import Control.Applicative import Control.Monad.Writer (tell) +import qualified Data.Foldable as F import Data.Generics hiding (GT) import Data.List import qualified Data.Map as Map import Data.Maybe import qualified Data.Set as Set +import qualified Data.Traversable as T import qualified AST as A import CompState @@ -87,6 +90,26 @@ transformParItems f (RepParItem r p) = RepParItem r (transformParItems f p) instance Functor ParItems where fmap = transformParItems +instance F.Foldable ParItems where + foldr _ x (ParItems []) = x + foldr f x (ParItems (p:ps)) = F.foldr f (F.foldr f x p) (ParItems ps) + foldr f x (SeqItems ss) = foldr f x ss + foldr f x (RepParItem nr p) = F.foldr f x p + +instance T.Traversable ParItems where + -- traverse :: Applicative f => (a -> f b) -> ParItems a -> f (ParItems b) + -- <*> :: Applicative f => f (a -> b) -> f a -> f b + traverse f (ParItems ps) = liftA ParItems $ rec ps + where + -- rec :: Applicative f => [ParItems a] -> f [ParItems b] + rec [] = pure [] + rec (p:ps) = liftA2 (:) (T.traverse f p) (rec ps) + traverse f (RepParItem nr p) = liftA (RepParItem nr) $ T.traverse f p + traverse f (SeqItems ss) = liftA SeqItems $ rec ss + where + rec [] = pure [] + rec (s:ss) = liftA2 (:) (f s) (rec ss) + -- Gets all the items inside a ParItems and returns them in a flat list. flattenParItems :: ParItems a -> [a] flattenParItems (SeqItems xs) = xs