Movatterモバイル変換
[0]ホーム
modulePostgreSQL.Binary.NumericwhereimportPostgreSQL.Binary.PreludeimportqualifiedData.VectorasVectorimportqualifiedData.ScientificasScientificposSignCode::Word16posSignCode=0x0000negSignCode::Word16negSignCode=0x4000nanSignCode::Word16nanSignCode=0xC000extractComponents::Integrala=>a->[Int16]extractComponents=(reverse.).(.abs).unfoldr$\case0->Nothingx->casedivModx10000of(d,m)->Just(fromIntegralm,d)mergeComponents::Integrala=>Vectora->IntegermergeComponents=Vector.foldl'(\lr->l*10000+fromIntegralr)0mergeDigits::Integrala=>Vectora->amergeDigits=Vector.foldl'(\lr->l*10+r)0componentDigits::Int16->[Int16]componentDigits=evalState$doa<-state(flipdivMod1000)b<-state(flipdivMod100)c<-state(flipdivMod10)d<-getreturn$[a,b,c,d]componentsReplicateM::(Integrala,Applicativem)=>Int->ma->macomponentsReplicateMamountcomponent=foldl'folder(pure0)(replicateamountcomponent)wherefolderacccomponent=liftA2(+)(fmap(*10000)acc)componentsigner::Integrala=>Word16->EitherText(a->a)signer=\case0x0000->returnid0x4000->returnnegate0xC000->Left"NAN sign"signCode->Left("Unexpected sign code: "<>(fromString.show)signCode)scientific::Int16->Word16->VectorWord16->EitherTextScientificscientificpointIndexsignCodecomponents=dotheSigner<-signersignCodereturn(Scientific.scientific(ctheSigner)e)wherecsigner=signer(mergeComponentscomponents)e=(fromIntegralpointIndex+1Vector.lengthcomponents)*4
[8]ページ先頭