packages feed

dbmigrations-1.0: test/InMemoryStore.hs

module InMemoryStore (inMemoryStore) where

import           Control.Concurrent.MVar
import           Database.Schema.Migrations.Migration
import           Database.Schema.Migrations.Store

type InMemoryData = [(String, Migration)]

-- |Builds simple in-memory store that uses 'MVar' to preserve a list of
-- migrations.
inMemoryStore :: IO MigrationStore
inMemoryStore = do
    store <- newMVar []
    return MigrationStore {
      loadMigration = loadMigrationInMem store
    , saveMigration = saveMigrationInMem store
    , getMigrations = getMigrationsInMem store
    , fullMigrationName = return
    }

loadMigrationInMem :: MVar InMemoryData -> String -> IO (Either String Migration)
loadMigrationInMem store migId = withMVar store $ \migrations -> do
    let mig = lookup migId migrations
    return $ case mig of
        Just m -> Right m
        _      -> Left "Migration not found"

saveMigrationInMem :: MVar InMemoryData -> Migration -> IO ()
saveMigrationInMem store m = modifyMVar_ store $ return . ((mId m, m):)

getMigrationsInMem :: MVar InMemoryData -> IO [String]
getMigrationsInMem store = withMVar store $ return . fmap fst