-- Quick and dirty meta data store. Ineffcient and -- not safe with concurrent access. -- This should only be used for non-public single-user -- test setups. -- WARNING: this module has never even been tested. It is just here -- to give an example of MetaDataStore implementation. module FileMetaDataStore where import ImageInfo import MetaDataStore import Data.List fileMetaDataStore :: FilePath -> MetaDataStore fileMetaDataStore file = MetaDataStore { addImageInfo = file_addImageInfo file, getAllImages = file_getAllImages file, getImageByID = file_getImageByID file, getImagesByTag = file_getImagesByTag file, getAllTags = file_getAllTags file, addTag = file_addTag file, removeTag = file_removeTag file, setProperty = file_setProperty file } file_addImageInfo file info = do appendFile file (show info) file_getAllImages file = do s <- readFile file return $ map read $ lines s file_getImageByID file id = do is <- file_getAllImages file return $ head [ i | i <- is, key i == id] file_getImagesByTag file tag = do is <- file_getAllImages file return [ i | i <- is, tag `elem` tags i] file_getAllTags file = do is <- file_getAllImages file return $ foldr union [] $ map tags is update file info = do is <- file_getAllImages file let is' = [ if key i == key info then info else i | i <- is ] writeFile file $ unlines $ map show is' return info file_addTag file info tag = update file (info {tags = tags info `union` [tag] }) file_removeTag file info tag = update file (info {tags = delete tag (tags info) }) file_setProperty file info prop = update file (info {properties = setProp prop (properties info) }) setProp (k,v) ps = [ if k' == k then (k,v) else p | p@(k',_) <- ps ]