module Data.STAR.Path((./), (/<>), (->//)
,starBlocks
,filterP
,blocksByName
,entriesByName
,entryValue
,allEntriesByName
,flattenEntries)
where
import Prelude hiding(String)
import Data.STAR.Type
infixr 3 ./
(./) :: (a -> [a1]) -> (a1 -> [b]) -> a -> [b]
f ./ g = concatMap g . f
(/<>) :: (a -> b) -> (b -> Bool) -> a -> [b]
f /<> g = filterP g . f
infixl 1 ->//
elts ->// path = concatMap path elts
starBlocks :: STAR -> [STARBlock]
starBlocks (STAR blocks) = blocks
filterP :: (t -> Bool) -> t -> [t]
f `filterP` x = [x | f x]
blocksByName :: String -> STAR -> [STAREntry]
blocksByName name = starBlocks ./ filterP matches ./ entries
where
matches (Global _) = name ==""
matches (Data { dataKey = key }) = key == name
entriesByName :: String -> STAREntry -> [STAREntry]
entriesByName name es = matches es
where
matches (Loop table) = concatMap (concatMap matches) table
matches e = [e | key e == name]
entryValue :: STAREntry -> [String]
entryValue (Loop _) = []
entryValue (Frame _ _) = []
entryValue e = [value e]
flattenEntries :: STAREntry -> [STAREntry]
flattenEntries (Loop l) = concat l
flattenEntries (Frame _ l) = l
flattenEntries e = [e]
allEntriesByName name = starBlocks ./ entries ./ flattenEntries ./ entriesByName name ./ entryValue