content: {-# LANGUAGE TypeFamilies #-}
  
  -- | A sequential representation.
  module Futhark.IR.Seq
    ( Seq,
  
      -- * Simplification
      simplifyProg,
  
      -- * Module re-exports
      module Futhark.IR.Prop,
      module Futhark.IR.Traversals,
      module Futhark.IR.Pretty,
      module Futhark.IR.Syntax,
    )
  where
  
  import Futhark.Builder
  import Futhark.Construct
  import Futhark.IR.Pretty
  import Futhark.IR.Prop
  import Futhark.IR.Syntax
  import Futhark.IR.Traversals
  import Futhark.IR.TypeCheck qualified as TC
  import Futhark.Optimise.Simplify qualified as Simplify
  import Futhark.Optimise.Simplify.Engine qualified as Engine
  import Futhark.Optimise.Simplify.Rules
  import Futhark.Pass
  
  -- | The phantom type for the Seq representation.
  data Seq
  
  instance RepTypes Seq
  
  instance ASTRep Seq where
    expTypesFromPat = pure . expExtTypesFromPat
  
  instance TC.Checkable Seq where
    checkOp NoOp = pure ()
  
  instance Buildable Seq where
    mkBody = Body ()
    mkExpPat idents _ = basicPat idents
    mkExpDec _ _ = ()
    mkLetNames = simpleMkLetNames
  
  instance BuilderOps Seq
  
  instance TraverseOpStms Seq where
    traverseOpStms _ = pure
  
  instance PrettyRep Seq
  
  instance BuilderOps (Engine.Wise Seq)
  
  instance TraverseOpStms (Engine.Wise Seq) where
    traverseOpStms _ = pure
  
  simpleSeq :: Simplify.SimpleOps Seq
  simpleSeq = Simplify.bindableSimpleOps (const $ pure (NoOp, mempty))
  
  -- | Simplify a sequential program.
  simplifyProg :: Prog Seq -> PassM (Prog Seq)
  simplifyProg = Simplify.simplifyProg simpleSeq standardRules blockers
    where
      blockers = Engine.noExtraHoistBlockers
  