packages feed

hegg-0.6.0.0: test/T32.hs

{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE DeriveTraversable #-}
{-# LANGUAGE TypeApplications #-}
module T32 where

import Test.Tasty
import Test.Tasty.HUnit

import Data.Equality.Utils
import Data.Equality.Matching
import Data.Equality.Saturation
import Data.Equality.Graph
import qualified Data.Equality.Graph as EG
import Data.Equality.Saturation.Scheduler (defaultBackoffScheduler)
import Data.Equality.Graph.Monad

data SymExpr a = Symbol String
               | a :+: a
               deriving (Functor, Foldable, Traversable, Eq, Ord, Show)
infix 6 :+:

-- This test tests that using "VariablePattern 1, VariablePattern 2,
-- VariablePattern 3" in a rewrite rule succeeds, as opposed to using the
-- IsString instance for Pattern.
-- (Well, it tests that we can no longer screw up by writing the numbers
-- directly as well. Now the implementation transforms the strings into Ids
-- when compiling the pattern)
rewrites :: [Rewrite () SymExpr]
rewrites =
  [ pat (VariablePattern "1" :+: pat (VariablePattern "2" :+: VariablePattern "3")) := pat (pat (VariablePattern "1" :+: VariablePattern "2") :+: VariablePattern "3")
  ]

e1, e1' :: Fix SymExpr
e1 = Fix (Fix (Fix (Symbol "a") :+: Fix (Symbol "b")) :+: Fix (Symbol "c"))
e1' = Fix (Fix (Symbol "a") :+: Fix (Fix (Symbol "b") :+: Fix (Symbol "c")))

somePattern :: Pattern []
somePattern = NonVariablePattern [VariablePattern "0",VariablePattern "1"] 

-- Test basic associativity using pattern vars
testT32 :: TestTree
testT32 = testGroup "T32"
    [ testCase "basic associativity with VarPattern 1,2,3" $
        let
          (e1_id, eg0)  = EG.represent @() e1 emptyEGraph
          (e1'_id, eg1) = EG.represent @() e1' eg0
          ((), eg2)     = runEGraphM eg1 (runEqualitySaturation defaultBackoffScheduler rewrites)
          e1_canon      = EG.find e1_id eg2
          e1'_canon     = EG.find e1'_id eg2
         in e1_canon @?= e1'_canon
    -- , testCase "compiling pattern" $
    --     compileToQuery somePattern @?= Query ...
    ]