25 lines
644 B
Haskell
25 lines
644 B
Haskell
{-# Language KindSignatures #-}
|
|
{-# Language DataKinds #-}
|
|
{-# Language DefaultSignatures #-}
|
|
{-# Language MultiParamTypeClasses #-}
|
|
{-# Language FunctionalDependencies #-}
|
|
module Data.Versioned where
|
|
|
|
import GHC.TypeLits
|
|
import ClassyPrelude
|
|
import Data.Generics.Product
|
|
|
|
newtype Versioned (v :: Nat) a = Versioned a deriving (Show)
|
|
|
|
instance Functor (Versioned v) where
|
|
fmap f (Versioned a) = Versioned (f a)
|
|
|
|
instance Applicative (Versioned v) where
|
|
pure = Versioned
|
|
(Versioned f) <*> (Versioned a) = Versioned (f a)
|
|
|
|
class Migrate a b | b -> a where
|
|
migrate :: a -> b
|
|
default migrate :: (Subtype b a) => a -> b
|
|
migrate = upcast
|