packages feed

rds-data-codecs-0.0.0.1: src/Data/RdsData/Encode/Array.hs

{-# LANGUAGE BlockArguments #-}

module Data.RdsData.Encode.Array
  ( EncodeArray(..)

  , rdsArray
  , arrays

  , bools
  , doubles
  , integers
  , texts

  , ints
  , int8s
  , int16s
  , int32s
  , int64s
  , words
  , word8s
  , word16s
  , word32s
  , word64s
  , lazyTexts
  , timesOfDay
  , days
  , jsons
  , utcTimes
  ) where

import Data.Functor.Contravariant
import Data.Int
import Data.RdsData.Internal.Convert
import Data.RdsData.Types.Array (Array(..))
import Data.Text (Text)
import Data.Time
import Data.Word
import Prelude hiding (words)

import qualified Data.Aeson           as J
import qualified Data.Text.Lazy       as LT

newtype EncodeArray a = EncodeArray
  { encodeArray :: a -> Array
  }

instance Contravariant EncodeArray where
  contramap f (EncodeArray g) =
    EncodeArray (g . f)

--------------------------------------------------------------------------------

rdsArray :: EncodeArray Array
rdsArray =
  EncodeArray id

--------------------------------------------------------------------------------

arrays :: EncodeArray Array -> EncodeArray [Array]
arrays =
  contramap ArrayOfArrays

--------------------------------------------------------------------------------

bools :: EncodeArray [Bool]
bools =
  ArrayOfBools >$< rdsArray

integers :: EncodeArray [Integer]
integers =
  ArrayOfIntegers >$< rdsArray

texts :: EncodeArray [Text]
texts =
  ArrayOfTexts >$< rdsArray

doubles :: EncodeArray [Double]
doubles =
  ArrayOfDoubles >$< rdsArray

--------------------------------------------------------------------------------

ints :: EncodeArray [Int]
ints =
  fmap fromIntegral >$< integers

int8s :: EncodeArray [Int8]
int8s =
  fmap fromIntegral >$< integers

int16s :: EncodeArray [Int16]
int16s =
  fmap fromIntegral >$< integers

int32s :: EncodeArray [Int32]
int32s =
  fmap fromIntegral >$< integers

int64s :: EncodeArray [Int64]
int64s =
  fmap fromIntegral >$< integers

words :: EncodeArray [Word]
words =
  fmap fromIntegral >$< integers

word8s :: EncodeArray [Word8]
word8s =
  fmap fromIntegral >$< integers

word16s :: EncodeArray [Word16]
word16s =
  fmap fromIntegral >$< integers

word32s :: EncodeArray [Word32]
word32s =
  fmap fromIntegral >$< integers

word64s :: EncodeArray [Word64]
word64s =
  fmap fromIntegral >$< integers

lazyTexts :: EncodeArray [LT.Text]
lazyTexts =
  fmap LT.toStrict >$< texts

timesOfDay :: EncodeArray [TimeOfDay]
timesOfDay =
  fmap timeOfDayToText >$< texts

days :: EncodeArray [Day]
days =
  fmap dayToText >$< texts

jsons :: EncodeArray [J.Value]
jsons =
  fmap jsonToText >$< texts

utcTimes :: EncodeArray [UTCTime]
utcTimes =
  fmap utcTimeToText >$< texts