liquidhaskell-0.8.10.7: typeclass-tests/Data/PNat/Semigroup.hs
{-@ LIQUID "--reflection" @-}
{-@ LIQUID "--ple" @-}
{-@ LIQUID "--aux-inline" @-}
{-@ LIQUID "--typeclass" @-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Data.PNat.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.PNat
import Data.List.NonEmpty
import Data.List
instance Semigroup PNat where
mappend Z n = n
mappend (S m) n = S (mappend m n)
sconcat (NonEmpty h t) = foldlList mappend h t
instance VSemigroup PNat where
lawAssociative Z _ _ = ()
lawAssociative (S p) m n = lawAssociative p m n
lawSconcat (NonEmpty h t) = ()
instance Monoid PNat where
mempty = Z
mconcat xs = foldrList mappend mempty xs
instance VMonoid PNat where
lawEmpty Z = ()
lawEmpty (S m) = lawEmpty m
lawMconcat _ = ()