module Data.Migration where
import Data.Kind
import GHC.Generics
import GHC.TypeLits
import Data.Migration.Internal
class Transform (f :: Nat -> Type) (n :: Nat) where
up :: f n -> f (n + 1)
down :: f (n + 1) -> f n
genericUp
:: forall n src diff
. ( diff ~ FieldDiff (Sort (RepToTree (Rep (src n)))) (Sort (RepToTree (Rep (src (n + 1)))))
, GTransform diff (src n) (src (n + 1))
, Generic (src (n + 1))
, GUndefinedFields (Rep (src (n + 1)))
)
=> src n -> Function diff (src n) (src (n + 1))
genericUp :: forall (n :: Natural) (src :: Natural -> *) (diff :: [DiffResult]).
(diff
~ FieldDiff
(Sort (RepToTree (Rep (src n))))
(Sort (RepToTree (Rep (src (n + 1))))),
GTransform diff (src n) (src (n + 1)), Generic (src (n + 1)),
GUndefinedFields (Rep (src (n + 1)))) =>
src n -> Function diff (src n) (src (n + 1))
genericUp = forall (ts :: [DiffResult]) src dst.
GTransform ts src dst =>
dst -> src -> Function ts src dst
gTransform @diff @_ @(src (n + 1)) forall t. (Generic t, GUndefinedFields (Rep t)) => t
undefinedFields
genericDown
:: forall n src diff
. ( diff ~ FieldDiff (Sort (RepToTree (Rep (src (n + 1))))) (Sort (RepToTree (Rep (src n))))
, GTransform diff (src (n + 1)) (src n)
, Generic (src n)
, GUndefinedFields (Rep (src n))
)
=> src (n + 1) -> Function diff (src (n + 1)) (src n)
genericDown :: forall (n :: Natural) (src :: Natural -> *) (diff :: [DiffResult]).
(diff
~ FieldDiff
(Sort (RepToTree (Rep (src (n + 1)))))
(Sort (RepToTree (Rep (src n)))),
GTransform diff (src (n + 1)) (src n), Generic (src n),
GUndefinedFields (Rep (src n))) =>
src (n + 1) -> Function diff (src (n + 1)) (src n)
genericDown = forall (ts :: [DiffResult]) src dst.
GTransform ts src dst =>
dst -> src -> Function ts src dst
gTransform @diff @_ @(src n) forall t. (Generic t, GUndefinedFields (Rep t)) => t
undefinedFields