module Network.AWS.Data.List1 where
import Control.Applicative
import Control.Lens (Iso', iso)
import Control.Monad
import Data.Aeson
import Data.Coerce
import Data.Data (Data, Typeable)
import Data.Foldable (Foldable)
import Data.List.NonEmpty (NonEmpty (..))
import qualified Data.List.NonEmpty as NonEmpty
import Data.Semigroup
import Data.Text (Text)
import Data.Traversable (Traversable, traverse)
import GHC.Exts
import GHC.Generics (Generic)
import Network.AWS.Data.XML
import Text.XML (Node)
import Prelude
newtype List1 a = List1 { toNonEmpty :: NonEmpty a }
deriving
( Functor
, Monad
, Applicative
, Foldable
, Traversable
, Semigroup
, Eq
, Ord
, Read
, Show
, Data
, Typeable
, Generic
)
_List1 :: (Coercible a b, Coercible b a) => Iso' (List1 a) (NonEmpty b)
_List1 = iso (coerce . toNonEmpty) (List1 . coerce)
instance IsList (List1 a) where
type Item (List1 a) = a
fromList = List1 . NonEmpty.fromList
toList = NonEmpty.toList . toNonEmpty
instance FromJSON a => FromJSON (List1 a) where
parseJSON = withArray "List1" (go >=> traverse parseJSON)
where
go = maybe (fail "Error parsing empty List1 when expecting at least one element.")
(pure . List1)
. NonEmpty.nonEmpty
. toList
instance ToJSON a => ToJSON (List1 a) where
toJSON = toJSON . toList
parseXMLList1 :: FromXML a
=> Text
-> [Node]
-> Either String (List1 a)
parseXMLList1 n = parseXMLList n >=> parse
where
parse xs =
maybe (Left $ "Error parsing empty List1 when expecting at least one element: " ++ show n)
(Right . List1)
(NonEmpty.nonEmpty xs)