{-# LANGUAGE CPP, OverloadedStrings, ScopedTypeVariables #-}
module Sound.Freesound.List (
  List
, elems
, numElems
, previous
, next
, getPrevious
, getNext
) where

import Control.Monad (liftM, mzero)
import Data.Aeson
import Sound.Freesound.API (Freesound, Resource, get)

#if __GLASGOW_HASKELL__ < 710
import           Control.Applicative
#endif

data List a = List {
  elems    :: [a]
, numElems :: Int
, previous :: Maybe (Resource (List a))
, next     :: Maybe (Resource (List a))
} deriving (Eq, Show)

instance FromJSON a => FromJSON (List a) where
  parseJSON (Object v) =
    List
      <$> v .: "results"
      <*> v .: "count"
      <*> v .:? "previous"
      <*> v .:? "next"
  parseJSON _ = mzero

getPrevious :: FromJSON a => List a -> Freesound (Maybe (List a))
getPrevious = maybe (return Nothing) (liftM Just . get) . previous

getNext :: FromJSON a => List a -> Freesound (Maybe (List a))
getNext = maybe (return Nothing) (liftM Just . get) . next