packages feed

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 _ _ _ = ()