{-# LANGUAGE DeriveFoldable #-}
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}

module AWSLambda.Events.Records where

import           Control.Exception.Safe (MonadCatch)
import           Control.Lens.TH (makeLenses)
import           Control.Monad.IO.Class
import           Data.Aeson (FromJSON(..), withObject, (.:))
import           Data.Foldable (traverse_)

import           AWSLambda.Handler (lambdaMain)

newtype RecordsEvent a = RecordsEvent { _reRecords :: [a] } deriving (Eq, Show, Functor, Foldable)

instance FromJSON a => FromJSON (RecordsEvent a) where
  parseJSON = withObject "RecordsEvent" $ \o -> RecordsEvent <$> o .: "Records"

$(makeLenses ''RecordsEvent)

-- | Traverse all the records in a Lambda event
traverseRecords :: Applicative m => (a -> m ()) -> RecordsEvent a -> m ()
traverseRecords = traverse_

-- | A specialised version of the 'lambdaMain' entry-point
-- for handling individual records in a Lambda event
recordsMain :: (FromJSON a, MonadCatch m, MonadIO m) => (a -> m ()) -> m ()
recordsMain = lambdaMain . traverseRecords