packages feed

data-lens-ixset-0.1.0: test-data-lens-ixset.hs

{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE TemplateHaskell #-}

module Main where

import Control.Monad
import Data.Data
import Data.IxSet
import Data.Lens.Common
import Data.Lens.IxSet
import System.Exit
import Test.QuickCheck
import Test.QuickCheck.All

data Person = Person FirstName LastName
  deriving (Show, Eq, Ord, Data, Typeable)

newtype FirstName = FirstName String
  deriving (Show, Eq, Ord, Data, Typeable, Arbitrary)

newtype LastName = LastName String
  deriving (Show, Eq, Ord, Data, Typeable, Arbitrary)

instance Indexable Person where
  empty = ixSet [ ixGen (Proxy :: Proxy FirstName)
                , ixGen (Proxy :: Proxy LastName)
                ]

prop_get_set :: FirstName -> LastName -> Bool
prop_get_set fname lname = getL l (setL l p empty) == p
  where
    l = ixLens fname
    p = Just $ Person fname lname

prop_set_get :: FirstName -> LastName -> Bool
prop_set_get fname lname = setL l (getL l ix) ix == ix
  where
    l  = ixLens fname
    ix = fromList [Person fname lname]

prop_set_set :: FirstName -> LastName -> LastName -> Bool
prop_set_set fname lname1 lname2 =
    setL l p1 (setL l p2 empty) == setL l p1 empty
  where
    l  = ixLens fname
    p1 = Just $ Person fname lname1
    p2 = Just $ Person fname lname2

main :: IO ()
main = do
  success <- $quickCheckAll
  unless success exitFailure