From 3d4cad32799b8f83e2bc000e8a02bfd6dbf63843 Mon Sep 17 00:00:00 2001 From: Alois Cochard Date: Mon, 2 Mar 2015 15:48:18 +0100 Subject: [PATCH] Add `Network.GRPC.Time` module with `Timespec` binding. --- grpc-haskell.cabal | 12 +++++++++--- src/Network/GRPC/Time.chs | 26 ++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 src/Network/GRPC/Time.chs diff --git a/grpc-haskell.cabal b/grpc-haskell.cabal index e3e790b..2a4685b 100644 --- a/grpc-haskell.cabal +++ b/grpc-haskell.cabal @@ -19,11 +19,17 @@ cabal-version: >=1.10 library exposed-modules: Network.GRPC + Network.GRPC.Time -- other-modules: -- other-extensions: - extra-libraries: grpc - includes: grpc/grpc.h + extra-libraries: + grpc + includes: + grpc/grpc.h + , grpc/support/time.h build-tools: c2hs - build-depends: base >=4.7 && <4.8 + build-depends: + base >=4.7 && <4.8 + , clock >=0.4 && <0.5 hs-source-dirs: src default-language: Haskell2010 diff --git a/src/Network/GRPC/Time.chs b/src/Network/GRPC/Time.chs new file mode 100644 index 0000000..4466ca0 --- /dev/null +++ b/src/Network/GRPC/Time.chs @@ -0,0 +1,26 @@ +module Network.GRPC.Time where + +import Control.Applicative +import Control.Monad +import Foreign.C.Types +import Foreign.Ptr +import Foreign.Storable +import System.Clock + +#include "grpc/support/time.h" + +{#context prefix = "grp" #} + +newtype CTimeSpec = CTimeSpec { timeSpec :: TimeSpec } +{#pointer *gpr_timespec as CTimeSpecPtr -> CTimeSpec #} + +instance Storable CTimeSpec where + sizeOf _ = {#sizeof gpr_timespec #} + alignment _ = {#alignof gpr_timespec #} + peek p = fmap CTimeSpec $ TimeSpec + <$> liftM fromIntegral ({#get gpr_timespec->tv_sec #} p) + <*> liftM fromIntegral ({#get gpr_timespec->tv_nsec #} p) + poke p x = do + {#set gpr_timespec.tv_sec #} p (fromIntegral $ sec $ timeSpec x) + {#set gpr_timespec.tv_nsec #} p (fromIntegral $ nsec $ timeSpec x) +