{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric  #-}
-- |Binary Large OBjects (BLOBs)
module ZM.Type.BLOB (
    BLOB(..),
    UTF8Encoding(..),
    UTF16LEEncoding(..),
    FlatEncoding(..),
    NoEncoding(..),
    ) where

import           Control.DeepSeq
import           Data.Flat
import           Data.Model
import           ZM.Type.Array

-- |A BLOB is binary value encoded according to a specified encoding (e.g. UTF8)
data BLOB encoding = BLOB {encoding::encoding,content::Bytes} deriving Generic
instance Model encoding => Model (BLOB encoding)

-- |UTF-8 Encoding
data UTF8Encoding = UTF8Encoding
  deriving (Eq, Ord, Show, NFData, Generic, Flat, Model)

-- |UTF-16 Little Endian Encoding
data UTF16LEEncoding = UTF16LEEncoding
  deriving (Eq, Ord, Show, NFData, Generic, Flat, Model)

-- |Flat encoding
data FlatEncoding = FlatEncoding deriving (Eq, Ord, Show, NFData, Generic, Flat, Model)

-- |Unspecified encoding
data NoEncoding = NoEncoding deriving (Eq, Ord, Show, NFData, Generic, Flat, Model)