{-# LANGUAGE QuantifiedConstraints, RankNTypes, UnicodeSyntax, UndecidableInstances #-}
module Data.Equality.Matching.Pattern where
import Data.String
data Pattern lang
= NonVariablePattern (lang (Pattern lang))
| VariablePattern String
pat :: lang (Pattern lang) -> Pattern lang
pat :: forall (lang :: * -> *). lang (Pattern lang) -> Pattern lang
pat = lang (Pattern lang) -> Pattern lang
forall (lang :: * -> *). lang (Pattern lang) -> Pattern lang
NonVariablePattern
instance (∀ a. Eq a => Eq (l a)) => (Eq (Pattern l)) where
== :: Pattern l -> Pattern l -> Bool
(==) (NonVariablePattern l (Pattern l)
a) (NonVariablePattern l (Pattern l)
b) = l (Pattern l) -> l (Pattern l) -> Bool
forall a. Eq a => a -> a -> Bool
(==) l (Pattern l)
a l (Pattern l)
b
(==) (VariablePattern String
a) (VariablePattern String
b) = String
a String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
b
(==) Pattern l
_ Pattern l
_ = Bool
False
instance (∀ a. Eq a => Eq (l a), ∀ a. (Ord a) => Ord (l a)) => (Ord (Pattern l)) where
compare :: Pattern l -> Pattern l -> Ordering
compare (VariablePattern String
_) (NonVariablePattern l (Pattern l)
_) = Ordering
LT
compare (NonVariablePattern l (Pattern l)
_) (VariablePattern String
_) = Ordering
GT
compare (VariablePattern String
a) (VariablePattern String
b) = String -> String -> Ordering
forall a. Ord a => a -> a -> Ordering
compare String
a String
b
compare (NonVariablePattern l (Pattern l)
a) (NonVariablePattern l (Pattern l)
b) = l (Pattern l) -> l (Pattern l) -> Ordering
forall a. Ord a => a -> a -> Ordering
compare l (Pattern l)
a l (Pattern l)
b
instance (∀ a. Show a => Show (lang a)) => Show (Pattern lang) where
showsPrec :: Int -> Pattern lang -> ShowS
showsPrec Int
_ (VariablePattern String
s) = String -> ShowS
showString (ShowS
forall a. Show a => a -> String
show String
s)
showsPrec Int
d (NonVariablePattern lang (Pattern lang)
x) = Int -> lang (Pattern lang) -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
d lang (Pattern lang)
x
instance IsString (Pattern lang) where
fromString :: String -> Pattern lang
fromString = String -> Pattern lang
forall (lang :: * -> *). String -> Pattern lang
VariablePattern