ebook-manager/common/src/Data/Versioned.hs

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