Movatterモバイル変換


[0]ホーム

URL:


modulePostgreSQL.Binary.Decoding(valueParser,--Value,-- * Primitiveint,float4,float8,bool,bytea_strict,bytea_lazy,-- * Textualtext_strict,text_lazy,char,-- * Miscfn,numeric,uuid,inet,json_ast,json_bytes,jsonb_ast,jsonb_bytes,-- * Timedate,time_int,time_float,timetz_int,timetz_float,timestamp_int,timestamp_float,timestamptz_int,timestamptz_float,interval_int,interval_float,-- * Exotic-- ** ArrayArray,array,valueArray,nullableValueArray,dimensionArray,-- ** CompositeComposite,composite,valueComposite,nullableValueComposite,-- ** HStorehstore,-- **enum,refine,)whereimportPostgreSQL.Binary.Preludehiding(take,bool,drop,state,fail,failure)importBinaryParserimportqualifiedPostgreSQL.Binary.IntegralasIntegralimportqualifiedPostgreSQL.Binary.IntervalasIntervalimportqualifiedPostgreSQL.Binary.NumericasNumericimportqualifiedPostgreSQL.Binary.TimeasTimeimportqualifiedPostgreSQL.Binary.InetasInetimportqualifiedData.VectorasVectorimportqualifiedData.ByteStringasByteStringimportqualifiedData.ByteString.LazyasLazyByteStringimportqualifiedData.TextasTextimportqualifiedData.Text.EncodingasTextimportqualifiedData.Text.Encoding.ErrorasTextimportqualifiedData.Text.Lazy.EncodingasLazyTextimportqualifiedData.UUIDasUUIDimportqualifiedData.AesonasAesonimportqualifiedNetwork.IP.AddrasIPAddrtypeValue=BinaryParservalueParser::Valuea->ByteString->EitherTextavalueParser :: forall a. Value a -> ByteString -> Either Text avalueParser=forall a. Value a -> ByteString -> Either Text aBinaryParser.run-- * Helpers--------------------------- |-- Any int number of a limited byte-size.{-# INLINEintOfSize#-}intOfSize::(Integrala,Bitsa)=>Int->ValueaintOfSize :: forall a. (Integral a, Bits a) => Int -> Value aintOfSizeIntx=forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f bfmapforall a. (Bits a, Num a) => ByteString -> aIntegral.pack(Int -> BinaryParser ByteStringbytesOfSizeIntx){-# INLINABLEonContent#-}onContent::Valuea->Value(Maybea)onContent :: forall a. Value a -> Value (Maybe a)onContentValue adecoder=Value Int32sizeforall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b>>=\case(-1)->forall (f :: * -> *) a. Applicative f => a -> f apureforall a. Maybe aNothingInt32n->forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f bfmapforall a. a -> Maybe aJust(forall a. Int -> BinaryParser a -> BinaryParser asized(forall a b. (Integral a, Num b) => a -> bfromIntegralInt32n)Value adecoder)wheresize :: Value Int32size=forall a. (Integral a, Bits a) => Int -> Value aintOfSizeInt4::ValueInt32{-# INLINABLEcontent#-}content::Value(MaybeByteString)content :: Value (Maybe ByteString)content=forall a. (Integral a, Bits a) => Int -> Value aintOfSizeInt4forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b>>=\case(-1)->forall (f :: * -> *) a. Applicative f => a -> f apureforall a. Maybe aNothingIntn->forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f bfmapforall a. a -> Maybe aJust(Int -> BinaryParser ByteStringbytesOfSizeIntn){-# INLINEnonNull#-}nonNull::Maybea->ValueanonNull :: forall a. Maybe a -> Value anonNull=forall b a. b -> (a -> b) -> Maybe a -> bmaybe(forall a. Text -> BinaryParser afailureText"Unexpected NULL")forall (m :: * -> *) a. Monad m => a -> m areturn-- * Primitive--------------------------- |-- Lifts a custom decoder implementation.{-# INLINEfn#-}fn::(ByteString->EitherTexta)->Valueafn :: forall a. (ByteString -> Either Text a) -> Value afnByteString -> Either Text afn=BinaryParser ByteStringBinaryParser.remaindersforall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b>>=forall a c b. (a -> c) -> (b -> c) -> Either a b -> ceitherforall a. Text -> BinaryParser aBinaryParser.failureforall (m :: * -> *) a. Monad m => a -> m areturnforall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).Category cat =>cat b c -> cat a b -> cat a c.ByteString -> Either Text afn{-# INLINEint#-}int::(Integrala,Bitsa)=>Valueaint :: forall a. (Integral a, Bits a) => Value aint=forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f bfmapforall a. (Bits a, Num a) => ByteString -> aIntegral.packBinaryParser ByteStringremaindersfloat4::ValueFloatfloat4 :: Value Floatfloat4=forall a b. a -> bunsafeCoerce(forall a. (Integral a, Bits a) => Value aint::ValueInt32)float8::ValueDoublefloat8 :: Value Doublefloat8=forall a b. a -> bunsafeCoerce(forall a. (Integral a, Bits a) => Value aint::ValueInt64){-# INLINEbool#-}bool::ValueBoolbool :: Value Boolbool=forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f bfmap(forall a. Eq a => a -> a -> Bool==Word81)BinaryParser Word8byte{-# NOINLINEnumeric#-}numeric::ValueScientificnumeric :: Value Scientificnumeric=doIntcomponentsAmount<-forall a. (Integral a, Bits a) => Int -> Value aintOfSizeInt2Int16pointIndex<-forall a. (Integral a, Bits a) => Int -> Value aintOfSizeInt2Word16signCode<-forall a. (Integral a, Bits a) => Int -> Value aintOfSizeInt2Int -> BinaryParser ()unitOfSizeInt2Vector Word16components<-forall (m :: * -> *) a. Monad m => Int -> m a -> m (Vector a)Vector.replicateMIntcomponentsAmount(forall a. (Integral a, Bits a) => Int -> Value aintOfSizeInt2)forall a c b. (a -> c) -> (b -> c) -> Either a b -> ceitherforall a. Text -> BinaryParser afailureforall (m :: * -> *) a. Monad m => a -> m areturn(Int16 -> Word16 -> Vector Word16 -> Either Text ScientificNumeric.scientificInt16pointIndexWord16signCodeVector Word16components){-# INLINABLEuuid#-}uuid::ValueUUIDuuid :: Value UUIDuuid=Word32 -> Word32 -> Word32 -> Word32 -> UUIDUUID.fromWordsforall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b<$>forall a. (Integral a, Bits a) => Int -> Value aintOfSizeInt4forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b<*>forall a. (Integral a, Bits a) => Int -> Value aintOfSizeInt4forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b<*>forall a. (Integral a, Bits a) => Int -> Value aintOfSizeInt4forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b<*>forall a. (Integral a, Bits a) => Int -> Value aintOfSizeInt4{-# INLINEip4#-}ip4::ValueIPAddr.IP4ip4 :: Value IP4ip4=Word8 -> Word8 -> Word8 -> Word8 -> IP4IPAddr.ip4FromOctetsforall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b<$>forall a. (Integral a, Bits a) => Int -> Value aintOfSizeInt1forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b<*>forall a. (Integral a, Bits a) => Int -> Value aintOfSizeInt1forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b<*>forall a. (Integral a, Bits a) => Int -> Value aintOfSizeInt1forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b<*>forall a. (Integral a, Bits a) => Int -> Value aintOfSizeInt1{-# INLINEip6#-}ip6::ValueIPAddr.IP6ip6 :: Value IP6ip6=Word16-> Word16-> Word16-> Word16-> Word16-> Word16-> Word16-> Word16-> IP6IPAddr.ip6FromWordsforall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b<$>forall a. (Integral a, Bits a) => Int -> Value aintOfSizeInt2forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b<*>forall a. (Integral a, Bits a) => Int -> Value aintOfSizeInt2forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b<*>forall a. (Integral a, Bits a) => Int -> Value aintOfSizeInt2forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b<*>forall a. (Integral a, Bits a) => Int -> Value aintOfSizeInt2forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b<*>forall a. (Integral a, Bits a) => Int -> Value aintOfSizeInt2forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b<*>forall a. (Integral a, Bits a) => Int -> Value aintOfSizeInt2forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b<*>forall a. (Integral a, Bits a) => Int -> Value aintOfSizeInt2forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b<*>forall a. (Integral a, Bits a) => Int -> Value aintOfSizeInt2{-# INLINABLEinet#-}inet::Value(IPAddr.NetAddrIPAddr.IP)inet :: Value (NetAddr IP)inet=doWord8af<-forall a. (Integral a, Bits a) => Int -> Value aintOfSizeInt1Word8netmask<-forall a. (Integral a, Bits a) => Int -> Value aintOfSizeInt1Word8isCidr<-forall a. (Integral a, Bits a) => Int -> Value aintOfSizeInt1Int8ipSize<-forall a. (Integral a, Bits a) => Int -> Value aintOfSizeInt1if|Word8afforall a. Eq a => a -> a -> Bool==Word8Inet.inetAddressFamily->doIP4ip<-Value IP4ip4forall (m :: * -> *) a. Monad m => a -> m areturnforall a b. (a -> b) -> a -> b$Word8 -> Word8 -> Word8 -> Int8 -> IP -> NetAddr IPinetFromBytesWord8afWord8netmaskWord8isCidrInt8ipSize(forall t₄ t₆. t₄ -> IP46 t₄ t₆IPAddr.IPv4IP4ip)|Word8afforall a. Eq a => a -> a -> Bool==Word8Inet.inet6AddressFamily->doIP6ip<-Value IP6ip6forall (m :: * -> *) a. Monad m => a -> m areturnforall a b. (a -> b) -> a -> b$Word8 -> Word8 -> Word8 -> Int8 -> IP -> NetAddr IPinetFromBytesWord8afWord8netmaskWord8isCidrInt8ipSize(forall t₄ t₆. t₆ -> IP46 t₄ t₆IPAddr.IPv6IP6ip)|Boolotherwise->forall a. Text -> BinaryParser aBinaryParser.failure(Text"Unknown address family: "forall a. Semigroup a => a -> a -> a<>forall a. IsString a => String -> afromString(forall a. Show a => a -> StringshowWord8af))whereinetFromBytes::Word8->Word8->Word8->Int8->IPAddr.IP->IPAddr.NetAddrIPAddr.IPinetFromBytes :: Word8 -> Word8 -> Word8 -> Int8 -> IP -> NetAddr IPinetFromBytesWord8_Word8netmaskWord8_Int8_IPip=forall n. IsNetAddr n => NetHost n -> Word8 -> nIPAddr.netAddrIPipWord8netmask{-# INLINABLEjson_ast#-}json_ast::ValueAeson.Valuejson_ast :: Value Valuejson_ast=BinaryParser ByteStringbytea_strictforall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b>>=forall a c b. (a -> c) -> (b -> c) -> Either a b -> ceither(forall a. Text -> BinaryParser aBinaryParser.failureforall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).Category cat =>cat b c -> cat a b -> cat a c.forall a. IsString a => String -> afromString)forall (f :: * -> *) a. Applicative f => a -> f apureforall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).Category cat =>cat b c -> cat a b -> cat a c.forall a. FromJSON a => ByteString -> Either String aAeson.eitherDecodeStrict'-- |-- Given a function, which parses a plain UTF-8 JSON string encoded as a byte-array,-- produces a decoder.{-# INLINABLEjson_bytes#-}json_bytes::(ByteString->EitherTexta)->Valueajson_bytes :: forall a. (ByteString -> Either Text a) -> Value ajson_bytesByteString -> Either Text acont=BinaryParser ByteStringgetAllBytesforall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b>>=ByteString -> BinaryParser aparseJSONwheregetAllBytes :: BinaryParser ByteStringgetAllBytes=BinaryParser ByteStringBinaryParser.remaindersparseJSON :: ByteString -> BinaryParser aparseJSON=forall a c b. (a -> c) -> (b -> c) -> Either a b -> ceitherforall a. Text -> BinaryParser aBinaryParser.failureforall (m :: * -> *) a. Monad m => a -> m areturnforall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).Category cat =>cat b c -> cat a b -> cat a c.ByteString -> Either Text acont{-# INLINABLEjsonb_ast#-}jsonb_ast::ValueAeson.Valuejsonb_ast :: Value Valuejsonb_ast=forall a. (ByteString -> Either Text a) -> Value ajsonb_bytesforall a b. (a -> b) -> a -> b$forall a b x. (a -> b) -> Either a x -> Either b xmapLeftforall a. IsString a => String -> afromStringforall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).Category cat =>cat b c -> cat a b -> cat a c.forall a. FromJSON a => ByteString -> Either String aAeson.eitherDecodeStrict'-- |-- Given a function, which parses a plain UTF-8 JSON string encoded as a byte-array,-- produces a decoder.---- For those wondering, yes,-- JSONB is encoded as plain JSON string in the binary format of Postgres.-- Sad, but true.{-# INLINABLEjsonb_bytes#-}jsonb_bytes::(ByteString->EitherTexta)->Valueajsonb_bytes :: forall a. (ByteString -> Either Text a) -> Value ajsonb_bytesByteString -> Either Text acont=BinaryParser ByteStringgetAllBytesforall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b>>=ByteString -> BinaryParser ByteStringtrimBytesforall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b>>=ByteString -> BinaryParser aparseJSONwheregetAllBytes :: BinaryParser ByteStringgetAllBytes=BinaryParser ByteStringBinaryParser.remainderstrimBytes :: ByteString -> BinaryParser ByteStringtrimBytes=forall b a. b -> (a -> b) -> Maybe a -> bmaybe(forall a. Text -> BinaryParser aBinaryParser.failureText"Empty input")forall (m :: * -> *) a. Monad m => a -> m areturnforall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).Category cat =>cat b c -> cat a b -> cat a c.forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f bfmapforall a b. (a, b) -> bsndforall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).Category cat =>cat b c -> cat a b -> cat a c.ByteString -> Maybe (Word8, ByteString)ByteString.unconsparseJSON :: ByteString -> BinaryParser aparseJSON=forall a c b. (a -> c) -> (b -> c) -> Either a b -> ceitherforall a. Text -> BinaryParser aBinaryParser.failureforall (m :: * -> *) a. Monad m => a -> m areturnforall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).Category cat =>cat b c -> cat a b -> cat a c.ByteString -> Either Text acont-- ** Textual--------------------------- |-- A UTF-8-decoded char.{-# INLINABLEchar#-}char::ValueCharchar :: Value Charchar=forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f bfmapText -> Maybe (Char, Text)Text.unconsValue Texttext_strictforall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b>>=\caseJust(Charc,Text"")->forall (m :: * -> *) a. Monad m => a -> m areturnCharcMaybe (Char, Text)Nothing->forall a. Text -> BinaryParser afailureText"Empty input"Maybe (Char, Text)_->forall a. Text -> BinaryParser afailureText"Consumed too much"-- |-- Any of the variable-length character types:-- BPCHAR, VARCHAR, NAME and TEXT.{-# INLINABLEtext_strict#-}text_strict::ValueTexttext_strict :: Value Texttext_strict=doByteStringinput<-BinaryParser ByteStringremaindersforall a c b. (a -> c) -> (b -> c) -> Either a b -> ceither(forall a. Text -> BinaryParser afailureforall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).Category cat =>cat b c -> cat a b -> cat a c.forall {a} {a}. (IsString a, Show a) => a -> UnicodeException -> aexceptionByteStringinput)forall (m :: * -> *) a. Monad m => a -> m areturn(ByteString -> Either UnicodeException TextText.decodeUtf8'ByteStringinput)whereexception :: a -> UnicodeException -> aexceptionainput=\caseText.DecodeErrorString_Maybe Word8_->forall a. IsString a => String -> afromString(String"Failed to decode the following bytes in UTF-8: "forall a. Semigroup a => a -> a -> a<>forall a. Show a => a -> Stringshowainput)UnicodeException_->forall a. HasCallStack => String -> aerrorString"Unexpected unicode exception"-- |-- Any of the variable-length character types:-- BPCHAR, VARCHAR, NAME and TEXT.{-# INLINABLEtext_lazy#-}text_lazy::ValueLazyTexttext_lazy :: Value LazyTexttext_lazy=doLazyByteStringinput<-Value LazyByteStringbytea_lazyforall a c b. (a -> c) -> (b -> c) -> Either a b -> ceither(forall a. Text -> BinaryParser afailureforall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).Category cat =>cat b c -> cat a b -> cat a c.forall {a} {a}. (IsString a, Show a) => a -> UnicodeException -> aexceptionLazyByteStringinput)forall (m :: * -> *) a. Monad m => a -> m areturn(LazyByteString -> Either UnicodeException LazyTextLazyText.decodeUtf8'LazyByteStringinput)whereexception :: a -> UnicodeException -> aexceptionainput=\caseText.DecodeErrorString_Maybe Word8_->forall a. IsString a => String -> afromString(String"Failed to decode the following bytes in UTF-8: "forall a. Semigroup a => a -> a -> a<>forall a. Show a => a -> Stringshowainput)UnicodeException_->forall a. HasCallStack => String -> aerrorString"Unexpected unicode exception"-- |-- BYTEA or any other type in its undecoded form.{-# INLINEbytea_strict#-}bytea_strict::ValueByteStringbytea_strict :: BinaryParser ByteStringbytea_strict=BinaryParser ByteStringremainders-- |-- BYTEA or any other type in its undecoded form.{-# INLINEbytea_lazy#-}bytea_lazy::ValueLazyByteStringbytea_lazy :: Value LazyByteStringbytea_lazy=forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f bfmapByteString -> LazyByteStringLazyByteString.fromStrictBinaryParser ByteStringremainders-- * Date and Time--------------------------- |-- @DATE@ values decoding.date::ValueDaydate :: Value Daydate=forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f bfmap(forall a. Integral a => a -> DayTime.postgresJulianToDayforall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).Category cat =>cat b c -> cat a b -> cat a c.forall a b. (Integral a, Num b) => a -> bfromIntegral)(forall a. (Integral a, Bits a) => Value aint::ValueInt32)-- |-- @TIME@ values decoding for servers, which have @integer_datetimes@ enabled.time_int::ValueTimeOfDaytime_int :: Value TimeOfDaytime_int=forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f bfmapInt64 -> TimeOfDayTime.microsToTimeOfDayforall a. (Integral a, Bits a) => Value aint-- |-- @TIME@ values decoding for servers, which don't have @integer_datetimes@ enabled.time_float::ValueTimeOfDaytime_float :: Value TimeOfDaytime_float=forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f bfmapDouble -> TimeOfDayTime.secsToTimeOfDayValue Doublefloat8-- |-- @TIMETZ@ values decoding for servers, which have @integer_datetimes@ enabled.timetz_int::Value(TimeOfDay,TimeZone)timetz_int :: Value (TimeOfDay, TimeZone)timetz_int=(,)forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b<$>forall a. Int -> BinaryParser a -> BinaryParser asizedInt8Value TimeOfDaytime_intforall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b<*>Value TimeZonetz-- |-- @TIMETZ@ values decoding for servers, which don't have @integer_datetimes@ enabled.timetz_float::Value(TimeOfDay,TimeZone)timetz_float :: Value (TimeOfDay, TimeZone)timetz_float=(,)forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b<$>forall a. Int -> BinaryParser a -> BinaryParser asizedInt8Value TimeOfDaytime_floatforall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b<*>Value TimeZonetz{-# INLINEtz#-}tz::ValueTimeZonetz :: Value TimeZonetz=forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f bfmap(Int -> TimeZoneminutesToTimeZoneforall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).Category cat =>cat b c -> cat a b -> cat a c.forall a. Num a => a -> anegateforall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).Category cat =>cat b c -> cat a b -> cat a c.(forall a b c. (a -> b -> c) -> b -> a -> cflipforall a. Integral a => a -> a -> adivInt60)forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).Category cat =>cat b c -> cat a b -> cat a c.forall a b. (Integral a, Num b) => a -> bfromIntegral)(forall a. (Integral a, Bits a) => Value aint::ValueInt32)-- |-- @TIMESTAMP@ values decoding for servers, which have @integer_datetimes@ enabled.timestamp_int::ValueLocalTimetimestamp_int :: Value LocalTimetimestamp_int=forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f bfmapInt64 -> LocalTimeTime.microsToLocalTimeforall a. (Integral a, Bits a) => Value aint-- |-- @TIMESTAMP@ values decoding for servers, which don't have @integer_datetimes@ enabled.timestamp_float::ValueLocalTimetimestamp_float :: Value LocalTimetimestamp_float=forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f bfmapDouble -> LocalTimeTime.secsToLocalTimeValue Doublefloat8-- |-- @TIMESTAMP@ values decoding for servers, which have @integer_datetimes@ enabled.timestamptz_int::ValueUTCTimetimestamptz_int :: Value UTCTimetimestamptz_int=forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f bfmapInt64 -> UTCTimeTime.microsToUTCforall a. (Integral a, Bits a) => Value aint-- |-- @TIMESTAMP@ values decoding for servers, which don't have @integer_datetimes@ enabled.timestamptz_float::ValueUTCTimetimestamptz_float :: Value UTCTimetimestamptz_float=forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f bfmapDouble -> UTCTimeTime.secsToUTCValue Doublefloat8-- |-- @INTERVAL@ values decoding for servers, which don't have @integer_datetimes@ enabled.interval_int::ValueDiffTimeinterval_int :: Value DiffTimeinterval_int=doInt64u<-forall a. Int -> BinaryParser a -> BinaryParser asizedInt8forall a. (Integral a, Bits a) => Value aintInt32d<-forall a. Int -> BinaryParser a -> BinaryParser asizedInt4forall a. (Integral a, Bits a) => Value aintInt32m<-forall a. (Integral a, Bits a) => Value aintforall (m :: * -> *) a. Monad m => a -> m areturnforall a b. (a -> b) -> a -> b$Interval -> DiffTimeInterval.toDiffTimeforall a b. (a -> b) -> a -> b$Int64 -> Int32 -> Int32 -> IntervalInterval.IntervalInt64uInt32dInt32m-- |-- @INTERVAL@ values decoding for servers, which have @integer_datetimes@ enabled.interval_float::ValueDiffTimeinterval_float :: Value DiffTimeinterval_float=doInt64u<-forall a. Int -> BinaryParser a -> BinaryParser asizedInt8(forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f bfmap(forall a b. (RealFrac a, Integral b) => a -> broundforall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).Category cat =>cat b c -> cat a b -> cat a c.(forall a. Num a => a -> a -> a*(Rational10forall a b. (Num a, Integral b) => a -> b -> a^Integer6))forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).Category cat =>cat b c -> cat a b -> cat a c.forall a. Real a => a -> RationaltoRational)Value Doublefloat8)Int32d<-forall a. Int -> BinaryParser a -> BinaryParser asizedInt4forall a. (Integral a, Bits a) => Value aintInt32m<-forall a. (Integral a, Bits a) => Value aintforall (m :: * -> *) a. Monad m => a -> m areturnforall a b. (a -> b) -> a -> b$Interval -> DiffTimeInterval.toDiffTimeforall a b. (a -> b) -> a -> b$Int64 -> Int32 -> Int32 -> IntervalInterval.IntervalInt64uInt32dInt32m-- * Exotic--------------------------- |-- A function for generic in place parsing of an HStore value.---- Accepts:---- * An implementation of the @replicateM@ function-- (@Control.Monad.'Control.Monad.replicateM'@, @Data.Vector.'Data.Vector.replicateM'@),-- which determines how to produce the final datastructure from the rows.---- * A decoder for keys.---- * A decoder for values.---- Here's how you can use it to produce a parser to list:---- @-- hstoreAsList :: Value [ ( Text , Maybe Text ) ]-- hstoreAsList =--   hstore replicateM text text-- @--{-# INLINABLEhstore#-}hstore::(forallm.Monadm=>Int->m(k,Maybev)->mr)->Valuek->Valuev->Valuerhstore :: forall k v r.(forall (m :: * -> *). Monad m => Int -> m (k, Maybe v) -> m r)-> Value k -> Value v -> Value rhstoreforall (m :: * -> *). Monad m => Int -> m (k, Maybe v) -> m rreplicateMValue kkeyContentValue vvalueContent=doIntcomponentsAmount<-forall a. (Integral a, Bits a) => Int -> Value aintOfSizeInt4forall (m :: * -> *). Monad m => Int -> m (k, Maybe v) -> m rreplicateMIntcomponentsAmountBinaryParser (k, Maybe v)componentwherecomponent :: BinaryParser (k, Maybe v)component=(,)forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b<$>Value kkeyforall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b<*>Value (Maybe v)valuewherekey :: Value kkey=forall a. Value a -> Value (Maybe a)onContentValue kkeyContentforall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b>>=forall a. Maybe a -> Value anonNullvalue :: Value (Maybe v)value=forall a. Value a -> Value (Maybe a)onContentValue vvalueContent-- * Composite-------------------------newtypeCompositea=Composite(Valuea)deriving(forall a b. a -> Composite b -> Composite aforall a b. (a -> b) -> Composite a -> Composite bforall (f :: * -> *).(forall a b. (a -> b) -> f a -> f b)-> (forall a b. a -> f b -> f a) -> Functor f<$ :: forall a b. a -> Composite b -> Composite a$c<$ :: forall a b. a -> Composite b -> Composite afmap :: forall a b. (a -> b) -> Composite a -> Composite b$cfmap :: forall a b. (a -> b) -> Composite a -> Composite bFunctor,Functor Compositeforall a. a -> Composite aforall a b. Composite a -> Composite b -> Composite aforall a b. Composite a -> Composite b -> Composite bforall a b. Composite (a -> b) -> Composite a -> Composite bforall a b c.(a -> b -> c) -> Composite a -> Composite b -> Composite cforall (f :: * -> *).Functor f-> (forall a. a -> f a)-> (forall a b. f (a -> b) -> f a -> f b)-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)-> (forall a b. f a -> f b -> f b)-> (forall a b. f a -> f b -> f a)-> Applicative f<* :: forall a b. Composite a -> Composite b -> Composite a$c<* :: forall a b. Composite a -> Composite b -> Composite a*> :: forall a b. Composite a -> Composite b -> Composite b$c*> :: forall a b. Composite a -> Composite b -> Composite bliftA2 :: forall a b c.(a -> b -> c) -> Composite a -> Composite b -> Composite c$cliftA2 :: forall a b c.(a -> b -> c) -> Composite a -> Composite b -> Composite c<*> :: forall a b. Composite (a -> b) -> Composite a -> Composite b$c<*> :: forall a b. Composite (a -> b) -> Composite a -> Composite bpure :: forall a. a -> Composite a$cpure :: forall a. a -> Composite aApplicative,Applicative Compositeforall a. a -> Composite aforall a b. Composite a -> Composite b -> Composite bforall a b. Composite a -> (a -> Composite b) -> Composite bforall (m :: * -> *).Applicative m-> (forall a b. m a -> (a -> m b) -> m b)-> (forall a b. m a -> m b -> m b)-> (forall a. a -> m a)-> Monad mreturn :: forall a. a -> Composite a$creturn :: forall a. a -> Composite a>> :: forall a b. Composite a -> Composite b -> Composite b$c>> :: forall a b. Composite a -> Composite b -> Composite b>>= :: forall a b. Composite a -> (a -> Composite b) -> Composite b$c>>= :: forall a b. Composite a -> (a -> Composite b) -> Composite bMonad,Monad Compositeforall a. String -> Composite aforall (m :: * -> *).Monad m -> (forall a. String -> m a) -> MonadFail mfail :: forall a. String -> Composite a$cfail :: forall a. String -> Composite aMonadFail)-- |-- Unlift a 'Composite' to a value 'Value'.{-# INLINEcomposite#-}composite::Compositea->Valueacomposite :: forall a. Composite a -> Value acomposite(CompositeValue adecoder)=BinaryParser ()numOfComponentsforall (f :: * -> *) a b. Applicative f => f a -> f b -> f b*>Value adecoderwherenumOfComponents :: BinaryParser ()numOfComponents=Int -> BinaryParser ()unitOfSizeInt4-- |-- Lift a value 'Value' into 'Composite'.{-# INLINEnullableValueComposite#-}nullableValueComposite::Valuea->Composite(Maybea)nullableValueComposite :: forall a. Value a -> Composite (Maybe a)nullableValueCompositeValue avalueValue=forall a. Value a -> Composite aComposite(BinaryParser ()skipOidforall (f :: * -> *) a b. Applicative f => f a -> f b -> f b*>forall a. Value a -> Value (Maybe a)onContentValue avalueValue)whereskipOid :: BinaryParser ()skipOid=Int -> BinaryParser ()unitOfSizeInt4-- |-- Lift a non-nullable value 'Value' into 'Composite'.{-# INLINEvalueComposite#-}valueComposite::Valuea->CompositeavalueComposite :: forall a. Value a -> Composite avalueCompositeValue avalueValue=forall a. Value a -> Composite aComposite(BinaryParser ()skipOidforall (f :: * -> *) a b. Applicative f => f a -> f b -> f b*>forall a. Value a -> Value (Maybe a)onContentValue avalueValueforall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b>>=forall b a. b -> (a -> b) -> Maybe a -> bmaybe(forall a. Text -> BinaryParser afailureText"Unexpected NULL")forall (m :: * -> *) a. Monad m => a -> m areturn)whereskipOid :: BinaryParser ()skipOid=Int -> BinaryParser ()unitOfSizeInt4-- * Array--------------------------- |-- An efficient generic array decoder,-- which constructs the result value in place while parsing.---- Here's how you can use it to produce a specific array value decoder:---- @-- x :: Value [ [ Text ] ]-- x =--   array (dimensionArray replicateM (fmap catMaybes (dimensionArray replicateM (nullableValueArray text))))-- @--newtypeArraya=Array([Word32]->Valuea)deriving(forall a b. a -> Array b -> Array aforall a b. (a -> b) -> Array a -> Array bforall (f :: * -> *).(forall a b. (a -> b) -> f a -> f b)-> (forall a b. a -> f b -> f a) -> Functor f<$ :: forall a b. a -> Array b -> Array a$c<$ :: forall a b. a -> Array b -> Array afmap :: forall a b. (a -> b) -> Array a -> Array b$cfmap :: forall a b. (a -> b) -> Array a -> Array bFunctor)-- |-- Unlift an 'Array' to a value 'Value'.{-# INLINEarray#-}array::Arraya->Valueaarray :: forall a. Array a -> Value aarray(Array[Word32] -> Value adecoder)=doIntdimensionsAmount<-forall a. (Integral a, Bits a) => Int -> Value aintOfSizeInt4ifIntdimensionsAmountforall a. Eq a => a -> a -> Bool/=Int0thendoInt -> BinaryParser ()unitOfSize(Int4forall a. Num a => a -> a -> a+Int4)[Word32]dimensionSizes<-forall (m :: * -> *) a. Applicative m => Int -> m a -> m [a]replicateMIntdimensionsAmountforall a. (Integral a, Bits a) => Value adimensionSize[Word32] -> Value adecoder[Word32]dimensionSizeselse[Word32] -> Value adecoder[Word320]wheredimensionSize :: BinaryParser adimensionSize=forall a. (Integral a, Bits a) => Int -> Value aintOfSizeInt4forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a<*Int -> BinaryParser ()unitOfSizeInt4-- |-- A function for parsing a dimension of an array.-- Provides support for multi-dimensional arrays.---- Accepts:---- * An implementation of the @replicateM@ function-- (@Control.Monad.'Control.Monad.replicateM'@, @Data.Vector.'Data.Vector.replicateM'@),-- which determines the output value.---- * A decoder of its components, which can be either another 'dimensionArray' or 'nullableValueArray'.--{-# INLINEdimensionArray#-}dimensionArray::(forallm.Monadm=>Int->ma->mb)->Arraya->ArraybdimensionArray :: forall a b.(forall (m :: * -> *). Monad m => Int -> m a -> m b)-> Array a -> Array bdimensionArrayforall (m :: * -> *). Monad m => Int -> m a -> m breplicateM(Array[Word32] -> Value acomponent)=forall a. ([Word32] -> Value a) -> Array aArrayforall a b. (a -> b) -> a -> b$\caseWord32head:[Word32]tail->forall (m :: * -> *). Monad m => Int -> m a -> m breplicateM(forall a b. (Integral a, Num b) => a -> bfromIntegralWord32head)([Word32] -> Value acomponent[Word32]tail)[Word32]_->forall a. Text -> BinaryParser afailureText"A missing dimension length"-- |-- Lift a value 'Value' into 'Array' for parsing of nullable leaf values.{-# INLINEnullableValueArray#-}nullableValueArray::Valuea->Array(Maybea)nullableValueArray :: forall a. Value a -> Array (Maybe a)nullableValueArray=forall a. ([Word32] -> Value a) -> Array aArrayforall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).Category cat =>cat b c -> cat a b -> cat a c.forall a b. a -> b -> aconstforall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).Category cat =>cat b c -> cat a b -> cat a c.forall a. Value a -> Value (Maybe a)onContent-- |-- Lift a value 'Value' into 'Array' for parsing of non-nullable leaf values.{-# INLINEvalueArray#-}valueArray::Valuea->ArrayavalueArray :: forall a. Value a -> Array avalueArray=forall a. ([Word32] -> Value a) -> Array aArrayforall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).Category cat =>cat b c -> cat a b -> cat a c.forall a b. a -> b -> aconstforall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).Category cat =>cat b c -> cat a b -> cat a c.forall (m :: * -> *) a. Monad m => m (m a) -> m ajoinforall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).Category cat =>cat b c -> cat a b -> cat a c.forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f bfmap(forall b a. b -> (a -> b) -> Maybe a -> bmaybe(forall a. Text -> BinaryParser afailureText"Unexpected NULL")forall (m :: * -> *) a. Monad m => a -> m areturn)forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).Category cat =>cat b c -> cat a b -> cat a c.forall a. Value a -> Value (Maybe a)onContent-- * Enum--------------------------- |-- Given a partial mapping from text to value,-- produces a decoder of that value.{-# INLINEenum#-}enum::(Text->Maybea)->Valueaenum :: forall a. (Text -> Maybe a) -> Value aenumText -> Maybe amapping=Value Texttext_strictforall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b>>=Text -> BinaryParser aonTextwhereonText :: Text -> BinaryParser aonTextTexttext=forall b a. b -> (a -> b) -> Maybe a -> bmaybeBinaryParser aonNothingforall {f :: * -> *} {a}. Applicative f => a -> f aonJust(Text -> Maybe amappingTexttext)whereonNothing :: BinaryParser aonNothing=forall a. Text -> BinaryParser afailure(Text"No mapping for text \""forall a. Semigroup a => a -> a -> a<>Texttextforall a. Semigroup a => a -> a -> a<>Text"\"")onJust :: a -> f aonJust=forall (f :: * -> *) a. Applicative f => a -> f apure-- * Refining values--------------------------- | Given additional constraints when-- using an existing value decoder, produces-- a decoder of that value.{-# INLINErefine#-}refine::(a->EitherTextb)->Valuea->Valuebrefine :: forall a b. (a -> Either Text b) -> Value a -> Value brefinea -> Either Text bfnValue am=Value amforall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b>>=(forall a c b. (a -> c) -> (b -> c) -> Either a b -> ceitherforall a. Text -> BinaryParser afailureforall (f :: * -> *) a. Applicative f => a -> f apureforall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).Category cat =>cat b c -> cat a b -> cat a c.a -> Either Text bfn)

[8]ページ先頭

©2009-2025 Movatter.jp