Funkin/source/funkin/util/SortUtil.hx

80 lines
2.7 KiB
Haxe
Raw Normal View History

package funkin.util;
2022-01-26 14:19:57 -05:00
2022-02-23 16:49:54 -05:00
#if !macro
import flixel.FlxBasic;
2022-01-26 14:19:57 -05:00
import flixel.util.FlxSort;
2022-02-23 16:49:54 -05:00
#end
2023-06-22 01:41:01 -04:00
import funkin.play.notes.NoteSprite;
2022-01-26 14:19:57 -05:00
class SortUtil
{
/**
* You can use this function in FlxTypedGroup.sort() to sort FlxObjects by their z-index values.
* The value defaults to 0, but by assigning it you can easily rearrange objects as desired.
*/
public static inline function byZIndex(Order:Int, Obj1:FlxBasic, Obj2:FlxBasic):Int
{
if (Obj1 == null || Obj2 == null) return 0;
return FlxSort.byValues(Order, Obj1.zIndex, Obj2.zIndex);
}
/**
* Given two Notes, returns 1 or -1 based on whether `a` or `b` has an earlier strumtime.
2023-06-08 16:30:45 -04:00
*
* @param order Either `FlxSort.ASCENDING` or `FlxSort.DESCENDING`
*/
2023-06-22 01:41:01 -04:00
public static inline function byStrumtime(order:Int, a:NoteSprite, b:NoteSprite)
{
2023-06-22 01:41:01 -04:00
return FlxSort.byValues(order, a.noteData.time, b.noteData.time);
}
2023-07-19 01:29:43 -04:00
/**
* Sort predicate for sorting strings alphabetically.
* @param a The first string to compare.
* @param b The second string to compare.
2023-07-19 01:29:43 -04:00
*/
public static function alphabetically(a:String, b:String):Int
2023-07-19 01:29:43 -04:00
{
a = a.toUpperCase();
b = b.toUpperCase();
2023-07-19 01:29:43 -04:00
// Sort alphabetically. Yes that's how this works.
return a == b ? 0 : a > b ? 1 : -1;
2023-07-19 01:29:43 -04:00
}
/**
* Sort predicate which sorts two strings alphabetically, but prioritizes a specific string first.
* Example usage: `array.sort(defaultThenAlphabetical.bind('test'))` will sort the array so that the string 'test' is first.
* @param a The first string to compare.
* @param b The second string to compare.
* @param defaultValue The value to prioritize.
*/
public static function defaultThenAlphabetically(a:String, b:String, defaultValue:String):Int
{
if (a == b) return 0;
if (a == defaultValue) return 1;
if (b == defaultValue) return -1;
return alphabetically(a, b);
}
/**
* Sort predicate which sorts two strings alphabetically, but prioritizes a specific string first.
* Example usage: `array.sort(defaultsThenAlphabetical.bind(['test']))` will sort the array so that the string 'test' is first.
* @param a The first string to compare.
* @param b The second string to compare.
* @param defaultValues The values to prioritize.
*/
public static function defaultsThenAlphabetically(a:String, b:String, defaultValues:Array<String>):Int
{
if (a == b) return 0;
if (defaultValues.contains(a) && defaultValues.contains(b))
{
// Sort by index in defaultValues
return defaultValues.indexOf(a) - defaultValues.indexOf(b);
};
if (defaultValues.contains(a)) return 1;
if (defaultValues.contains(b)) return -1;
return alphabetically(a, b);
}
2022-01-26 14:19:57 -05:00
}