liquidhaskell-0.8.10.7: typeclass-tests/Data/Foldable/Classes.hs
--{-# LANGUAGE RankNTypes #-}
--{-@ LIQUID "--reflection" @-}
--{-@ LIQUID "--ple" @-}
-- module Data.Foldable.Classes where
import Prelude hiding ( Semigroup(..)
, Monoid(..)
, foldr
, head
, flip
, tail
, Maybe (..)
, Foldable (..)
, id
)
import Data.Semigroup.Classes
import Liquid.ProofCombinators
import Data.Endo
import Data.Functor.Identity
import Data.Dual
import Data.Function
import Data.List
import Data.List.NonEmpty
import Data.Maybe
import Data.Functor.Const
{-@ reflect composeEndo @-}
composeEndo :: (b -> a -> a) -> b -> Endo a
composeEndo f x = Endo (f x)
{-@ reflect dualEndoFlip @-}
dualEndoFlip :: (a -> b -> a) -> b -> Dual (Endo a)
dualEndoFlip f x = Dual (Endo (flip f x))
instance Semigroup (Endo a) where
mappend (Endo f) (Endo g) = Endo (compose f g)
sconcat (NonEmpty h t) = foldlList mappend h t
-- instance VSemigroup (Endo a) where
-- lawAssociative (Endo f) (Endo g) (Endo h) = composeAssoc f g h `cast` ()
-- lawSconcat (NonEmpty h t) = sconcat (NonEmpty h t) `cast` ()
instance Monoid (Endo a) where
mempty = Endo id
mconcat = foldrList mappend mempty
-- instance VMonoid (Endo a) where
-- lawEmpty (Endo f) = composeId f
-- lawMconcat _ = ()
-- data Complex a = Complex a a
-- instance Foldable Complex where
-- foldMap f (Complex a b) = f a `mappend` f b
-- foldr f m (Complex a b) = f a (f b m)
-- instance VFoldable Complex where
-- lawFoldable1 _ _ _ = ()