-- | CBOR lists and maps built by hand, for testing that a decoder accepts
-- either the definite-length or the indefinite-length encoding.
module Test.Util.Serialisation.CBOR
  ( definite
  , definiteMap
  , indefinite
  , indefiniteMap
  ) where

import qualified Codec.CBOR.Encoding as CBOR

-- | The items as a definite-length list.
definite :: [CBOR.Encoding] -> CBOR.Encoding
definite :: [Encoding] -> Encoding
definite [Encoding]
xs = Word -> Encoding
CBOR.encodeListLen (Int -> Word
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Word) -> Int -> Word
forall a b. (a -> b) -> a -> b
$ [Encoding] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Encoding]
xs) Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> [Encoding] -> Encoding
forall a. Monoid a => [a] -> a
mconcat [Encoding]
xs

-- | The items as an indefinite-length list.
indefinite :: [CBOR.Encoding] -> CBOR.Encoding
indefinite :: [Encoding] -> Encoding
indefinite [Encoding]
xs = Encoding
CBOR.encodeListLenIndef Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> [Encoding] -> Encoding
forall a. Monoid a => [a] -> a
mconcat [Encoding]
xs Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> Encoding
CBOR.encodeBreak

-- | The key-value pairs as a definite-length map.
definiteMap :: [CBOR.Encoding] -> CBOR.Encoding
definiteMap :: [Encoding] -> Encoding
definiteMap [Encoding]
kvs = Word -> Encoding
CBOR.encodeMapLen (Int -> Word
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Word) -> Int -> Word
forall a b. (a -> b) -> a -> b
$ [Encoding] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Encoding]
kvs) Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> [Encoding] -> Encoding
forall a. Monoid a => [a] -> a
mconcat [Encoding]
kvs

-- | The key-value pairs as an indefinite-length map.
indefiniteMap :: [CBOR.Encoding] -> CBOR.Encoding
indefiniteMap :: [Encoding] -> Encoding
indefiniteMap [Encoding]
kvs = Encoding
CBOR.encodeMapLenIndef Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> [Encoding] -> Encoding
forall a. Monoid a => [a] -> a
mconcat [Encoding]
kvs Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> Encoding
CBOR.encodeBreak