mirror of https://github.com/voidlizard/hbs2
70 lines
1.9 KiB
Haskell
70 lines
1.9 KiB
Haskell
{-# Language RecordWildCards #-}
|
||
module Main where
|
||
|
||
import HBS2.Prelude
|
||
import HBS2.Base58
|
||
import HBS2.OrDie
|
||
|
||
import Data.ByteString.Lazy qualified as LBS
|
||
import Data.ByteString qualified as BS
|
||
import Codec.Serialise
|
||
import Lens.Micro.Platform
|
||
|
||
-- желаемое поведение: добавить в новую версию A какое-нибудь поле так,
|
||
-- что бы предыдущие записи продолжали десериализоваться без этого поля,
|
||
-- а новое поле было бы пустым, если его нет -- в новой версии.
|
||
|
||
|
||
data A0 =
|
||
A0 { a0Int :: Int }
|
||
deriving stock (Generic,Show)
|
||
|
||
instance Serialise A0
|
||
|
||
data A1 =
|
||
A11 { a1Int :: Int }
|
||
| A12 { a1Int :: Int, _a1Str :: Maybe String }
|
||
deriving stock (Generic,Show)
|
||
|
||
|
||
instance Serialise A1
|
||
|
||
a1Str :: Lens A1 A1 (Maybe String) (Maybe String)
|
||
a1Str = lens g s
|
||
where
|
||
g (A11{}) = Nothing
|
||
g (A12{..}) = _a1Str
|
||
|
||
s x@(A11{}) _ = x
|
||
s x@(A12{}) w = x { _a1Str = w }
|
||
|
||
-- меняем тип:
|
||
-- старая версия ломается точно, голова остаётся той версии, которая была
|
||
-- новая версия: должна понимать и старую, и новую голову.
|
||
--
|
||
|
||
main :: IO ()
|
||
main = do
|
||
print "1"
|
||
let a1 = serialise (A0 22) & deserialiseOrFail @A1
|
||
let a2 = serialise (A11 22) & deserialiseOrFail @A0
|
||
let a3 = serialise (A12 22 (Just "X1")) & deserialiseOrFail @A0
|
||
let a4 = serialise (A12 22 (Just "X1")) & deserialiseOrFail @A1
|
||
|
||
-- let a0bs = serialise (A0 22) :: LBS.ByteString
|
||
-- let a1bs = serialise (A1 22) -- & LBS.toStrict & toBase58
|
||
-- let a1 = deserialise @A a1bs
|
||
-- let a0 = deserialise @A0 a0bs
|
||
|
||
print a1
|
||
print $ a1 <&> view a1Str
|
||
print $ a4 <&> view a1Str
|
||
print a2
|
||
print a3
|
||
print $ a1 <&> set a1Str (Just "JOPAKITA")
|
||
print $ a4 <&> set a1Str (Just "JOPAKITA")
|
||
|
||
pure ()
|
||
|
||
|