packages feed

language-dickinson-0.1.0.0: run/REPL/Save.hs

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