-- | BERP (BERT packets) support.
module Data.BERT.Packet 
  ( Packet(..)
  , fromPacket
  ) where

import Control.Monad
import Data.ByteString.Lazy as L
import Data.Binary
import Data.Binary.Put
import Data.Binary.Get

import Data.BERT.Term ()
import Data.BERT.Types

-- | A single BERP. Little more than a wrapper for a term.
data Packet
  = Packet Term
    deriving (Show, Ord, Eq)

fromPacket (Packet t) = t

instance Binary Packet where
  put (Packet term) = 
    putWord32be (fromIntegral len) >> putLazyByteString encoded
    where encoded = encode term
          len     = L.length encoded

  get = getPacket

getPacket =
  liftM fromIntegral getWord32be >>= 
  getLazyByteString              >>= 
  return . Packet . decode