sweet-egison-0.1.1.0: src/Control/Egison/Match.hs
-- |
--
-- Module: Control.Egison.Match
-- Description: Pattern-matching expressions
-- Stability: experimental
--
-- This module exposes many combinators to perform pattern matching in [miniEgison](https://hackage.haskell.org/package/mini-egison)-like way.
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)