packages feed

liquidhaskell-0.8.10.7: typeclass-tests/Data/Num/Semigroup.hs

{-@ LIQUID "--reflection" @-}
{-@ LIQUID "--ple" @-}
{-@ LIQUID "--aux-inline" @-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Data.Num.Semigroup where
import           Prelude                 hiding ( Functor(..)
                                                , Applicative(..)
                                                , Monad(..)
                                                , Foldable(..)
                                                , Maybe(..)
                                                , Monoid(..)
                                                , Semigroup(..)
                                                , Either(..)
                                                , id
                                                , flip
                                                , const
                                                , apply
                                                )
import           Liquid.ProofCombinators
import Data.Semigroup.Classes
import Data.List.NonEmpty
import Data.List

data Sum a = Sum {getSum :: a}

instance Num a => Semigroup (Sum a) where
  mappend (Sum x) (Sum y) = Sum $ x + y
  sconcat (NonEmpty h t) = foldlList mappend h t

instance Num a => VSemigroup (Sum a) where
  lawAssociative _ _ _ = ()
  lawSconcat _ = ()

instance Num a => Monoid (Sum a) where
  mempty = Sum 0
  mconcat = foldrList mappend mempty

data Product a = Product {getProduct :: a}

instance Num a => Semigroup (Product a) where
  mappend (Product x) (Product y) = Product $ x * y
  sconcat (NonEmpty h t) = foldlList mappend h t

instance Num a => VSemigroup (Product a) where
  lawAssociative _ _ _ = ()
  lawSconcat _ = ()

instance Num a => Monoid (Product a) where
  mempty = Product 1
  mconcat = foldlList mappend mempty