{-# LANGUAGE NoImplicitPrelude #-}
module RIO.ListSpec where

import Test.Hspec
import RIO
import qualified RIO.List as List

data TestType = TestType { testTypeContents :: Int }
  deriving (Eq, Show)

testTypeList :: [TestType]
testTypeList = [TestType { testTypeContents = 1 }, TestType { testTypeContents = 0 }]

spec :: Spec
spec = do
  describe "dropPrefix" $ do
    it "present" $ List.dropPrefix "foo" "foobar" `shouldBe` "bar"
    it "absent" $ List.dropPrefix "bar" "foobar" `shouldBe` "foobar"
  describe "dropSuffix" $ do
    it "present" $ List.dropSuffix "bar" "foobar" `shouldBe` "foo"
    it "absent" $ List.dropSuffix "foo" "foobar" `shouldBe` "foobar"
  describe "maximumByMaybe" $ do
    it "should support elements that do not have an Ord instance" $
      List.maximumByMaybe (compare `on` testTypeContents) testTypeList `shouldBe` (Just TestType { testTypeContents = 1})
  describe "minimumByMaybe" $ do
    it "should support elements that do not have an Ord instance" $
      List.minimumByMaybe (compare `on` testTypeContents) testTypeList `shouldBe` (Just TestType { testTypeContents = 0})
