module Feldspar
  ( module Prelude.EDSL
  , module Control.Monad
    -- * Types
    -- ** Syntax
  , Data
  , Syntax
  , Comp
    -- ** Object-language types
  , module Data.Int
  , module Data.Word
  , Complex (..)
  , PrimType'
  , PrimType
  , Type
  , Length
  , Index
  , Ref, DRef
  , Arr, DArr
  , IArr, DIArr
  , Inhabited
  , Syntactic
  , Domain
  , Internal
    -- * Front end
  , eval
  , showAST
  , drawAST
  , module Feldspar.Frontend
  , Bits
  , FiniteBits
  , Integral
  , Ord
  , RealFloat
  , RealFrac
  , Border (..)
  , IxRange
  , AssertionLabel (..)
  ) where

import Prelude.EDSL

import Control.Monad hiding (foldM)

import Data.Bits (Bits, FiniteBits)
import Data.Complex (Complex (..))
import Data.Int
import Data.Word

import Language.Syntactic (Syntactic, Domain, Internal)
import qualified Language.Syntactic as Syntactic

import Language.Embedded.Imperative (Border (..), IxRange)

import Data.Inhabited
import Feldspar.Primitive.Representation
import Feldspar.Representation
import Feldspar.Frontend
import Feldspar.Optimize



-- | Show the syntax tree using Unicode art
--
-- Only user assertions will be included.
showAST :: (Syntactic a, Domain a ~ FeldDomain) => a -> String
showAST :: a -> String
showAST = ASTF FeldDomain (Internal a) -> String
forall (sym :: * -> *) a. StringTree sym => ASTF sym a -> String
Syntactic.showAST (ASTF FeldDomain (Internal a) -> String)
-> (a -> ASTF FeldDomain (Internal a)) -> a -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. OptEnv
-> ASTF FeldDomain (Internal a) -> ASTF FeldDomain (Internal a)
forall a. OptEnv -> ASTF FeldDomain a -> ASTF FeldDomain a
optimize OptEnv
onlyUserAssertions (ASTF FeldDomain (Internal a) -> ASTF FeldDomain (Internal a))
-> (a -> ASTF FeldDomain (Internal a))
-> a
-> ASTF FeldDomain (Internal a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> ASTF FeldDomain (Internal a)
forall a. Syntactic a => a -> ASTF (Domain a) (Internal a)
Syntactic.desugar

-- | Draw the syntax tree on the terminal using Unicode art
--
-- Only user assertions will be included.
drawAST :: (Syntactic a, Domain a ~ FeldDomain) => a -> IO ()
drawAST :: a -> IO ()
drawAST = ASTF FeldDomain (Internal a) -> IO ()
forall (sym :: * -> *) a. StringTree sym => ASTF sym a -> IO ()
Syntactic.drawAST (ASTF FeldDomain (Internal a) -> IO ())
-> (a -> ASTF FeldDomain (Internal a)) -> a -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. OptEnv
-> ASTF FeldDomain (Internal a) -> ASTF FeldDomain (Internal a)
forall a. OptEnv -> ASTF FeldDomain a -> ASTF FeldDomain a
optimize OptEnv
onlyUserAssertions (ASTF FeldDomain (Internal a) -> ASTF FeldDomain (Internal a))
-> (a -> ASTF FeldDomain (Internal a))
-> a
-> ASTF FeldDomain (Internal a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> ASTF FeldDomain (Internal a)
forall a. Syntactic a => a -> ASTF (Domain a) (Internal a)
Syntactic.desugar