module Drifter
    (
    -- * Managing Migrations
      resolveDependencyOrder
    , changeSequence
    , migrate
    -- * Types
    , Drifter(..)
    , ChangeName(..)
    , Change(..)
    , Description
    , Method
    , DBConnection
    ) where


import Data.List

import Drifter.Graph
import Drifter.Types


-- | This is a helper for the common case of where you just want
-- dependencies to run in list order. This will take the input list
-- and set their dependencies to run in the given sequence.
changeSequence :: [Change a] -> [Change a]
changeSequence [] = []
changeSequence (x:xs) = reverse $ snd $ foldl' go (x, []) xs
  where
    go :: (Change a, [Change a]) -> Change a -> (Change a, [Change a])
    go (lastChange, xs') c =
      let c' = c { changeDependencies = [changeName lastChange] }
      in (c', c':xs')