Module

Tidy.Codegen.Monad

Package
purescript-tidy-codegen
Repository
natefaubion/purescript-tidy-codegen

#CodegenState Source

type CodegenState e = { declarations :: List (Declaration e), exports :: Set CodegenExport, importsFrom :: Map ModuleName (Set (CodegenImport)), importsOpen :: Set ModuleName, importsQualified :: Map ModuleName (Set ModuleName) }

#CodegenT Source

newtype CodegenT :: Type -> (Type -> Type) -> Type -> Typenewtype CodegenT e m a

A Monad transformer which tracks module imports/exports. With this, you can define codegen procedures in a modular way without having to manually calculate imports or do post-traversals.

Constructors

Instances

#Codegen Source

#ImportName Source

data ImportName name

Constructors

Instances

#write Source

write :: forall m e. Monad m => Declaration e -> CodegenT e m Unit

Writes a declaration to the module.

#writeAndExport Source

writeAndExport :: forall m e. Monad m => Declaration e -> CodegenT e m Unit

Writes a declaration and exports it.

#exportValue Source

exportValue :: forall e m name. Monad m => ToToken name Ident => name -> CodegenT e m Unit

Exports a value.

#exportOp Source

exportOp :: forall e m name. Monad m => ToToken name SymbolName => name -> CodegenT e m Unit

Exports an operator.

#exportType Source

exportType :: forall e m name. Monad m => ToToken name Proper => name -> CodegenT e m Unit

Exports a type.

#exportTypeAll Source

exportTypeAll :: forall e m name. Monad m => ToToken name Proper => name -> CodegenT e m Unit

Exports a type with all data members.

#exportTypeOp Source

exportTypeOp :: forall e m name. Monad m => ToToken name SymbolName => name -> CodegenT e m Unit

Exports a type operator.

#exportClass Source

exportClass :: forall e m name. Monad m => ToToken name Proper => name -> CodegenT e m Unit

Exports a class.

#exportModule Source

exportModule :: forall e m name. Monad m => ToToken name ModuleName => name -> CodegenT e m Unit

Exports a module re-export.

#exporting Source

exporting :: forall e m a. Monad m => CodegenT e m a -> CodegenT e m a

Exports all declarations written within the provided block.

#importFrom Source

importFrom :: forall e m mod name imp. Monad m => ToModuleName mod => ToImportFrom name imp => mod -> name -> CodegenT e m imp

Imports from a particular module, yielding a QualifiedName which can be used with the Tidy.Codegen constructors. If the requested import is qualified, an appropriate qualified import will be generated.

example = do
  -- Generates a `import Effect.Class.Console as Console` import
  consoleLog <- importFrom "Effect.Class.Console" (importValue "Console.log")
  -- Generates a `import Data.Map (Map)` import
  mapType <- importFrom "Data.Map" (importType "Map")
  -- Group multiple imports with a record
  dataMap <- import From "Data.Map"
    { type: importType "Map"
    , lookup: importValue "Map.lookup"
    }
  ...

#importOpen Source

importOpen :: forall e m mod. Monad m => ToModuleName mod => mod -> CodegenT e m Unit

Imports a module with an open import.

example = do
  importOpen "Prelude"
  ...

#importValue Source

importValue :: forall name. ToToken name (Qualified Ident) => name -> ImportName Ident

Imports a value. Use with importFrom.

#importOp Source

importOp :: forall name. ToToken name (Qualified SymbolName) => name -> ImportName Operator

Imports a value operator, yield. Use with importFrom.

#importType Source

importType :: forall name. ToToken name (Qualified Proper) => name -> ImportName Proper

Imports a type. Use with importFrom.

#importTypeAll Source

importTypeAll :: forall name. ToToken name (Qualified Proper) => name -> ImportName Proper

Imports a type. Use with importFrom.

#importTypeOp Source

importTypeOp :: forall name. ToToken name (Qualified SymbolName) => name -> ImportName Operator

Imports a type operator. Use with importFrom.

#importClass Source

importClass :: forall name. ToToken name (Qualified Proper) => name -> ImportName Proper

Imports a class. Use with importFrom.

#importCtor Source

importCtor :: forall ty ctor. ToToken ty Proper => ToToken ctor (Qualified Proper) => ty -> ctor -> ImportName Proper

Imports a data constructor for a type. Use with importFrom.

example = do
  just <- importFrom "Data.Maybe" (importCtor "Maybe" "Just")

#codegenModule Source

codegenModule :: forall e name. ToName name ModuleName => name -> Codegen e Unit -> Module e

Extracts a CST Module.

#runCodegenT Source

runCodegenT :: forall m e a. CodegenT e m a -> m (Tuple a (CodegenState e))

Extracts codegen state and the produced value.

#runCodegenTModule Source

runCodegenTModule :: forall e m a name. Functor m => ToName name ModuleName => name -> CodegenT e m a -> m (Tuple a (Module e))

Extracts a CST Module and the produced value.

#moduleFromCodegenState Source

moduleFromCodegenState :: forall e name. ToName name ModuleName => name -> CodegenState e -> Module e

Constructs a CST Module from codegen state.

#ToImportFrom Source

class ToImportFrom name imp | name -> imp where

Members

Instances

#ToImportFromRecord Source

class ToImportFromRecord :: RowList Type -> Type -> Type -> Constraintclass ToImportFromRecord (rl :: RowList Type) rin rout | rl rin -> rout where

Members

Instances