packages feed

hobbits-1.1.1: Data/Binding/Hobbits/Examples/UnitTests/NuElimTest.hs

{-# LANGUAGE GADTs, RankNTypes, TypeOperators, ViewPatterns, TypeFamilies, FlexibleInstances, FlexibleContexts, TemplateHaskell, UndecidableInstances, ScopedTypeVariables, NoMonomorphismRestriction #-}

module NuElimTest where

import Data.Binding.Hobbits


--
-- some helpers
--

proxies2 = Nil :> Proxy :> Proxy

nu2 :: (Name a1 -> Name a2 -> b) -> Mb (Nil :> a1 :> a2) b
nu2 f = nuMulti proxies2 $ \(Nil :> n1 :> n2) -> f n1 n2


--
-- test that mbApply works correctly for names in the argument
--

test1f :: Mb (Nil :> a :> a) (Name a -> Int)
test1f = nu2 $ \n1 n2 n ->
         case () of
           () | Just Refl <- cmpName n n1 -> 1
           () | Just Refl <- cmpName n n2 -> 2
           _ -> 3

test1a = test1f `mbApply` (nu2 $ \n1 n2 -> n1) -- body should be 1
test1b = test1f `mbApply` (nu2 $ \n1 n2 -> n2) -- body should be 2
test1c = nu (\n -> test1f `mbApply` (nu2 $ \n1 n2 -> n)) -- body should be 3



--
-- test that mbApply works correctly for names in the argument and the
-- return value
--

test2f :: Mb (Nil :> a :> a) (Name a -> Name a)
test2f = nu2 $ \n1 n2 n ->
         case () of
           () | Just Refl <- cmpName n n1 -> n2
           () | Just Refl <- cmpName n n2 -> n1
           _ -> n

test2a = test2f `mbApply` (nu2 $ \n1 n2 -> n1) -- should be Nu (n1,n2) n2
test2b = test2f `mbApply` (nu2 $ \n1 n2 -> n2) -- should be Nu (n1,n2) n1
test2c = nu (\n -> test2f `mbApply` (nu2 $ \n1 n2 -> n)) -- should be Nu (n) (Nu (n1,n2) n)