sweet-egison-0.1.0.1: src/Control/Egison/Matcher.hs
-- |
--
-- Module: Control.Egison.Matcher
-- Description: Matcher class and basic matchers
-- Stability: experimental
--
-- This module defines a class for matchers and some basic matchers.
module Control.Egison.Matcher
( Pattern
, Matcher
, Something(..)
, ValuePattern(..)
, Eql(..)
)
where
import Control.Monad ( MonadPlus(..) )
-- | Type synonym for patterns.
type Pattern ps im it ot = ps -> im -> it -> [ot]
-- | Class for matchers. @'Matcher' m tgt@ denotes that @m@ is a matcher for @tgt@.
class Matcher m tgt
-- | Matcher that handles pattern variables and wildcards for arbitrary types.
data Something = Something
instance Matcher Something a
class Eq t => ValuePattern m t where
value :: t -> Pattern () m t ()
default value :: Eq t => t -> Pattern () m t ()
value e () _ v = if e == v then pure () else mzero
valueM :: m -> t -> ()
default valueM :: m -> t -> ()
valueM _ _ = ()
-- | Matcher that can handle value patterns of 'Eq' types.
data Eql = Eql
instance Eq a => Matcher Eql a
instance Eq a => ValuePattern Eql a