Skip to content

Global Function

Problem

Your design calls for a global function, but Pony doesn’t have them.

Solution

Use a primitive.

primitive Doubler
  fun apply(num: U64): U64 =>
    num * 2

Discussion

Primitives serve a couple of different purposes in Pony. Here, we are using a primitive like a global function. Any place in our codebase, we can use Doubler like so:

Doubler(U64(1))

Regular Pony package rules still apply, so the package that Doubler is a part of needs to be imported, but otherwise, you can use a primitive with an apply method much as you would global functions in a language like C.

Further, you can use a primitive to namespace several “globally accessible functions.” Here’s an example from the Pony standard library:

primitive Nanos
  """
  Collection of utility functions for converting various durations of time
  to nanoseconds, for passing to other functions in the time package.
  """
  fun from_seconds(t: U64): U64 =>
    t * 1_000_000_000

  fun from_millis(t: U64): U64 =>
    t * 1_000_000

  fun from_micros(t: U64): U64 =>
    t * 1_000

  fun from_seconds_f(t: F64): U64 =>
    (t * 1_000_000_000).trunc().u64()

  fun from_millis_f(t: F64): U64 =>
    (t * 1_000_000).trunc().u64()

  fun from_micros_f(t: F64): U64 =>
    (t * 1_000).trunc().u64()

  fun from_wall_clock(wall: (I64, I64)): U64 =>
    ((wall._1 * 1000000000) + wall._2).u64()

In general, if you are looking to do anything that might be classified as a static function or a utility function in another language, you probably want to use a Primitive in Pony.