-- |
--
-- 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 t
e () m
_ t
v = if t
e t -> t -> Bool
forall a. Eq a => a -> a -> Bool
== t
v then () -> [()]
forall a. a -> [a]
forall (f :: * -> *) a. Applicative f => a -> f a
pure () else [()]
forall a. [a]
forall (m :: * -> *) a. MonadPlus m => m a
mzero
  valueM :: m -> t -> ()
  default valueM :: m -> t -> ()
  valueM m
_ t
_ = ()

-- | Matcher that can handle value patterns of 'Eq' types.
data Eql = Eql

instance Eq a => Matcher Eql a
instance Eq a => ValuePattern Eql a