packages feed

express-1.0.14: src/Data/Express/Basic.hs

-- |
-- Module      : Data.Express.Basic
-- Copyright   : (c) 2019-2024 Rudy Matela
-- License     : 3-Clause BSD  (see the file LICENSE)
-- Maintainer  : Rudy Matela <rudy@matela.com.br>
--
-- Defines the 'Expr' type and _basic_ utilities involving it, including:
--
-- * re-export of "Data.Express.Core"
-- * re-export of "Data.Express.Map"
-- * re-export of "Data.Express.Fold"
-- * re-export of "Data.Express.Hole"
--
-- If you're a Express user,
-- you're probably better of importing "Data.Express".
{-# LANGUAGE CPP #-}
module Data.Express.Basic
  (
  -- * Module re-exports
    module Data.Express.Core
  , module Data.Express.Map
  , module Data.Express.Fold
  , module Data.Express.Hole

  -- * Additional utilities
  , (>$$<)
  , (>$$)
  , ($$<)
  )
where

import Data.Express.Core
import Data.Express.Map
import Data.Express.Fold
import Data.Express.Hole

import Data.Maybe (catMaybes, mapMaybe)

-- | Lists valid applications between lists of 'Expr's
--
-- > > [notE, plus] >$$< [false, true, zero]
-- > [not False :: Bool,not True :: Bool,(0 +) :: Int -> Int]
(>$$<) :: [Expr] -> [Expr] -> [Expr]
efs >$$< exs  =  catMaybes [ef $$ ex | ef <- efs, ex <- exs]

-- | Lists valid applications between a list of 'Expr's and an 'Expr'.
--
-- > > [plus, times] >$$ zero
-- > [(0 +) :: Int -> Int,(0 *) :: Int -> Int]
(>$$) :: [Expr] -> Expr -> [Expr]
efs >$$ ex  =  mapMaybe ($$ ex) efs

-- | Lists valid applications between an 'Expr' and a list of 'Expr's.
--
-- > > notE >$$< [false, true, zero]
-- > [not False :: Bool,not True :: Bool]
($$<) :: Expr -> [Expr] -> [Expr]
ef $$< exs  =  mapMaybe (ef $$) exs