packages feed

haskell-awk-1.2: src/Data/HaskellExpr.hs

-- | A String-based representation of simple Haskell expressions, typed via phantom types.
module Data.HaskellExpr where

import Text.Printf


newtype HaskellExpr a = HaskellExpr { code :: String }
  deriving (Show, Eq)

eAp :: HaskellExpr (a -> b) -> HaskellExpr a -> HaskellExpr b
HaskellExpr f `eAp` HaskellExpr x = HaskellExpr $ printf "(%s) (%s)" f x

eLambda :: String -> (HaskellExpr a -> HaskellExpr b) -> HaskellExpr (a -> b)
eLambda var body = HaskellExpr $ printf "\\%s -> %s" var (code eBody)
  where
    eVar = HaskellExpr var
    eBody = body eVar


-- we cannot use any unqualified symbols in the user expression,
-- because we don't know which modules the user prelude will import.
{-# INLINE qualified #-}
qualified :: String -> String -> HaskellExpr a
qualified moduleName unqualifiedName = HaskellExpr qualifiedName
  where
    qualifiedName = printf "%s.%s" moduleName unqualifiedName

{-# INLINE qualifiedInfix #-}
qualifiedInfix :: String -> String
               -> HaskellExpr a -> HaskellExpr b -> HaskellExpr c
qualifiedInfix moduleName unqualifiedName x y = HaskellExpr qualifiedName `eAp` x `eAp` y
  where
    qualifiedName = printf "(%s.%s)" moduleName unqualifiedName