packages feed

flat-0.5.2: src/Flat/Instances/Test.hs

-- | doctest utilities
module Flat.Instances.Test (
    tst,
    tstBits,
    asList,
    flatBits,
    allBits,
    encBits,
    prettyShow,
    module Data.Word,
) where

import           Control.Monad                  ((>=>))
import           Data.Word
import           Flat.Bits                      (Bits, asBytes, bits,
                                                 paddedBits, takeBits,toBools)
import           Flat.Class                     (Flat (..))
import           Flat.Encoder.Prim              (eFillerF)
import           Flat.Encoder.Strict            (Encoding (Encoding),
                                                 numEncodedBits, strictEncoder)
import           Flat.Run                       (flat, unflat)
import           Flat.Types                     (NumBits)
import           Text.PrettyPrint.HughesPJClass (prettyShow)

-- | Returns: result of flat/unflat test, encoding size in bits, byte encoding
tst :: (Eq a, Flat a) => a -> (Bool, NumBits, [Word8])
tst v = (unflat (flat v) == Right v && size v 0 >= length (toBools (bits v)), size v 0, showBytes v)

-- | Returns: result of flat/unflat test, encoding size in bits, bits encoding
tstBits :: (Eq a, Flat a) => a -> (Bool, NumBits, String)
tstBits v = (unflat (flat v) == Right v, Flat.Class.size v 0, flatBits v)

-- | Test that container is serialised as a List
asList :: (Eq a1, Eq a2, Flat a1, Flat a2) => (a2 -> a1) -> a2 -> Bool
asList f l = tst (f l) == tst l

flatBits :: Flat a => a -> String
flatBits = prettyShow . bits

allBits :: Flat a => a -> String
allBits = prettyShow . paddedBits

-- |@since 0.5
encBits :: NumBits -> Encoding -> Bits
encBits maxNumBits e@(Encoding enc) = takeBits (numEncodedBits maxNumBits e) (strictEncoder maxNumBits (Encoding $ enc >=> eFillerF))

showBytes :: Flat a => a -> [Word8]
showBytes = asBytes . bits