defmodule BitcoinLib.Script.Opcodes.Arithmetic.BoolOr do @moduledoc """ Based on https://en.bitcoin.it/wiki/Script Word OP_BOOLOR Opcode 155 Hex 0x9b Input a b Output out If a or b is not 0, the output is 1. Otherwise 0. """ @behaviour BitcoinLib.Script.Opcode defstruct [] alias BitcoinLib.Script.Opcodes.Arithmetic.BoolOr @value 0x9B @doc """ Returns 0x9b ## Examples iex> BitcoinLib.Script.Opcodes.Arithmetic.BoolOr.v() 0x9b """ @spec v() :: 0x9B def v do @value end @doc """ Returns <<0x9b>> ## Examples iex> BitcoinLib.Script.Opcodes.Arithmetic.BoolOr.encode() <<0x9b>> """ @spec encode() :: <<_::8>> def encode() do <<@value::8>> end @doc """ If a or b is not 0, the output is 1. Otherwise 0. ## Examples iex> BitcoinLib.Script.Opcodes.Arithmetic.BoolOr.execute( ...> %BitcoinLib.Script.Opcodes.Arithmetic.BoolOr{}, ...> [0, 3, 1] ...> ) {:ok, [1, 1]} """ @spec execute(%BoolOr{}, list()) :: {:ok, list()} def execute(%BoolOr{}, [first, second] ++ remaining) do or_result = case first != 0 || second != 0 do true -> 1 false -> 0 end {:ok, [or_result | remaining]} end end