DataVersion: Type safe data migrations

[ data, library, mit ] [ Propose Tags ]


Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees


Versions [RSS],
Change log
Dependencies base (>=4.7 && <5), generic-lens, microlens [details]
License MIT
Copyright 2019 Sandy Maguire, James King
Author Sandy Maguire, James King
Category Data
Home page
Bug tracker
Source repo head: git clone
Uploaded by agentultra at 2022-11-30T21:04:20Z
Distributions NixOS:
Downloads 604 total (8 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs available [build log]
Last success reported on 2022-11-30 [all 1 reports]

Readme for DataVersion-

[back to package description]



Type safe data migrations.

All you need to do is create a type family to index your record and provide an instance of Transform to migrate your data between versions.

Migrations are type-safe and the library uses generics to remove as much boiler-plate as possible.


data family Foo (version :: Nat)

newtype MyString = MyString { unMyString :: String }
   deriving (IsString, Show, Eq)

data instance Foo 0
  = FooV0
    { _fooId :: Int
    , _fooName :: String
  deriving (Generic, Show, Eq)

data instance Foo 1
  = FooV1
  { _fooId        :: Int
  , _fooName      :: MyString
  , _fooHonorific :: String
  deriving (Generic, Show, Eq)

instance Transform Foo 0 where
  up   v = genericUp   v (const "esquire") (const MyString)
  down v = genericDown v (const unMyString)

spjV0 :: Foo 0
spjV0 = FooV0 1 "Simon PJ"

spjV1 :: Foo 1
spjV1 = up spjV0

-- spjV1 = FooV1 1 (MyString "Simon PJ") "esquire"

Future Considerations

In the future this library will provide a high-level DSL to enable better ergonomics around type errors so that you can see which fields require specification in the migration.