module GRIP where
import PSlib
import StdLib
import Parse
akkumulate :: (state->a->(b,state)) -> state -> [a] -> ([b],state)
akkumulate f st [] = ([],st)
akkumulate f st (a:as) = (b:bs,st'')
where
(b,st') = f st a
(bs,st'') = akkumulate f st' as
getParameters :: [Line] -> ([PElement],Int,[Line])
getParameters lines = (pe,ticks,lines')
where
(pe,ticks,lines') = f [] 0 lines
f l m [] = ([],m,l)
f l m (l'@(Ln _ (Act _ _ _ _ _ t) _):more) = f (insert l' l) (max m t) more
f l m (PEs x:more) = (x:xs,t,l') where (xs,t,l') = f l m more
f l m (_:more) = f l m more
getAct :: [PElement] -> [Line] -> [Activities]
getAct [] = aux (\x->True)
getAct pes = aux (\x->elem x pes)
aux _ [] = []
aux f ((Ln pe a s):more) | f pe = a:aux f more
| otherwise = aux f more
aux f (_:more) = aux f more
getSp :: [PElement] -> [Line] -> [Sparks]
getSp [] = aux' (\x->True)
getSp pes = aux' (\x->elem x pes)
aux' _ [] = []
aux' f ((Ln pe a s):more) | f pe = s:aux' f more
| otherwise = aux' f more
aux' f (_:more) = aux' f more
scaleAct m a@(Act n i r g f t) | m==t = a
| otherwise = Act n (i*c) (r*c) (g*c) (f*c) (t*c)
where c = m `div` t
data Sparks = Sp Int Int Int Int Int deriving (Show{-was:Text-},Eq)
-- bucket sprkd sused resum lost
numberSp (Sp n _ _ _ _) = n
created (Sp _ s _ _ _) = s
used (Sp _ _ u _ _ ) = u
resumed (Sp _ _ _ r _) = r
lost (Sp _ _ _ _ l) = l
data Activities = Act Int Int Int Int Int Int deriving (Show{-was:Text-},Eq)
-- bucket idle redn gc flush/read total
numberAct (Act b _ _ _ _ _) = b
idle (Act _ i _ _ _ _) = i
reduction (Act _ _ r _ _ _) = r
gc (Act _ _ _ g _ _) = g
flush (Act _ _ _ _ f _) = f
total (Act _ _ _ _ _ t) = t
data Line = Ln PElement Activities Sparks | PEs PElement | BucketFull Int | Null deriving (Show{-was:Text-},Eq)
instance Parse Line where
parseType ('B':string) =
((Ln pe (Act bucket idle redn gc (flush+read) (idle+redn+gc+flush+read+io))
(Sp bucket sprkd sused resum lost)),more)
where
(pe,':':p) = parse string
(bucket,':':a) = parse p
(idle,b) = parse a
(redn,c) = parse b
(gc,d) = parse c
(flush,e) = parse d
(read,k) = parse e
(_,f) = span ((/=) ' ') (whiteSpace k)
(sprkd,g) = parse f
(sused,h) = parse g
(resum,i) = parse h
(lost,j) = parse i
(io,more) = parse j
parseType ('P':'S':string) = (PEs pe,more)
where
(pe,more) = parse (tail (dropWhile ((/=) 'r') string))
-- parseType ('S':' ':string) = test (reverse string)
-- where
-- test ('.':'m':_) = (BucketFull x,"")
-- test _ = (Null,"")
-- (x,_) = parse string
parseType string = (Null,string)
instance Ord Line where
(<=) x@(Ln _ (Act b _ _ _ _ _) _) y@(Ln _ (Act b' _ _ _ _ _) _) = b<=b'
data PElement = PE String Int deriving (Eq,Show{-was:Text-})
instance Parse PElement where
parseType string = (PE name no,more)
where
(name,'.':a) = span ((/=) '.') string
(no,more) = parse a
|