packages feed

api-tools-0.8.0.1: main/Data/API/PerfTest.hs

{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE OverloadedStrings #-}

module Data.API.PerfTest
    ( main
    ) where

import           Data.API.API.DSL
import qualified Data.API.API.Gen               as Gen
import           Data.API.NormalForm
import           Data.API.Types
import qualified Data.API.Value                 as Value

import           Control.DeepSeq
import           Control.Exception
import qualified Data.Aeson                     as JS
import qualified Codec.Serialise     as CBOR
import           Data.Binary.Serialise.CBOR.Extra
import           System.Environment
import           Test.QuickCheck

tyDesc :: APIType

{-
type T = [UTCTime]
tyDesc = TyList (TyBasic BTutc)
-}

type T = Gen.APISpec
tyDesc = TyName "APISpec"

newtype V = V { _V :: Value.Value }

instance CBOR.Serialise V where
  encode (V v) = Value.encode v
  decode = V <$!> Value.decode (apiNormalForm apiAPI) tyDesc

main :: IO ()
main = do
  args <- getArgs
  case args of
    ["read"        , fp] -> do x <- CBOR.readFileDeserialise fp
                               _ <- evaluate (force (x :: T))
                               return ()
    ["read-aeson"  , fp] -> do x <- CBOR.readFileDeserialise fp
                               _ <- evaluate (force (x :: JS.Value))
                               return ()
    ["read-generic", fp] -> do x <- CBOR.readFileDeserialise fp
                               _ <- evaluate (force (_V x))
                               return ()
    ["write"        ,fp] -> do x <- generate (resize 500 arbitrary)
                               CBOR.writeFileSerialise fp (x :: T)
    ["write"      ,fp,i] -> do x <- generate (resize (read i) arbitrary)
                               CBOR.writeFileSerialise fp (x :: T)
    _ -> error "perf-test (read|read-generic|write) <file>"