defmodule BitcoinLib.Script.Opcodes.Arithmetic.Within do
@moduledoc """
Based on https://en.bitcoin.it/wiki/Script
Word OP_WITHIN
Opcode 165
Hex 0xa5
Input x min max
Output out
Returns 1 if x is within the specified range (left-inclusive), 0 otherwise.
"""
@behaviour BitcoinLib.Script.Opcode
defstruct []
alias BitcoinLib.Script.Opcodes.Arithmetic.Within
@type t :: Within
@value 0xA5
@doc """
Returns 0xa5
## Examples
iex> BitcoinLib.Script.Opcodes.Arithmetic.Within.v()
0xa5
"""
@spec v() :: 0xA5
def v do
@value
end
@doc """
Returns <<0xa5>>
## Examples
iex> BitcoinLib.Script.Opcodes.Arithmetic.Within.encode()
<<0xa5>>
"""
@spec encode() :: <<_::8>>
def encode() do
<<@value::8>>
end
@doc """
Returns 1 if x is within the specified range (left-inclusive), 0 otherwise.
## Examples
iex> BitcoinLib.Script.Opcodes.Arithmetic.Within.execute(
...> %BitcoinLib.Script.Opcodes.Arithmetic.Within{},
...> [5, 3, 6, 7]
...> )
{:ok, [1, 7]}
"""
@spec execute(Within.t(), list()) :: {:ok, list()}
def execute(%Within{}, [first, second, third] ++ remaining) do
case first >= second && first < third do
true -> {:ok, [1 | remaining]}
false -> {:ok, [0 | remaining]}
end
end
end