module FRP.Spice.Assets where
import qualified Data.Map.Strict as Map
import Control.Monad
import Data.Default
import FRP.Spice.Graphics.Sprite
import FRP.Spice.Utils.DoList
data LoadAsset = LoadSprite FilePath
type LoadAssets = DoList [LoadAsset]
data Assets = Assets { sprites :: Map.Map FilePath Sprite }
defaultAssets :: Assets
defaultAssets =
Assets { sprites = Map.fromList [] }
instance Default Assets where
def = defaultAssets
appendSprite :: Assets -> FilePath -> Sprite -> Assets
appendSprite assets path sprite =
assets { sprites = Map.insert path sprite $ sprites assets }
performAssetLoads :: LoadAssets -> IO Assets
performAssetLoads la =
performAssetLoads' (values la) defaultAssets
where performAssetLoads' :: [LoadAsset] -> Assets -> IO Assets
performAssetLoads' [] assets = return assets
performAssetLoads' (LoadSprite path:xs) assets = (liftM (appendSprite assets path) $ loadSprite path) >>= performAssetLoads' xs
loadSpriteAsset :: FilePath -> LoadAssets
loadSpriteAsset = fromValues . return . LoadSprite