packages feed

mfmts-1.1.0.0: cid/MultiFormats/CID/Serializer.hs

-- | Module      : MultiFormats.CID.Serializer
--   Description : Provides serialization types for CID
--   Copyright   : Zoey McBride (c) 2026
--   License     : AGPL-3.0-or-later
--   Maintainer  : zoeymcbride@mailbox.org
--   Stability   : experimental
--
-- This file provides a type-class `Serializer` for serializing CID data to
-- ByteString. It also provides the type-alias `Serialization` for the function
-- signature of some serialization over type a.
module MultiFormats.CID.Serializer
  ( Serialization,
    Serializer (serializer),
  )
where

import Data.Bifunctor (Bifunctor (first))
import Data.ByteString.Builder (Builder)
import MultiFormats.CID.Errors
import MultiFormats.MultiCodec (MultiCodec, multiCodecValue)
import MultiFormats.MultiHash (MultiHash, multiHashCodec)
import MultiFormats.VarInt (VarInt, serializeVarInt)

-- | Represents a function that implements serialization.
type Serialization a = a -> Okay Builder

-- | Generic function signature for serializing CID components.
class Serializer a where
  serializer :: a -> Okay Builder

-- | Serializer for VarInts in CID data. Converts VarInt.Error to CID.Error.
instance Serializer VarInt where
  serializer = first InvalidVarInt . serializeVarInt

-- | Composes with Serializer VarInt.
instance Serializer MultiCodec where
  serializer = serializer . multiCodecValue

-- | Composes with Serializer MultiCodec.
instance Serializer MultiHash where
  serializer = serializer . multiHashCodec