module Control.Egison.Match
( matchAll
, matchAllSingle
, match
)
where
import Control.Egison.Matcher ( Matcher )
import Control.Monad.Search ( MonadSearch(..) )
{-# INLINE matchAll #-}
matchAll
:: (Matcher m t, MonadSearch s)
=> ((m, t) -> s (m, t))
-> t
-> m
-> [(m, t) -> s r]
-> [r]
matchAll strategy target matcher =
concatMap (\b -> toList (strategy (matcher, target) >>= b))
{-# INLINE matchAllSingle #-}
matchAllSingle
:: (Matcher m t, MonadSearch s)
=> ((m, t) -> s (m, t))
-> t
-> m
-> ((m, t) -> s r)
-> [r]
matchAllSingle strategy target matcher b =
toList (strategy (matcher, target) >>= b)
{-# INLINE match #-}
match
:: (Matcher m t, MonadSearch s)
=> ((m, t) -> s (m, t))
-> t
-> m
-> [(m, t) -> s r]
-> r
match strategy target matcher bs = head (matchAll strategy target matcher bs)