packages feed

DataVersion-0.1.0.1: README.md

# DataMigration

[![Hackage](https://img.shields.io/hackage/v/DataVersion.svg?logo=haskell&label=DataVersion)](https://hackage.haskell.org/package/DataVersion)

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.

## Examples

```haskell
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.