module Codec.Extras.FlatViaSerialise
( FlatViaSerialise (..)
) where
import Codec.Serialise (Serialise, deserialiseOrFail, serialise)
import Data.ByteString.Lazy qualified as BSL (toStrict)
import PlutusCore.Flat
newtype FlatViaSerialise a = FlatViaSerialise {forall a. FlatViaSerialise a -> a
unFlatViaSerialise :: a}
instance Serialise a => Flat (FlatViaSerialise a) where
encode :: FlatViaSerialise a -> Encoding
encode = StrictByteString -> Encoding
forall a. Flat a => a -> Encoding
encode (StrictByteString -> Encoding)
-> (FlatViaSerialise a -> StrictByteString)
-> FlatViaSerialise a
-> Encoding
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LazyByteString -> StrictByteString
BSL.toStrict (LazyByteString -> StrictByteString)
-> (FlatViaSerialise a -> LazyByteString)
-> FlatViaSerialise a
-> StrictByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> LazyByteString
forall a. Serialise a => a -> LazyByteString
serialise (a -> LazyByteString)
-> (FlatViaSerialise a -> a)
-> FlatViaSerialise a
-> LazyByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FlatViaSerialise a -> a
forall a. FlatViaSerialise a -> a
unFlatViaSerialise
decode :: Get (FlatViaSerialise a)
decode = do
Either DeserialiseFailure a
errOrX <- LazyByteString -> Either DeserialiseFailure a
forall a.
Serialise a =>
LazyByteString -> Either DeserialiseFailure a
deserialiseOrFail (LazyByteString -> Either DeserialiseFailure a)
-> Get LazyByteString -> Get (Either DeserialiseFailure a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get LazyByteString
forall a. Flat a => Get a
decode
case Either DeserialiseFailure a
errOrX of
Left DeserialiseFailure
err -> String -> Get (FlatViaSerialise a)
forall a. String -> Get a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Get (FlatViaSerialise a))
-> String -> Get (FlatViaSerialise a)
forall a b. (a -> b) -> a -> b
$ DeserialiseFailure -> String
forall a. Show a => a -> String
show DeserialiseFailure
err
Right a
x -> FlatViaSerialise a -> Get (FlatViaSerialise a)
forall a. a -> Get a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (FlatViaSerialise a -> Get (FlatViaSerialise a))
-> FlatViaSerialise a -> Get (FlatViaSerialise a)
forall a b. (a -> b) -> a -> b
$ a -> FlatViaSerialise a
forall a. a -> FlatViaSerialise a
FlatViaSerialise a
x
size :: FlatViaSerialise a -> NumBits -> NumBits
size = StrictByteString -> NumBits -> NumBits
forall a. Flat a => a -> NumBits -> NumBits
size (StrictByteString -> NumBits -> NumBits)
-> (FlatViaSerialise a -> StrictByteString)
-> FlatViaSerialise a
-> NumBits
-> NumBits
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LazyByteString -> StrictByteString
BSL.toStrict (LazyByteString -> StrictByteString)
-> (FlatViaSerialise a -> LazyByteString)
-> FlatViaSerialise a
-> StrictByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> LazyByteString
forall a. Serialise a => a -> LazyByteString
serialise (a -> LazyByteString)
-> (FlatViaSerialise a -> a)
-> FlatViaSerialise a
-> LazyByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FlatViaSerialise a -> a
forall a. FlatViaSerialise a -> a
unFlatViaSerialise