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 :: [Change a] -> [Change a]
changeSequence [] = []
changeSequence (Change a
x:[Change a]
xs) = [Change a] -> [Change a]
forall a. [a] -> [a]
reverse ([Change a] -> [Change a]) -> [Change a] -> [Change a]
forall a b. (a -> b) -> a -> b
$ (Change a, [Change a]) -> [Change a]
forall a b. (a, b) -> b
snd ((Change a, [Change a]) -> [Change a])
-> (Change a, [Change a]) -> [Change a]
forall a b. (a -> b) -> a -> b
$ ((Change a, [Change a]) -> Change a -> (Change a, [Change a]))
-> (Change a, [Change a]) -> [Change a] -> (Change a, [Change a])
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (Change a, [Change a]) -> Change a -> (Change a, [Change a])
forall a.
(Change a, [Change a]) -> Change a -> (Change a, [Change a])
go (Change a
x, [Change a
x]) [Change a]
xs
  where
    go :: (Change a, [Change a]) -> Change a -> (Change a, [Change a])
    go :: (Change a, [Change a]) -> Change a -> (Change a, [Change a])
go (Change a
lastChange, [Change a]
xs') Change a
c =
      let c' :: Change a
c' = Change a
c { changeDependencies :: [ChangeName]
changeDependencies = [Change a -> ChangeName
forall a. Change a -> ChangeName
changeName Change a
lastChange] }
      in (Change a
c', Change a
c'Change a -> [Change a] -> [Change a]
forall a. a -> [a] -> [a]
:[Change a]
xs')