-- This file is part of the 'term-rewriting' library. It is licensed
-- under an MIT license. See the accompanying 'LICENSE' file for details.
--
-- Authors: Bertram Felgenhauer

module Data.Rewriting.Rule.Type (
    module Data.Rewriting.Term.Type,
    Rule (..),
    map,
    mapSides
) where

import Prelude hiding (map)
import Data.Rewriting.Term.Type hiding (map, fold)
import qualified Data.Rewriting.Term.Type as T

-- | Rewrite rule with left-hand side and right-hand side.
data Rule f v = Rule { forall f v. Rule f v -> Term f v
lhs :: Term f v, forall f v. Rule f v -> Term f v
rhs :: Term f v }
    deriving (Eq (Rule f v)
Eq (Rule f v) =>
(Rule f v -> Rule f v -> Ordering)
-> (Rule f v -> Rule f v -> Bool)
-> (Rule f v -> Rule f v -> Bool)
-> (Rule f v -> Rule f v -> Bool)
-> (Rule f v -> Rule f v -> Bool)
-> (Rule f v -> Rule f v -> Rule f v)
-> (Rule f v -> Rule f v -> Rule f v)
-> Ord (Rule f v)
Rule f v -> Rule f v -> Bool
Rule f v -> Rule f v -> Ordering
Rule f v -> Rule f v -> Rule f v
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall f v. (Ord v, Ord f) => Eq (Rule f v)
forall f v. (Ord v, Ord f) => Rule f v -> Rule f v -> Bool
forall f v. (Ord v, Ord f) => Rule f v -> Rule f v -> Ordering
forall f v. (Ord v, Ord f) => Rule f v -> Rule f v -> Rule f v
$ccompare :: forall f v. (Ord v, Ord f) => Rule f v -> Rule f v -> Ordering
compare :: Rule f v -> Rule f v -> Ordering
$c< :: forall f v. (Ord v, Ord f) => Rule f v -> Rule f v -> Bool
< :: Rule f v -> Rule f v -> Bool
$c<= :: forall f v. (Ord v, Ord f) => Rule f v -> Rule f v -> Bool
<= :: Rule f v -> Rule f v -> Bool
$c> :: forall f v. (Ord v, Ord f) => Rule f v -> Rule f v -> Bool
> :: Rule f v -> Rule f v -> Bool
$c>= :: forall f v. (Ord v, Ord f) => Rule f v -> Rule f v -> Bool
>= :: Rule f v -> Rule f v -> Bool
$cmax :: forall f v. (Ord v, Ord f) => Rule f v -> Rule f v -> Rule f v
max :: Rule f v -> Rule f v -> Rule f v
$cmin :: forall f v. (Ord v, Ord f) => Rule f v -> Rule f v -> Rule f v
min :: Rule f v -> Rule f v -> Rule f v
Ord, Rule f v -> Rule f v -> Bool
(Rule f v -> Rule f v -> Bool)
-> (Rule f v -> Rule f v -> Bool) -> Eq (Rule f v)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall f v. (Eq v, Eq f) => Rule f v -> Rule f v -> Bool
$c== :: forall f v. (Eq v, Eq f) => Rule f v -> Rule f v -> Bool
== :: Rule f v -> Rule f v -> Bool
$c/= :: forall f v. (Eq v, Eq f) => Rule f v -> Rule f v -> Bool
/= :: Rule f v -> Rule f v -> Bool
Eq, Int -> Rule f v -> ShowS
[Rule f v] -> ShowS
Rule f v -> String
(Int -> Rule f v -> ShowS)
-> (Rule f v -> String) -> ([Rule f v] -> ShowS) -> Show (Rule f v)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall f v. (Show v, Show f) => Int -> Rule f v -> ShowS
forall f v. (Show v, Show f) => [Rule f v] -> ShowS
forall f v. (Show v, Show f) => Rule f v -> String
$cshowsPrec :: forall f v. (Show v, Show f) => Int -> Rule f v -> ShowS
showsPrec :: Int -> Rule f v -> ShowS
$cshow :: forall f v. (Show v, Show f) => Rule f v -> String
show :: Rule f v -> String
$cshowList :: forall f v. (Show v, Show f) => [Rule f v] -> ShowS
showList :: [Rule f v] -> ShowS
Show)


mapSides :: (Term f v -> Term f' v') -> Rule f v -> Rule f' v'
mapSides :: forall f v f' v'.
(Term f v -> Term f' v') -> Rule f v -> Rule f' v'
mapSides Term f v -> Term f' v'
f Rule f v
r = Rule{ lhs :: Term f' v'
lhs = Term f v -> Term f' v'
f (Rule f v -> Term f v
forall f v. Rule f v -> Term f v
lhs Rule f v
r), rhs :: Term f' v'
rhs = Term f v -> Term f' v'
f (Rule f v -> Term f v
forall f v. Rule f v -> Term f v
rhs Rule f v
r) }

map :: (f -> f') -> (v -> v') -> Rule f v -> Rule f' v'
map :: forall f f' v v'. (f -> f') -> (v -> v') -> Rule f v -> Rule f' v'
map f -> f'
f v -> v'
v = (Term f v -> Term f' v') -> Rule f v -> Rule f' v'
forall f v f' v'.
(Term f v -> Term f' v') -> Rule f v -> Rule f' v'
mapSides ((f -> f') -> (v -> v') -> Term f v -> Term f' v'
forall f f' v v'. (f -> f') -> (v -> v') -> Term f v -> Term f' v'
T.map f -> f'
f v -> v'
v)