# Creates a new `Spectator::ExampleHooks` instance.
# All arguments are optional,
# only specify the sets of hooks that are needed.
# The hooks that aren't specified will be left empty.
def new_hooks(
  before_all = [] of ->,
  before_each = [] of ->,
  after_all = [] of ->,
  after_each = [] of ->,
  around_each = [] of Proc(Nil) ->
)
  Spectator::ExampleHooks.new(before_all, before_each,
    after_all, after_each, around_each)
end

# Creates a new `Spectator::ExampleHooks` instance.
# All arguments are optional,
# only specify a hook for the types that are needed.
# The hooks that aren't specified will be left empty.
def new_hooks(
  before_all : Proc(Nil)? = nil,
  before_each : Proc(Nil)? = nil,
  after_all : Proc(Nil)? = nil,
  after_each : Proc(Nil)? = nil,
  around_each : Proc(Proc(Nil), Nil)? = nil
)
  new_hooks(
    before_all ? [before_all] : [] of ->,
    before_each ? [before_each] : [] of ->,
    after_all ? [after_all] : [] of ->,
    after_each ? [after_each] : [] of ->,
    around_each ? [around_each] : [] of Proc(Nil) ->
  )
end

# Creates a new `Spectator::ExampleConditions` instance.
# All arguments are optional,
# only specify the sets of conditions that are needed.
# The conditions that aren't specified will be left empty.
def new_conditions(
  pre = [] of ->,
  post = [] of ->
)
  Spectator::ExampleConditions.new(pre, post)
end

# Creates a new `Spectator::ExampleConditions` instance.
# All arguments are optional,
# only specify a condition for the types that are needed.
# The conditions that aren't specified will be left empty.
def new_conditions(
  pre : Proc(Nil)? = nil,
  post : Proc(Nil)? = nil
)
  new_conditions(
    pre ? [pre] : [] of ->,
    post ? [post] : [] of ->
  )
end