{-# LANGUAGE OverloadedStrings #-}
module Main where
import qualified Control.Lens as L
import Criterion.Main
import qualified Data.Aeson.Lens as AL
import qualified Data.ByteString.Char8 as BS
import qualified Data.ByteString.Lazy.Char8 as BL
import qualified Data.Text as T
import qualified Data.Text.Lazy as TL
import Lens.Micro
import Lens.Micro.Aeson
---
main :: IO ()
main = defaultMain
[ bgroup "First elem in Array"
[ bench "microlens-aeson (String)" $ nf (^? nth 0 . _Number) ("[1, \"x\"]" :: String)
, bench "microlens-aeson (T.Text)" $ nf (^? nth 0 . _Number) ("[1, \"x\"]" :: T.Text)
, bench "microlens-aeson (TL.Text)" $ nf (^? nth 0 . _Number) ("[1, \"x\"]" :: TL.Text)
, bench "microlens-aeson (BS)" $ nf (^? nth 0 . _Number) ("[1, \"x\"]" :: BS.ByteString)
, bench "microlens-aeson (BL)" $ nf (^? nth 0 . _Number) ("[1, \"x\"]" :: BL.ByteString)
, bench "lens-aeson (String)" $ nf (L.^? AL.nth 0 . AL._Number) ("[1, \"x\"]" :: String)
, bench "lens-aeson (T.Text)" $ nf (L.^? AL.nth 0 . AL._Number) ("[1, \"x\"]" :: T.Text)
, bench "lens-aeson (TL.Text)" $ nf (L.^? AL.nth 0 . AL._Number) ("[1, \"x\"]" :: TL.Text)
, bench "lens-aeson (BS)" $ nf (L.^? AL.nth 0 . AL._Number) ("[1, \"x\"]" :: BS.ByteString)
, bench "lens-aeson (BL)" $ nf (L.^? AL.nth 0 . AL._Number) ("[1, \"x\"]" :: BL.ByteString) ]
, bgroup "Getting via `key`"
[ bench "microlens-aeson (Text)" $ nf (^? key "a") ("{\"a\": 100, \"b\": 200}" :: T.Text)
, bench "lens-aeson (Text)" $ nf (L.^? AL.key "a") ("{\"a\": 100, \"b\": 200}" :: T.Text) ]
, bgroup "Setting via `key`"
[ bench "microlens-aeson (Text)" $ nf (& key "a" . _Number %~ (* 10)) ("{\"a\": 100, \"b\": 200}" :: T.Text)
, bench "lens-aeson (Text)" $ nf (& AL.key "a" . AL._Number L.%~ (* 10)) ("{\"a\": 100, \"b\": 200}" :: T.Text) ]
]