packages feed

rel8-internal-1.8.0.0: src/Rel8/Internal/Type/Range.hs

{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE OverloadedStrings #-}

module Rel8.Internal.Type.Range (
  DBRange (
    rangeTypeName, rangeDecoder, rangeEncoder,
    multirangeTypeName, multirangeDecoder, multirangeEncoder
  ),
) where

-- base
import Data.Int (Int32, Int64)

-- hasql
import qualified Hasql.Decoders as Decoder
import qualified Hasql.Encoders as Encoder

-- postgresql-binary
import qualified PostgreSQL.Binary.Range as PostgreSQL

-- rel8
import Rel8.Internal.Schema.QualifiedName (QualifiedName)
import Rel8.Internal.Type.Ord (DBOrd)

-- scientific
import Data.Scientific (Scientific)

-- time
import Data.Time.Calendar (Day)
import Data.Time.Clock (UTCTime)
import Data.Time.LocalTime (LocalTime)


class DBOrd a => DBRange a where
  rangeTypeName :: QualifiedName
  rangeDecoder :: Decoder.Value (PostgreSQL.Range a)
  rangeEncoder :: Encoder.Value (PostgreSQL.Range a)

  multirangeTypeName :: QualifiedName
  multirangeDecoder :: Decoder.Value (PostgreSQL.Multirange a)
  multirangeEncoder :: Encoder.Value (PostgreSQL.Multirange a)


instance DBRange Int32 where
  rangeTypeName = "int4range"
  rangeDecoder = Decoder.int4range
  rangeEncoder = Encoder.int4range
  multirangeTypeName = "int4multirange"
  multirangeDecoder = Decoder.int4multirange
  multirangeEncoder = Encoder.int4multirange


instance DBRange Int64 where
  rangeTypeName = "int8range"
  rangeDecoder = Decoder.int8range
  rangeEncoder = Encoder.int8range
  multirangeTypeName = "int8multirange"
  multirangeDecoder = Decoder.int8multirange
  multirangeEncoder = Encoder.int8multirange


instance DBRange Scientific where
  rangeTypeName = "numrange"
  rangeDecoder = Decoder.numrange
  rangeEncoder = Encoder.numrange
  multirangeTypeName = "nummultirange"
  multirangeDecoder = Decoder.nummultirange
  multirangeEncoder = Encoder.nummultirange


instance DBRange LocalTime where
  rangeTypeName = "tsrange"
  rangeDecoder = Decoder.tsrange
  rangeEncoder = Encoder.tsrange
  multirangeTypeName = "tsmultirange"
  multirangeDecoder = Decoder.tsmultirange
  multirangeEncoder = Encoder.tsmultirange


instance DBRange UTCTime where
  rangeTypeName = "tstzrange"
  rangeDecoder = Decoder.tstzrange
  rangeEncoder = Encoder.tstzrange
  multirangeTypeName = "tstzmultirange"
  multirangeDecoder = Decoder.tstzmultirange
  multirangeEncoder = Encoder.tstzmultirange


instance DBRange Day where
  rangeTypeName = "daterange"
  rangeDecoder = Decoder.daterange
  rangeEncoder = Encoder.daterange
  multirangeTypeName = "datemultirange"
  multirangeDecoder = Decoder.datemultirange
  multirangeEncoder = Encoder.datemultirange