VerseIsland
Feed Learn Leaderboard Guides Reference Explore Search Docs Verse Library
Sign in
Feed Learn 📖 Codex Leaderboard Guides Reference Explore Search Docs Verse Library
Verse Library › Building & Props
Browse Verse Library

Library

Devices 634
  • Devices171
  • Triggers & Logic118
  • UI & HUD40
  • Audio39
  • Items & Inventory29
  • Events27
  • Scoring & Objectives25
  • Spawning19
  • Classes & Interfaces18
  • Game Modes17
  • Props & Meshes14
  • Variables & Mutability12
  • Player Management11
  • Modules & Structure10
  • Round Flow8
  • Animation6
  • Concurrency6
  • Functions6
  • Getting Started6
  • Teams & Classes6
  • NPCs & AI5
  • Tutorials5
  • VFX & Particles5
  • Arrays & Maps4
  • Cameras4
  • Debugging4
  • Control Flow3
  • Cinematics2
  • Other2
  • Persistence2
  • Scene Graph2
  • Structs & Enums2
  • Building1
  • Physics1
  • Publishing & Islands1
  • Syntax & Types1
  • Vehicles1
  • Weapons1
Verse Language 257
  • Control Flow35
  • Functions26
  • Arrays & Maps25
  • Classes & Interfaces22
  • Variables & Mutability22
  • Concurrency21
  • Syntax & Types18
  • Modules & Structure12
  • Debugging8
  • Devices8
  • Events7
  • Player Management6
  • Structs & Enums6
  • Triggers & Logic6
  • Game Modes5
  • Failure & Options4
  • Scene Graph4
  • UI & HUD4
  • Getting Started3
  • Round Flow3
  • Spawning3
  • VFX & Particles3
  • Reference2
  • Animation1
  • Best Practices1
  • Other1
  • Props & Meshes1
Materials/VFX 154
  • Triggers & Logic27
  • UI & HUD17
  • Devices16
  • VFX & Particles14
  • Props & Meshes11
  • Scoring & Objectives9
  • Game Modes7
  • Items & Inventory7
  • Functions6
  • Arrays & Maps5
  • Animation3
  • Cinematics3
  • Classes & Interfaces3
  • Control Flow3
  • Events3
  • Modules & Structure3
  • Round Flow3
  • Spawning3
  • Getting Started2
  • Scene Graph2
  • Variables & Mutability2
  • Concurrency1
  • Persistence1
  • Player Management1
  • Structs & Enums1
  • Syntax & Types1
General 153
  • Devices22
  • Events20
  • Triggers & Logic20
  • Classes & Interfaces10
  • Variables & Mutability8
  • Round Flow6
  • Scoring & Objectives6
  • UI & HUD6
  • Functions5
  • Player Management5
  • Game Modes4
  • Getting Started4
  • Props & Meshes4
  • Control Flow3
  • Syntax & Types3
  • VFX & Particles3
  • Arrays & Maps2
  • Best Practices2
  • NPCs & AI2
  • Other2
  • Physics2
  • Scene Graph2
  • Spawning2
  • Structs & Enums2
  • Tutorials2
  • Building1
  • Cameras1
  • Cinematics1
  • Failure & Options1
  • Items & Inventory1
  • Teams & Classes1
Player 133
  • Player Management22
  • Teams & Classes19
  • Classes & Interfaces12
  • Devices11
  • Events9
  • Persistence7
  • Triggers & Logic7
  • Arrays & Maps6
  • Functions4
  • Game Modes4
  • Items & Inventory4
  • Round Flow4
  • Debugging3
  • Getting Started3
  • Modules & Structure3
  • Concurrency2
  • Control Flow2
  • Scoring & Objectives2
  • Spawning2
  • Structs & Enums2
  • Physics1
  • Props & Meshes1
  • UI & HUD1
  • Variables & Mutability1
  • Weapons1
Building & Props 131
  • Variables & Mutability15
  • Props & Meshes14
  • Triggers & Logic12
  • Classes & Interfaces10
  • Devices10
  • UI & HUD10
  • Events7
  • Teams & Classes7
  • Animation5
  • Building5
  • Functions5
  • VFX & Particles5
  • Structs & Enums4
  • Control Flow3
  • Game Modes3
  • Items & Inventory3
  • Round Flow3
  • Scene Graph3
  • Arrays & Maps2
  • Concurrency2
  • Reference2
  • Modules & Structure1
NPCs & AI 76
  • NPCs & AI35
  • Spawning7
  • Animation5
  • Variables & Mutability5
  • Classes & Interfaces3
  • Debugging3
  • UI & HUD3
  • Audio2
  • Concurrency2
  • Game Modes2
  • Props & Meshes2
  • Triggers & Logic2
  • Devices1
  • Functions1
  • Getting Started1
  • Reference1
  • VFX & Particles1
Spawning 73
  • Spawning31
  • Events7
  • Concurrency6
  • Player Management6
  • Vehicles5
  • Props & Meshes4
  • Devices3
  • Scene Graph3
  • Items & Inventory2
  • Teams & Classes2
  • Control Flow1
  • Publishing & Islands1
  • Reference1
  • Scoring & Objectives1
Cinematics 71
  • Cameras19
  • Cinematics15
  • Devices11
  • Audio5
  • Animation4
  • Triggers & Logic4
  • Functions2
  • Game Modes2
  • UI & HUD2
  • Classes & Interfaces1
  • Concurrency1
  • Control Flow1
  • Items & Inventory1
  • Modules & Structure1
  • Scene Graph1
  • Templates1
UI 57
  • UI & HUD35
  • Devices5
  • Scoring & Objectives4
  • Classes & Interfaces3
  • Round Flow2
  • Scene Graph2
  • Arrays & Maps1
  • Props & Meshes1
  • Structs & Enums1
  • Templates1
  • Triggers & Logic1
  • Variables & Mutability1
Scene Graph 40
  • Scene Graph9
  • Items & Inventory8
  • Classes & Interfaces3
  • Events3
  • Props & Meshes3
  • Functions2
  • Arrays & Maps1
  • Building1
  • Control Flow1
  • Debugging1
  • Modules & Structure1
  • Player Management1
  • Reference1
  • Structs & Enums1
  • Syntax & Types1
  • Triggers & Logic1
  • UI & HUD1
  • VFX & Particles1
Vehicles 38
  • Spawning11
  • Devices7
  • Vehicles7
  • Props & Meshes4
  • Functions2
  • Game Modes2
  • Failure & Options1
  • Items & Inventory1
  • Reference1
  • Teams & Classes1
  • Tutorials1
Tutorials 37
  • Game Modes6
  • Triggers & Logic5
  • Classes & Interfaces4
  • Events4
  • Props & Meshes3
  • Building2
  • Devices2
  • Items & Inventory2
  • Scoring & Objectives2
  • Animation1
  • Arrays & Maps1
  • Cameras1
  • Concurrency1
  • Physics1
  • Player Management1
  • Structs & Enums1
Weapons 30
  • Game Modes6
  • Weapons6
  • Devices5
  • Items & Inventory3
  • Scoring & Objectives3
  • Spawning2
  • Teams & Classes2
  • Best Practices1
  • Functions1
  • Triggers & Logic1
Items 28
  • Items & Inventory23
  • Devices2
  • Triggers & Logic2
  • Spawning1
Assets 20
  • Modules & Structure6
  • Arrays & Maps3
  • Functions3
  • Scene Graph2
  • Best Practices1
  • Devices1
  • Events1
  • Failure & Options1
  • Physics1
  • Variables & Mutability1
Animation 19
  • Animation10
  • Variables & Mutability4
  • Devices1
  • Player Management1
  • Props & Meshes1
  • Scene Graph1
  • Syntax & Types1
Release Notes 17
  • Classes & Interfaces5
  • Modules & Structure3
  • Concurrency2
  • Control Flow2
  • Variables & Mutability2
  • Debugging1
  • Devices1
  • Items & Inventory1
Input & Controls 16
  • Functions4
  • UI & HUD3
  • Control Flow2
  • Animation1
  • Arrays & Maps1
  • Cinematics1
  • Debugging1
  • Devices1
  • Events1
  • Items & Inventory1
Publishing 8
  • Control Flow5
  • Arrays & Maps1
  • Devices1
  • Syntax & Types1
Audio 7
  • Audio5
  • UI & HUD2
Landscape 7
  • Other4
  • VFX & Particles2
  • Scene Graph1
Persistence 6
  • Structs & Enums2
  • Items & Inventory1
  • Persistence1
  • Publishing & Islands1
  • Variables & Mutability1
Physics 5
  • Functions2
  • Classes & Interfaces1
  • Devices1
  • Syntax & Types1
Creator Economy 3
  • Publishing & Islands2
  • Modules & Structure1
Discovery 3
  • Devices1
  • NPCs & AI1
  • Structs & Enums1
Editor & Project 3
  • Other1
  • Props & Meshes1
  • Tutorials1

Heaps and Heapsort Algorithms

Module — 2 files
These files compile together (same module folder).
file_1.verse
Arrays<public> := module:

    <# Array utility to swap the elements contained in indices I and J #>
    (Array:[]t where t:type).Swap<public>(FirstIndex:int, SecondIndex:int)<decides><transacts>:[]t =
        ArrayTemp := Array.ReplaceElement[FirstIndex, Array[SecondIndex]]
        return ArrayTemp.ReplaceElement[SecondIndex, Array[FirstIndex]]


Heaps<public> := module:

    using { Arrays }

    MinHeap<public>(t:type) := class<concrete>:

        # Properties 
        Heap<internal>:[]t = array{}
        Size<internal>:int = 0
        LessThan<internal>:?type{_(:t,:t)<decides><transacts>:void} = false
        Equivalent<internal>:?type{_(:t,:t)<decides><transacts>:void} = false

        # Get the size of the heap array
        GetSize<public>()<transacts>:int =
            Size

        # Get a copy of the heap array 
        GetHeap<public>()<transacts>:[]t =
            Heap

        # Get the less than comparison function
        # Fails if no less than specified, succeeds and returns the function if specified
        GetLessThan<public>()<decides><transacts>:type{_(:t,:t)<decides><transacts>:void} =
            LessThan?

        # Get the equivalent comparison function
        # Fails if no equivalent specified, succeeds and returns the function if specified
        GetEquivalent<public>()<decides><transacts>:type{_(:t,:t)<decides><transacts>:void} =
            Equivalent?
   
        # Get the minimum value in the heap
        # Fails if heap is empty, succeeds and returns minimum value otherwise
        GetMin<public>()<decides><transacts>: t =
            Heap[0]

        # Get the index in the heap array of the element with the given key
        # Fails if key is not found, succeeds and returns the index key is found
        GetIndex<public>(Key:t)<decides><transacts>:int =
            var ReturnIndex:?int = false
            var LoopIndex:int = 0
            # Traverse the array linearly to find the index of the provided key
            loop:
                if (LoopIndex = Size):
                    break
                else:
                    if (Equivalent?[Heap[LoopIndex], Key]):
                        set ReturnIndex = option{LoopIndex}
                        break
                set LoopIndex += 1
            ReturnIndex?

        # Get the element key of the element at index ElementIndex
        # Fails if ElementIndex is either negative or greater than the size of the array, succeeds otherwise
        GetKey<public>(ElementIndex:int)<decides><transacts>:t =
            Heap[ElementIndex]

        # Get the index of the parent of the element at index ElementIndex
        # Should not fail
        Parent<public>(ElementIndex:int)<decides><transacts>:int =
            Floor((ElementIndex - 1) / 2)

        # Get the index of the left child of the element at index ElementIndex
        Left<public>(ElementIndex:int)<transacts>: int =
            (2 * ElementIndex) + 1

        # Get the index of the right child of the element at index ElementIndex
        Right<public>(ElementIndex: int)<transacts>:int =
            (2 * ElementIndex) + 2

        # Extract the minimum value from the Heap and return resultant Heap 
        ExtractMin<public>()<decides><transacts>:tuple(MinHeap(t), t) =
            # Get the minimum value, move the last value in the heap to the front of the heap array
            HeapMin := Self.GetMin[]
            var NewHeapArr:[]t = Self.Heap
            NewRoot := NewHeapArr[NewHeapArr.Length - 1]
            set NewHeapArr[0] = NewRoot
            NewArrTemp := NewHeapArr.RemoveElement[NewHeapArr.Length - 1]
            set NewHeapArr = NewArrTemp
            ReturnHeap:MinHeap(t) = MinHeap(t):
                MakeMinHeap<constructor>(Self)
                Heap := NewHeapArr
                Size := NewHeapArr.Length
            # Heapify the first value in the array and return this new heap and the previous minimum value
            if (ReturnHeap.GetSize() > 0):
                (ReturnHeap.Heapify[0], HeapMin)
            else:
                (ReturnHeap, HeapMin)

        # Decrease the value of the key located in position Index to value Key and return resultant Heap 
        # Succeeds if `0 <= ElementIndex < Self.Size`
        DecreaseKey<public>(ElementIndex:int, Key:t)<decides><transacts>:MinHeap(t) =
            # Decrease the value of the element in index ElementIndex to the new value Key
            var CurrentKey:int = ElementIndex
            var NewHeapArr:[]t = Self.Heap
            set NewHeapArr[ElementIndex] = Key
            # Decreaseing the value of the element's key might break the heap property
            # Since the Key is decreased, the element might need to move higher in the tree
            # Start with the current position of the element and move up the tree until
            # the heap property is satisfied
            loop:
                if:
                    CurrentKey = 0 or
                    LessThan?[NewHeapArr[Parent[CurrentKey]], NewHeapArr[CurrentKey]] or
                    Equivalent?[NewHeapArr[Parent[CurrentKey]], NewHeapArr[CurrentKey]]
                then:
                    break
                else:
                    if (KeyTmp := Parent[CurrentKey], HeapArrTemp := NewHeapArr.Swap[CurrentKey, KeyTmp]):
                        set NewHeapArr = HeapArrTemp
                        set CurrentKey = KeyTmp
                    else:
                        break
            MinHeap(t):
                MakeMinHeap<constructor>(Self)
                Heap := NewHeapArr

        # Delete the key at the given index while maintaining the Heap Property and return resultant heap
        # Succeeds if `0 <= ElementIndex < Self.Size`
        DeleteKeyAtIndex<public>(ElementIndex:int)<decides><transacts>:MinHeap(t) =
            # Decrease the value of the key at Index to the minimum value, extract that value, then return the resulting heap
            Self.DecreaseKey[ElementIndex, Self.GetMin[]].ExtractMin[](0)

        # Delete the first instance of this Key from the heap and return resultant heap 
        # Fails if the heap does not contain an element with key Key
        DeleteKey<public>(Key:t)<decides><transacts>:MinHeap(t) =
            Self.DeleteKeyAtIndex[Self.GetIndex[Key]]

        # Insert the given Key into the heap while maintaining the Heap Property and return resultant heap
        InsertKey<public>(Key:t)<transacts>:MinHeap(t) =
            # Insert the new key at the end of the heap's array
            var NewHeapArr:[]t = Self.Heap + array{Key}
            var ElementIndex:int = NewHeapArr.Length - 1
            # Traverse the heap tree from the bottom up starting with the newly inserted element
            # swapping the newly inserted element with its parent if it violates the heap property
            # Terminate this process and break the loop once the heap property is satisfied
            loop:
                if:
                    ElementIndex > 0
                    ParentIndex := Parent[ElementIndex]
                    Self.LessThan?[NewHeapArr[ElementIndex], NewHeapArr[ParentIndex]]
                    HeapArrTemp := NewHeapArr.Swap[ParentIndex, ElementIndex]
                then:
                    set NewHeapArr = HeapArrTemp
                    set ElementIndex = ParentIndex
                else:
                    break
            MinHeap(t):
                MakeMinHeap<constructor>(Self)
                Heap := NewHeapArr
                Size := NewHeapArr.Length

        # Construct a heap by positioning the element in index i in the proper location to maintain heap property
        # Heapify correctly places the element at index ElementIndex in the subtree rooted at index ElementIndex
        # Succeeds if `0 <= ElementIndex < Self.Size`
        Heapify<public>(ElementIndex:int)<decides><transacts>:MinHeap(t) =
            var Smallest:int = ElementIndex
            var NewHeapArr:[]t = array{}
            SmallestElement:t = Self.Heap[ElementIndex]
            LeftNode:int = Left(ElementIndex)
            RightNode:int = Right(ElementIndex)
            # If the element at index ElementIndex has a left child and the left child is smaller
            # update the index of the smallest element to the left child index
            if (LeftNode < Size, LessThan?[Self.Heap[LeftNode], SmallestElement]):
                set Smallest = LeftNode
            # If the element at the index of the right child is smaller than the index of the smaller 
            # of ElementIndex and the left child update the index of the smallest element to the right child index
            if (RightNode < Size, LessThan?[Self.Heap[RightNode], Self.Heap[Smallest]]):
                set Smallest = RightNode
            # If the smallest element index is not the element that we started with, swap the element with whichever
            # child was determined to be smaller, create a new heap after the swap, then heapfiy the
            # subtree rooted at the smaller of the two children
            if (Smallest <> ElementIndex, HeapArrTemp := Self.Heap.Swap[Smallest, ElementIndex]):
                set NewHeapArr = HeapArrTemp
                NewHeap := MinHeap(t):
                    MakeMinHeap<constructor>(Self)
                    Heap := NewHeapArr
                return NewHeap.Heapify[Smallest]
            else:
                return Self

    # Construct a heap from an array, ordering function, and equivalence function
    MakeMinHeap<public><constructor>(
        HeapIn:[]t,
        LessThan:type{_(:t,:t)<decides><transacts>:void},
        Equivalent:type{_(:t,:t)<decides><transacts>:void} where t:type
    )<transacts> := MinHeap(t):
        # Define variables for the block portion of the constructor
        let:
            var NewHeapArr: MinHeap(t) = MinHeap(t):
                Heap := HeapIn
                Size := HeapIn.Length
                LessThan := option{LessThan}
                Equivalent := option{Equivalent}
            var Start:int = 0
        # Heapify the array starting at the bottom and working up the tree to the root
        block:
            if (StartTemp := Floor(HeapIn.Length / 2), set Start = StartTemp):
                for (Index := 0..Start):
                    if (HeapArrTemp := NewHeapArr.Heapify[Start - Index]):
                        set NewHeapArr = HeapArrTemp
        Heap := NewHeapArr.GetHeap()
        Size := HeapIn.Length
        LessThan := option{LessThan}
        Equivalent := option{Equivalent}

    # Construct a copy of a heap from an existing heap
    MakeMinHeap<public><constructor>(HeapIn: MinHeap(t) where t:type)<transacts> := MinHeap(t):
        Heap := HeapIn.Heap
        Size := HeapIn.Size
        LessThan := HeapIn.LessThan
        Equivalent := HeapIn.Equivalent

    # Heapsort array of any type
    Heapsort<public>(
        ArrayIn:[]t,
        LessThan:type{_(:t,:t)<decides><transacts>:void},
        Equivalent:type{_(:t,:t)<decides><transacts>:void} where t:type
    )<transacts>:[]t =
        # Construct a min heap from the input array
        var NewHeapArr:MinHeap(t) = MakeMinHeap(ArrayIn, LessThan, Equivalent)
        var ReturnArray:[]t = array{}
        # Extract the minimum of the array until the array is empty
        for (Element : NewHeapArr.GetHeap()):
            if (HeapMinTuple := NewHeapArr.ExtractMin[]):
                set NewHeapArr = HeapMinTuple(0)
                set ReturnArray += array{HeapMinTuple(1)}
        ReturnArray
heap_test.verse
using { /Fortnite.com/Devices }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /Verse.org/Simulation }
using { Heaps }

log_heap_test := class(log_channel):

# A project-wide "Logger" to print messages from functions that are not in a class with a log
ProjectLog<public>(Message:[]char, ?Level:log_level = log_level.Normal)<transacts>:void=
    Logger := log{Channel := log_heap_test}
    Logger.Print(Message, ?Level := Level)

# Heaps Tests
heap_test := class(creative_device):

    (Array:[]t).IsSorted<public>(
        LessThan:type{_(:t,:t)<decides><transacts>:void},
        Equivalent:type{_(:t,:t)<decides><transacts>:void} where t:type
    )<decides><transacts>:void =
        for:
            Index -> Element : Array
            NextElement := Array[Index + 1]
        do:
            LessThan[Element, NextElement] or Equivalent[Element, NextElement]


    (Array:[]t).LogStringIsSorted<public>(
        LessThan:type{_(:t,:t)<decides><transacts>:void},
        Equivalent:type{_(:t,:t)<decides><transacts>:void} where t:type
    )<transacts>:string =
        if(Array.IsSorted[LessThan, Equivalent]):
            "Pass"
        else:
            "Fail"


    (Heap:MinHeap(t) where t:type).MaintainsHeapProperty<public>()<decides><transacts>:void =
        for:
            Element : Heap.GetHeap()
            LessThanFunc := Heap.GetLessThan[]
            EquivalentFunc := Heap.GetEquivalent[]
            Index := Heap.GetIndex[Element]
            ParentIndex := Heap.Parent[Index]
            ParentElement := Heap.GetHeap()[ParentIndex]
        do:
            LessThanFunc[ParentElement, Element] or EquivalentFunc[ParentElement, Element]


    (Heap:MinHeap(t) where t:type).LogStringMaintainsHeapProperty<public>(Name:string)<transacts>:string =
        if (Heap.MaintainsHeapProperty[]):
            "Pass"
        else:
            "Fail"


    RunHeapTest(
        Description:string, 
        Heap:MinHeap(t),
        ArrayToString:type{_(:[]t)<transacts>:string} where t:type
    )<decides><transacts>: void =
        ProjectLog("Testing: {Description}")
        ProjectLog("Heap: {ArrayToString(Heap.GetHeap())}")
        ProjectLog("Maintains Heap Property? {Heap.LogStringMaintainsHeapProperty()}")
        Heap.MaintainsHeapProperty[]


    RunArrayTest(
        Description:string,
        OriginalArray:[]t,
        Array:[]t,
        LessThan:type{_(:t,:t)<decides><transacts>:void},
        Equivalent:type{_(:t,:t)<decides><transacts>:void},
        ArrayToString:type{_(:[]t)<transacts>:string} where t:type
    )<decides><transacts>: void =
        ProjectLog("Testing: {Description}")
        ProjectLog("Array: {ArrayToString(OriginalArray)}")
        ProjectLog("Result: {ArrayToString(Array)}")
        ProjectLog("Is array sorted? {Array.LogStringIsSorted(LessThan, Equivalent)}")
        Array.IsSorted[LessThan, Equivalent]


    # Runs when the device is started in a running game
    OnBegin<override>()<suspends>:void=


        # Set up different test types
        IntegerArray: []int = array:
            16
            14
            121
            10
            7
            9
            3
            144
            8
            -24
            2
            4
            91
            -12
            -100
            1
            37
            492
            8


        StringArray: []string = array:
            "Dog"
            "Animal"
            "Keys"
            "Algorithms"
            "I"
            "Downloading"
            "Math"
            "Conceptualizing"
            "Artist"
            "Topological"
            "Probabilistic"


        FloatArray: []float = array:
            1.2
            3.4
            7.9
            2.1
            1.0
            5.0
            -10.2
            -20.2
            72.4
            98.123
            0.0


        ComplexArray: []Types.Complex = array:
            Types.Complex{ Real := 0.0, Imaginary := 0.0},
            Types.Complex{ Real := 1.0, Imaginary := 0.0},
            Types.Complex{ Real := -1.2, Imaginary := 1.2},
            Types.Complex{ Real := -4.0, Imaginary := 0.0},
            Types.Complex{ Real := 0.0, Imaginary := 1.0},
            Types.Complex{ Real := 7.0, Imaginary := 2.0},
            Types.Complex{ Real := 1.2, Imaginary := 3.1},
            Types.Complex{ Real := -3.145, Imaginary := 2.178},
            Types.Complex{ Real := -4.0, Imaginary := -10.0},
            Types.Complex{ Real := 20.0, Imaginary := 1.0}


        # Build heaps from test types
        var IntegerHeap: MinHeap(int) = MakeMinHeap(IntegerArray, Comparison.IntegerLessThan, Comparison.IntegerEquivalent)
        var FloatHeap: MinHeap(float) = MakeMinHeap(FloatArray, Comparison.FloatLessThan, Comparison.FloatEquivalent)
        var StringHeap: MinHeap(string) = MakeMinHeap(StringArray, Comparison.StringLessThan, Comparison.StringEquivalent)
        var ComplexHeap: MinHeap(Types.Complex) = MakeMinHeap(ComplexArray, Comparison.ComplexLessThan, Comparison.ComplexEquivalent)

        
        # Perform tests to determine if heaps constructed maintain heap property
        # Also test various heap methods and heapsort
        if:
            RunHeapTest["Make MinHeap from Integer Array", IntegerHeap, StringUtilities.IntegerArrayToString]
            RunHeapTest["Make MinHeap from Float Array", FloatHeap, StringUtilities.FloatArrayToString]
            RunHeapTest["Make MinHeap from String Array", StringHeap, StringUtilities.StringArrayToString]
            RunHeapTest["Make MinHeap from Complex Array", ComplexHeap, StringUtilities.ComplexArrayToString]

            set IntegerHeap = IntegerHeap.InsertKey(14)

            FloatHeapTuple := FloatHeap.ExtractMin[]
            set FloatHeap = FloatHeapTuple(0)

            KeyToDelete := Types.Complex{ Real := -4.0, Imaginary := -10.0}
            ComplexHeapTemp := ComplexHeap.DeleteKey[KeyToDelete]
            set ComplexHeap = ComplexHeapTemp

            RunHeapTest["Insert Key \"14\" into Integer Heap", IntegerHeap, StringUtilities.IntegerArrayToString]
            RunHeapTest["Extract minimum from Float Heap", FloatHeap, StringUtilities.FloatArrayToString]
            RunHeapTest["Delete key \"{KeyToDelete.DebugString()}\" from Complex Heap", ComplexHeap, StringUtilities.ComplexArrayToString]

            SortedIntegers := Heapsort(IntegerArray, Comparison.IntegerLessThan, Comparison.IntegerEquivalent)
            SortedFloats := Heapsort(FloatArray, Comparison.FloatLessThan, Comparison.FloatEquivalent)
            SortedComplexes := Heapsort(ComplexArray, Comparison.ComplexLessThan, Comparison.ComplexEquivalent)
            SortedStrings := Heapsort(StringArray, Comparison.StringLessThan, Comparison.StringEquivalent)

            RunArrayTest["Sort Integer Array", IntegerArray, SortedIntegers, Comparison.IntegerLessThan, Comparison.IntegerEquivalent, StringUtilities.IntegerArrayToString]
            RunArrayTest["Sort Float Array", FloatArray, SortedFloats, Comparison.FloatLessThan, Comparison.FloatEquivalent, StringUtilities.FloatArrayToString]
            RunArrayTest["Sort String Array", StringArray, SortedStrings, Comparison.StringLessThan, Comparison.StringEquivalent, StringUtilities.StringArrayToString]
            RunArrayTest["Sort Complex Array", ComplexArray, SortedComplexes, Comparison.ComplexLessThan, Comparison.ComplexEquivalent, StringUtilities.ComplexArrayToString]
        then:
            ProjectLog("All tests passed.")
        else:
            ProjectLog("One or more tests failed.")
Sign in to download module

Copy-paste each file above is always free.

Comments

    Sign in to vote, comment, or suggest an edit. Sign in
    📄
    Source
    @int
    Epic Games Community
    @int

    Created by a member of the Epic Games community. Rights remain with the original author, under Epic's community content terms. Terms ↗

    View original Sources & licensing
    Request removal
    Last updated Jun 23, 2026
    Verse module (2 files)
    Build failed · 59 errors

    Download the full module (zip) from the code panel above.

    Keep exploring
    More in Verse Language · 38 of 106
    Prev
    fortnite rotate about axis
    Next
    fortnite awaitable utils
    Related topics
    • Fortnite Graphs Verse Language
    • Fortnite Merge Sort Verse Language
    • Fortnite API (module declarations) Verse Language
    • UnrealEngine API (module declarations) Verse Language
    • Verse API (module declarations) Verse Language

    Related

    Open in graph →

    Related topics

    • Fortnite Graphs
    • Fortnite Merge Sort
    • Fortnite API (module declarations)
    • UnrealEngine API (module declarations)
    • Verse API (module declarations)
    VerseIsland · an archipelago of Verse & UEFN knowledge
    🗺️ Island atlas Learn Guides History About & Press Sources & Licensing Status

    Not affiliated with Epic Games. Fortnite, UEFN, Unreal Engine, and Verse are trademarks of Epic Games, Inc. Content is attributed to its source — see Sources & Licensing.

    🦜

    Scout · your island guide

    The Isle of Verse