module REPL.Save ( decodeReplSt
, encodeReplSt
) where
import qualified Codec.Compression.Zstd.Lazy as Zstd
import Data.Binary (Binary, Get, Put, get, put)
import Data.Binary.Get (runGet)
import Data.Binary.Put (runPut)
import qualified Data.ByteString.Lazy as BSL
import Data.Semigroup ((<>))
import Language.Dickinson.Eval
getReplState :: Binary a => [Double] -> Get (EvalSt a)
getReplState ds =
EvalSt ds
<$> get
<*> get
<*> get
<*> get
<*> get
putReplState :: Binary a => EvalSt a -> Put
putReplState (EvalSt _ be rs t lSt ty) =
put be
<> put rs
<> put t
<> put lSt
<> put ty
decodeReplSt :: Binary a => [Double] -> BSL.ByteString -> EvalSt a
decodeReplSt ds = runGet (getReplState ds) . Zstd.decompress
encodeReplSt :: Binary a => EvalSt a -> BSL.ByteString
encodeReplSt = Zstd.compress 3 . runPut . putReplState