Skip to content

Latest commit

 

History

History
194 lines (145 loc) · 6.2 KB

File metadata and controls

194 lines (145 loc) · 6.2 KB

Code Generators - Quick Start Guide

This library includes six production-ready code generators that translate ActorSimulation DSL into different languages and frameworks.

Single-File Script Examples

Following Fly.io's single-file Elixir pattern, you can generate complete projects with just Mix.install!

OMNeT++ (Network Simulation)

#!/usr/bin/env elixir
Mix.install([{:gen_server_virtual_time, "~> 0.2.0"}])

simulation = ActorSimulation.new()
  |> ActorSimulation.add_actor(:sender,
      send_pattern: {:periodic, 100, :msg},
      targets: [:receiver])
  |> ActorSimulation.add_actor(:receiver)

{:ok, files} = ActorSimulation.OMNeTPPGenerator.generate(simulation,
  network_name: "SimpleNetwork")

ActorSimulation.OMNeTPPGenerator.write_to_directory(files, "omnetpp_out/")

CAF (C++ Actor Framework)

#!/usr/bin/env elixir
Mix.install([{:gen_server_virtual_time, "~> 0.2.0"}])

simulation = ActorSimulation.new()
  |> ActorSimulation.add_actor(:worker,
      send_pattern: {:rate, 50, :task},
      targets: [:processor])
  |> ActorSimulation.add_actor(:processor)

{:ok, files} = ActorSimulation.CAFGenerator.generate(simulation,
  project_name: "MyActors",
  enable_callbacks: true)  # Callback interfaces!

ActorSimulation.CAFGenerator.write_to_directory(files, "caf_out/")

Pony (Capabilities-Secure)

#!/usr/bin/env elixir
Mix.install([{:gen_server_virtual_time, "~> 0.2.0"}])

simulation = ActorSimulation.new()
  |> ActorSimulation.add_actor(:sender,
      send_pattern: {:burst, 10, 1000, :batch},
      targets: [:receiver])
  |> ActorSimulation.add_actor(:receiver)

{:ok, files} = ActorSimulation.PonyGenerator.generate(simulation,
  project_name: "my_actors",
  enable_callbacks: true)

ActorSimulation.PonyGenerator.write_to_directory(files, "pony_out/")

Phony (Go Actors)

#!/usr/bin/env elixir
Mix.install([{:gen_server_virtual_time, "~> 0.2.0"}])

simulation = ActorSimulation.new()
  |> ActorSimulation.add_actor(:worker,
      send_pattern: {:periodic, 100, :tick},
      targets: [:processor])
  |> ActorSimulation.add_actor(:processor)

{:ok, files} = ActorSimulation.PhonyGenerator.generate(simulation,
  project_name: "my_actors",
  enable_callbacks: true)

ActorSimulation.PhonyGenerator.write_to_directory(files, "phony_out/")

Ractor (Rust Actors)

#!/usr/bin/env elixir
Mix.install([{:gen_server_virtual_time, "~> 0.2.0"}])

simulation = ActorSimulation.new()
  |> ActorSimulation.add_actor(:producer,
      send_pattern: {:rate, 100, :data},
      targets: [:consumer])
  |> ActorSimulation.add_actor(:consumer)

{:ok, files} = ActorSimulation.RactorGenerator.generate(simulation,
  project_name: "my_actors",
  enable_callbacks: true)

ActorSimulation.RactorGenerator.write_to_directory(files, "ractor_out/")

VLINGO XOOM (Java Actors)

#!/usr/bin/env elixir
Mix.install([{:gen_server_virtual_time, "~> 0.2.0"}])

simulation = ActorSimulation.new()
  |> ActorSimulation.add_actor(:publisher,
      send_pattern: {:periodic, 100, :event},
      targets: [:subscriber])
  |> ActorSimulation.add_actor(:subscriber)

{:ok, files} = ActorSimulation.VlingoGenerator.generate(simulation,
  project_name: "my-actors",
  group_id: "com.example",
  enable_callbacks: true)

ActorSimulation.VlingoGenerator.write_to_directory(files, "vlingo_out/")

Complete Examples

See the repository's examples/ directory for complete single-file scripts:

Comparison

Generator Purpose Output Key Feature
OMNeT++ Network simulation NED + C++ GUI tools, INET framework
CAF Production actors C++ + Catch2 Callback interfaces
Pony Safe concurrency Type-safe actors Data-race freedom
Phony Go actors Go + tests Zero-allocation messaging
Ractor Rust actors Rust + Cargo Gen_server-inspired, OTP-style supervision
VLINGO Java actors Java + Maven Protocol actors, type-safe

Development Workflow

  1. Prototype in Elixir (fast iteration)
  2. Test with virtual time (deterministic)
  3. Visualize with sequence diagrams
  4. Generate to your target language
  5. Deploy to production

Why Single-File Scripts?

Benefits of using Mix.install for code generation:

Portable - One file, no setup required
Reproducible - Same input = same output
Shareable - GitHub gist, email, anywhere
Isolated - No impact on your main projects
Fast - Generate code in seconds

Perfect for:

  • Bug reports with minimal examples
  • Quick prototyping
  • CI/CD pipelines
  • Teaching and demos

Learn More

Next Steps

  1. Try a single-file example
  2. Choose your target framework
  3. Generate production code
  4. Customize via callbacks
  5. Deploy with confidence!