packages feed

liquidhaskell-0.8.10.7: typeclass-tests/Data/Maybe/Functor.hs

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

instance Functor Maybe where
  fmap _ Nothing = Nothing
  fmap f (Just x) = Just (f x)
  _ <$ Nothing = Nothing
  x <$ (Just _) = Just x

instance VFunctor Maybe where
    lawFunctorId Nothing = ()
    lawFunctorId (Just _) = ()
    lawFunctorComposition f g Nothing = ()
    lawFunctorComposition f g (Just x) = ()

instance Applicative Maybe where
  pure = Just
  ap Nothing _ = Nothing
  ap _ Nothing = Nothing
  ap (Just f) (Just x) = Just (f x)
  liftA2 f (Just a) (Just b) = Just (f a b)
  liftA2 f _       _       = Nothing
  a1 *> a2 = ap (id <$ a1) a2
  a1 <* a2 = liftA2 const a1 a2

instance VApplicative Maybe where
  lawApplicativeId Nothing = ()
  lawApplicativeId (Just x) = ap (pure id) (Just x) `cast` ()
  lawApplicativeComposition (Just f) (Just g) (Just x) = ()
  lawApplicativeComposition _ _ _ = ()
  lawApplicativeHomomorphism f x (Just y) = ()
  lawApplicativeHomomorphism f x Nothing = ()
  lawApplicativeInterchange Nothing _ = ()
  lawApplicativeInterchange (Just f) _ = ()


instance Monad Maybe where
  bind Nothing _ = Nothing
  bind (Just x) f = f x
  return = Just
  mseq _ (Just x) = Just x
  mseq _ Nothing = Nothing

instance VMonad Maybe where
  lawMonad1 x f = ()
  lawMonad2 Nothing = ()
  lawMonad2 (Just x) = ()
  lawMonad3 Nothing f g h = ()
  lawMonad3 (Just x) f g h = h x `cast` ()
  lawMonadReturn _ _ = ()