Private/Console/Spinners.psm1

using namespace System

class Spinner {
  [string]$Name
  [TimeSpan]$Interval
  [bool]$IsUnicode
  [string[]]$Frames

  static [Spinner]$Default
  static [Spinner]$Ascii
  static [Spinner]$Dots
  static [Spinner]$Dots2
  static [Spinner]$Dots3
  static [Spinner]$Dots4
  static [Spinner]$Dots5
  static [Spinner]$Dots6
  static [Spinner]$Dots7
  static [Spinner]$Dots8
  static [Spinner]$Dots9
  static [Spinner]$Dots10
  static [Spinner]$Dots11
  static [Spinner]$Dots12
  static [Spinner]$Dots13
  static [Spinner]$Dots14
  static [Spinner]$Dots8Bit
  static [Spinner]$DotsCircle
  static [Spinner]$Sand
  static [Spinner]$Line
  static [Spinner]$Line2
  static [Spinner]$Pipe
  static [Spinner]$SimpleDots
  static [Spinner]$SimpleDotsScrolling
  static [Spinner]$Star
  static [Spinner]$Star2
  static [Spinner]$Flip
  static [Spinner]$Hamburger
  static [Spinner]$GrowVertical
  static [Spinner]$GrowHorizontal
  static [Spinner]$Balloon
  static [Spinner]$Balloon2
  static [Spinner]$Noise
  static [Spinner]$Bounce
  static [Spinner]$BoxBounce
  static [Spinner]$BoxBounce2
  static [Spinner]$Triangle
  static [Spinner]$Binary
  static [Spinner]$Arc
  static [Spinner]$Circle
  static [Spinner]$SquareCorners
  static [Spinner]$CircleQuarters
  static [Spinner]$CircleHalves
  static [Spinner]$Squish
  static [Spinner]$Toggle
  static [Spinner]$Toggle2
  static [Spinner]$Toggle3
  static [Spinner]$Toggle4
  static [Spinner]$Toggle5
  static [Spinner]$Toggle6
  static [Spinner]$Toggle7
  static [Spinner]$Toggle8
  static [Spinner]$Toggle9
  static [Spinner]$Toggle10
  static [Spinner]$Toggle11
  static [Spinner]$Toggle12
  static [Spinner]$Toggle13
  static [Spinner]$Arrow
  static [Spinner]$Arrow2
  static [Spinner]$Arrow3
  static [Spinner]$BouncingBar
  static [Spinner]$BouncingBall
  static [Spinner]$Smiley
  static [Spinner]$Monkey
  static [Spinner]$Hearts
  static [Spinner]$Clock
  static [Spinner]$Earth
  static [Spinner]$Material
  static [Spinner]$Moon
  static [Spinner]$Runner
  static [Spinner]$Pong
  static [Spinner]$Shark
  static [Spinner]$Dqpb
  static [Spinner]$Weather
  static [Spinner]$Christmas
  static [Spinner]$Grenade
  static [Spinner]$Point
  static [Spinner]$Layer
  static [Spinner]$BetaWave
  static [Spinner]$FingerDance
  static [Spinner]$FistBump
  static [Spinner]$SoccerHeader
  static [Spinner]$Mindblown
  static [Spinner]$Speaker
  static [Spinner]$OrangePulse
  static [Spinner]$BluePulse
  static [Spinner]$OrangeBluePulse
  static [Spinner]$TimeTravel
  static [Spinner]$Aesthetic
  static [Spinner]$DwarfFortress

  Spinner([string]$Name) {
    switch ($Name) {
      'Ascii' {
        $this.Name = 'Ascii';
        $this.Interval = [TimeSpan]::FromMilliseconds(100);
        $this.IsUnicode = $true;
        $this.Frames = @('-', '\\', '|', '/', '-', '\\', '|', '/')
        break
      }
      'Dots' {
        $this.Name = 'Dots';
        $this.Interval = [TimeSpan]::FromMilliseconds(80);
        $this.IsUnicode = $true;
        $this.Frames = @('⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏')
        break
      }
      'Dots2' {
        $this.Name = 'Dots2';
        $this.Interval = [TimeSpan]::FromMilliseconds(80);
        $this.IsUnicode = $true;
        $this.Frames = @('⣾', '⣽', '⣻', '⢿', '⡿', '⣟', '⣯', '⣷')
        break
      }
      'Dots3' {
        $this.Name = 'Dots3';
        $this.Interval = [TimeSpan]::FromMilliseconds(80);
        $this.IsUnicode = $true;
        $this.Frames = @('⠋', '⠙', '⠚', '⠞', '⠖', '⠦', '⠴', '⠲', '⠳', '⠓')
        break
      }
      'Dots4' {
        $this.Name = 'Dots4';
        $this.Interval = [TimeSpan]::FromMilliseconds(80);
        $this.IsUnicode = $true;
        $this.Frames = @('⠄', '⠆', '⠇', '⠋', '⠙', '⠸', '⠰', '⠠', '⠰', '⠸', '⠙', '⠋', '⠇', '⠆')
        break
      }
      'Dots5' {
        $this.Name = 'Dots5';
        $this.Interval = [TimeSpan]::FromMilliseconds(80);
        $this.IsUnicode = $true;
        $this.Frames = @('⠋', '⠙', '⠚', '⠒', '⠂', '⠂', '⠒', '⠲', '⠴', '⠦', '⠖', '⠒', '⠐', '⠐', '⠒', '⠓', '⠋')
        break
      }
      'Dots6' {
        $this.Name = 'Dots6';
        $this.Interval = [TimeSpan]::FromMilliseconds(80);
        $this.IsUnicode = $true;
        $this.Frames = @('⠁', '⠉', '⠙', '⠚', '⠒', '⠂', '⠂', '⠒', '⠲', '⠴', '⠤', '⠄', '⠄', '⠤', '⠴', '⠲', '⠒', '⠂', '⠂', '⠒', '⠚', '⠙', '⠉', '⠁')
        break
      }
      'Dots7' {
        $this.Name = 'Dots7';
        $this.Interval = [TimeSpan]::FromMilliseconds(80);
        $this.IsUnicode = $true;
        $this.Frames = @('⠈', '⠉', '⠋', '⠓', '⠒', '⠐', '⠐', '⠒', '⠖', '⠦', '⠤', '⠠', '⠠', '⠤', '⠦', '⠖', '⠒', '⠐', '⠐', '⠒', '⠓', '⠋', '⠉', '⠈')
        break
      }
      'Dots8' {
        $this.Name = 'Dots8';
        $this.Interval = [TimeSpan]::FromMilliseconds(80);
        $this.IsUnicode = $true;
        $this.Frames = @('⠁', '⠁', '⠉', '⠙', '⠚', '⠒', '⠂', '⠂', '⠒', '⠲', '⠴', '⠤', '⠄', '⠄', '⠤', '⠠', '⠠', '⠤', '⠦', '⠖', '⠒', '⠐', '⠐', '⠒', '⠓', '⠋', '⠉', '⠈', '⠈')
        break
      }
      'Dots9' {
        $this.Name = 'Dots9';
        $this.Interval = [TimeSpan]::FromMilliseconds(80);
        $this.IsUnicode = $true;
        $this.Frames = @('⢹', '⢺', '⢼', '⣸', '⣇', '⡧', '⡗', '⡏')
        break
      }
      'Dots10' {
        $this.Name = 'Dots10';
        $this.Interval = [TimeSpan]::FromMilliseconds(80);
        $this.IsUnicode = $true;
        $this.Frames = @('⢄', '⢂', '⢁', '⡁', '⡈', '⡐', '⡠')
        break
      }
      'Dots11' {
        $this.Name = 'Dots11';
        $this.Interval = [TimeSpan]::FromMilliseconds(100);
        $this.IsUnicode = $true;
        $this.Frames = @('⠁', '⠂', '⠄', '⡀', '⢀', '⠠', '⠐', '⠈')
        break
      }
      'Dots12' {
        $this.Name = 'Dots12';
        $this.Interval = [TimeSpan]::FromMilliseconds(80);
        $this.IsUnicode = $true;
        $this.Frames = @('⢀⠀', '⡀⠀', '⠄⠀', '⢂⠀', '⡂⠀', '⠅⠀', '⢃⠀', '⡃⠀', '⠍⠀', '⢋⠀', '⡋⠀', '⠍⠁', '⢋⠁', '⡋⠁', '⠍⠉', '⠋⠉', '⠋⠉', '⠉⠙', '⠉⠙', '⠉⠩', '⠈⢙', '⠈⡙', '⢈⠩', '⡀⢙', '⠄⡙', '⢂⠩', '⡂⢘', '⠅⡘', '⢃⠨', '⡃⢐', '⠍⡐', '⢋⠠', '⡋⢀', '⠍⡁', '⢋⠁', '⡋⠁', '⠍⠉', '⠋⠉', '⠋⠉', '⠉⠙', '⠉⠙', '⠉⠩', '⠈⢙', '⠈⡙', '⠈⠩', '⠀⢙', '⠀⡙', '⠀⠩', '⠀⢘', '⠀⡘', '⠀⠨', '⠀⢐', '⠀⡐', '⠀⠠', '⠀⢀', '⠀⡀')
        break
      }
      'Dots13' {
        $this.Name = 'Dots13';
        $this.Interval = [TimeSpan]::FromMilliseconds(80);
        $this.IsUnicode = $true;
        $this.Frames = @('⣼', '⣹', '⢻', '⠿', '⡟', '⣏', '⣧', '⣶')
        break
      }
      'Dots14' {
        $this.Name = 'Dots14';
        $this.Interval = [TimeSpan]::FromMilliseconds(80);
        $this.IsUnicode = $true;
        $this.Frames = @('⠉⠉', '⠈⠙', '⠀⠹', '⠀⢸', '⠀⣰', '⢀⣠', '⣀⣀', '⣄⡀', '⣆⠀', '⡇⠀', '⠏⠀', '⠋⠁')
        break
      }
      'Dots8Bit' {
        $this.Name = 'Dots8Bit';
        $this.Interval = [TimeSpan]::FromMilliseconds(80);
        $this.IsUnicode = $true;
        $this.Frames = @('⠀', '⠁', '⠂', '⠃', '⠄', '⠅', '⠆', '⠇', '⡀', '⡁', '⡂', '⡃', '⡄', '⡅', '⡆', '⡇', '⠈', '⠉', '⠊', '⠋', '⠌', '⠍', '⠎', '⠏', '⡈', '⡉', '⡊', '⡋', '⡌', '⡍', '⡎', '⡏', '⠐', '⠑', '⠒', '⠓', '⠔', '⠕', '⠖', '⠗', '⡐', '⡑', '⡒', '⡓', '⡔', '⡕', '⡖', '⡗', '⠘', '⠙', '⠚', '⠛', '⠜', '⠝', '⠞', '⠟', '⡘', '⡙', '⡚', '⡛', '⡜', '⡝', '⡞', '⡟', '⠠', '⠡', '⠢', '⠣', '⠤', '⠥', '⠦', '⠧', '⡠', '⡡', '⡢', '⡣', '⡤', '⡥', '⡦', '⡧', '⠨', '⠩', '⠪', '⠫', '⠬', '⠭', '⠮', '⠯', '⡨', '⡩', '⡪', '⡫', '⡬', '⡭', '⡮', '⡯', '⠰', '⠱', '⠲', '⠳', '⠴', '⠵', '⠶', '⠷', '⡰', '⡱', '⡲', '⡳', '⡴', '⡵', '⡶', '⡷', '⠸', '⠹', '⠺', '⠻', '⠼', '⠽', '⠾', '⠿', '⡸', '⡹', '⡺', '⡻', '⡼', '⡽', '⡾', '⡿', '⢀', '⢁', '⢂', '⢃', '⢄', '⢅', '⢆', '⢇', '⣀', '⣁', '⣂', '⣃', '⣄', '⣅', '⣆', '⣇', '⢈', '⢉', '⢊', '⢋', '⢌', '⢍', '⢎', '⢏', '⣈', '⣉', '⣊', '⣋', '⣌', '⣍', '⣎', '⣏', '⢐', '⢑', '⢒', '⢓', '⢔', '⢕', '⢖', '⢗', '⣐', '⣑', '⣒', '⣓', '⣔', '⣕', '⣖', '⣗', '⢘', '⢙', '⢚', '⢛', '⢜', '⢝', '⢞', '⢟', '⣘', '⣙', '⣚', '⣛', '⣜', '⣝', '⣞', '⣟', '⢠', '⢡', '⢢', '⢣', '⢤', '⢥', '⢦', '⢧', '⣠', '⣡', '⣢', '⣣', '⣤', '⣥', '⣦', '⣧', '⢨', '⢩', '⢪', '⢫', '⢬', '⢭', '⢮', '⢯', '⣨', '⣩', '⣪', '⣫', '⣬', '⣭', '⣮', '⣯', '⢰', '⢱', '⢲', '⢳', '⢴', '⢵', '⢶', '⢷', '⣰', '⣱', '⣲', '⣳', '⣴', '⣵', '⣶', '⣷', '⢸', '⢹', '⢺', '⢻', '⢼', '⢽', '⢾', '⢿', '⣸', '⣹', '⣺', '⣻', '⣼', '⣽', '⣾', '⣿')
        break
      }
      'DotsCircle' {
        $this.Name = 'DotsCircle';
        $this.Interval = [TimeSpan]::FromMilliseconds(80);
        $this.IsUnicode = $true;
        $this.Frames = @('⢎ ', '⠎⠁', '⠊⠑', '⠈⠱', ' ⡱', '⢀⡰', '⢄⡠', '⢆⡀')
        break
      }
      'Sand' {
        $this.Name = 'Sand';
        $this.Interval = [TimeSpan]::FromMilliseconds(80);
        $this.IsUnicode = $true;
        $this.Frames = @('⠁', '⠂', '⠄', '⡀', '⡈', '⡐', '⡠', '⣀', '⣁', '⣂', '⣄', '⣌', '⣔', '⣤', '⣥', '⣦', '⣮', '⣶', '⣷', '⣿', '⡿', '⠿', '⢟', '⠟', '⡛', '⠛', '⠫', '⢋', '⠋', '⠍', '⡉', '⠉', '⠑', '⠡', '⢁')
        break
      }
      'Line' {
        $this.Name = 'Line';
        $this.Interval = [TimeSpan]::FromMilliseconds(130);
        $this.IsUnicode = $false;
        $this.Frames = @('-', '\\', '|', '/')
        break
      }
      'Line2' {
        $this.Name = 'Line2';
        $this.Interval = [TimeSpan]::FromMilliseconds(100);
        $this.IsUnicode = $false;
        $this.Frames = @('⠂', '-', '–', '—', '–', '-')
        break
      }
      'Pipe' {
        $this.Name = 'Pipe';
        $this.Interval = [TimeSpan]::FromMilliseconds(100);
        $this.IsUnicode = $false;
        $this.Frames = @('┤', '┘', '┴', '└', '├', '┌', '┬', '┐')
        break
      }
      'SimpleDots' {
        $this.Name = 'SimpleDots';
        $this.Interval = [TimeSpan]::FromMilliseconds(400);
        $this.IsUnicode = $false;
        $this.Frames = @('. ', '.. ', '...', ' ')
        break
      }
      'SimpleDotsScrolling' {
        $this.Name = 'SimpleDotsScrolling';
        $this.Interval = [TimeSpan]::FromMilliseconds(200);
        $this.IsUnicode = $false;
        $this.Frames = @('. ', '.. ', '...', ' ..', ' .', ' ')
        break
      }
      'Star' {
        $this.Name = 'Star';
        $this.Interval = [TimeSpan]::FromMilliseconds(70);
        $this.IsUnicode = $true;
        $this.Frames = @('✶', '✸', '✹', '✺', '✹', '✷')
        break
      }
      'Star2' {
        $this.Name = 'Star2';
        $this.Interval = [TimeSpan]::FromMilliseconds(80);
        $this.IsUnicode = $false;
        $this.Frames = @('+', 'x', '*')
        break
      }
      'Flip' {
        $this.Name = 'Flip';
        $this.Interval = [TimeSpan]::FromMilliseconds(70);
        $this.IsUnicode = $false;
        $this.Frames = @('_', '_', '_', '-', '`', '`', '''', '´', '-', '_', '_', '_')
        break
      }
      'Hamburger' {
        $this.Name = 'Hamburger';
        $this.Interval = [TimeSpan]::FromMilliseconds(100);
        $this.IsUnicode = $true;
        $this.Frames = @('☱', '☲', '☴')
        break
      }
      'GrowVertical' {
        $this.Name = 'GrowVertical';
        $this.Interval = [TimeSpan]::FromMilliseconds(120);
        $this.IsUnicode = $true;
        $this.Frames = @('▁', '▃', '▄', '▅', '▆', '▇', '▆', '▅', '▄', '▃')
        break
      }
      'GrowHorizontal' {
        $this.Name = 'GrowHorizontal';
        $this.Interval = [TimeSpan]::FromMilliseconds(120);
        $this.IsUnicode = $true;
        $this.Frames = @('▏', '▎', '▍', '▌', '▋', '▊', '▉', '▊', '▋', '▌', '▍', '▎')
        break
      }
      'Balloon' {
        $this.Name = 'Balloon';
        $this.Interval = [TimeSpan]::FromMilliseconds(140);
        $this.IsUnicode = $false;
        $this.Frames = @(' ', '.', 'o', 'O', '@', '*', ' ')
        break
      }
      'Balloon2' {
        $this.Name = 'Balloon2';
        $this.Interval = [TimeSpan]::FromMilliseconds(120);
        $this.IsUnicode = $false;
        $this.Frames = @('.', 'o', 'O', '°', 'O', 'o', '.')
        break
      }
      'Noise' {
        $this.Name = 'Noise';
        $this.Interval = [TimeSpan]::FromMilliseconds(100);
        $this.IsUnicode = $true;
        $this.Frames = @('▓', '▒', '░')
        break
      }
      'Bounce' {
        $this.Name = 'Bounce';
        $this.Interval = [TimeSpan]::FromMilliseconds(120);
        $this.IsUnicode = $true;
        $this.Frames = @('⠁', '⠂', '⠄', '⠂')
        break
      }
      'BoxBounce' {
        $this.Name = 'BoxBounce';
        $this.Interval = [TimeSpan]::FromMilliseconds(120);
        $this.IsUnicode = $true;
        $this.Frames = @('▖', '▘', '▝', '▗')
        break
      }
      'BoxBounce2' {
        $this.Name = 'BoxBounce2';
        $this.Interval = [TimeSpan]::FromMilliseconds(100);
        $this.IsUnicode = $true;
        $this.Frames = @('▌', '▀', '▐', '▄')
        break
      }
      'Triangle' {
        $this.Name = 'Triangle';
        $this.Interval = [TimeSpan]::FromMilliseconds(50);
        $this.IsUnicode = $true;
        $this.Frames = @('◢', '◣', '◤', '◥')
        break
      }
      'Binary' {
        $this.Name = 'Binary';
        $this.Interval = [TimeSpan]::FromMilliseconds(80);
        $this.IsUnicode = $false;
        $this.Frames = @('010010', '001100', '100101', '111010', '111101', '010111', '101011', '111000', '110011', '110101')
        break
      }
      'Arc' {
        $this.Name = 'Arc';
        $this.Interval = [TimeSpan]::FromMilliseconds(100);
        $this.IsUnicode = $true;
        $this.Frames = @('◜', '◠', '◝', '◞', '◡', '◟')
        break
      }
      'Circle' {
        $this.Name = 'Circle';
        $this.Interval = [TimeSpan]::FromMilliseconds(120);
        $this.IsUnicode = $true;
        $this.Frames = @('◡', '⊙', '◠')
        break
      }
      'SquareCorners' {
        $this.Name = 'SquareCorners';
        $this.Interval = [TimeSpan]::FromMilliseconds(180);
        $this.IsUnicode = $true;
        $this.Frames = @('◰', '◳', '◲', '◱')
        break
      }
      'CircleQuarters' {
        $this.Name = 'CircleQuarters';
        $this.Interval = [TimeSpan]::FromMilliseconds(120);
        $this.IsUnicode = $true;
        $this.Frames = @('◴', '◷', '◶', '◵')
        break
      }
      'CircleHalves' {
        $this.Name = 'CircleHalves'; $this.Interval = [TimeSpan]::FromMilliseconds(50); $this.IsUnicode = $true; $this.Frames = @('◐', '◓', '◑', '◒')
        break
      }
      'Squish' {
        $this.Name = 'Squish';
        $this.Interval = [TimeSpan]::FromMilliseconds(100);
        $this.IsUnicode = $true;
        $this.Frames = @('╫', '╪')
        break
      }
      'Toggle' {
        $this.Name = 'Toggle';
        $this.Interval = [TimeSpan]::FromMilliseconds(250);
        $this.IsUnicode = $true;
        $this.Frames = @('⊶', '⊷')
        break
      }
      'Toggle2' {
        $this.Name = 'Toggle2';
        $this.Interval = [TimeSpan]::FromMilliseconds(80);
        $this.IsUnicode = $true;
        $this.Frames = @('▫', '▪')
        break
      }
      'Toggle3' {
        $this.Name = 'Toggle3';
        $this.Interval = [TimeSpan]::FromMilliseconds(120);
        $this.IsUnicode = $true;
        $this.Frames = @('□', '■')
        break
      }
      'Toggle4' {
        $this.Name = 'Toggle4';
        $this.Interval = [TimeSpan]::FromMilliseconds(100);
        $this.IsUnicode = $true;
        $this.Frames = @('■', '□', '▪', '▫')
        break
      }
      'Toggle5' {
        $this.Name = 'Toggle5';
        $this.Interval = [TimeSpan]::FromMilliseconds(100);
        $this.IsUnicode = $true;
        $this.Frames = @('▮', '▯')
        break
      }
      'Toggle6' {
        $this.Name = 'Toggle6';
        $this.Interval = [TimeSpan]::FromMilliseconds(300);
        $this.IsUnicode = $true;
        $this.Frames = @('ဝ', '၀')
        break
      }
      'Toggle7' {
        $this.Name = 'Toggle7'; $this.Interval = [TimeSpan]::FromMilliseconds(80); $this.IsUnicode = $true; $this.Frames = @('⦾', '⦿')
        break
      }
      'Toggle8' {
        $this.Name = 'Toggle8';
        $this.Interval = [TimeSpan]::FromMilliseconds(100);
        $this.IsUnicode = $true;
        $this.Frames = @('◍', '◌')
        break
      }
      'Toggle9' {
        $this.Name = 'Toggle9';
        $this.Interval = [TimeSpan]::FromMilliseconds(100);
        $this.IsUnicode = $true;
        $this.Frames = @('◉', '◎')
        break
      }
      'Toggle10' {
        $this.Name = 'Toggle10';
        $this.Interval = [TimeSpan]::FromMilliseconds(100);
        $this.IsUnicode = $true;
        $this.Frames = @('㊂', '㊀', '㊁')
        break
      }
      'Toggle11' {
        $this.Name = 'Toggle11';
        $this.Interval = [TimeSpan]::FromMilliseconds(50);
        $this.IsUnicode = $true;
        $this.Frames = @('⧇', '⧆')
        break
      }
      'Toggle12' {
        $this.Name = 'Toggle12';
        $this.Interval = [TimeSpan]::FromMilliseconds(120);
        $this.IsUnicode = $true;
        $this.Frames = @('☗', '☖')
        break
      }
      'Toggle13' {
        $this.Name = 'Toggle13';
        $this.Interval = [TimeSpan]::FromMilliseconds(80);
        $this.IsUnicode = $false;
        $this.Frames = @('=', '*', '-')
        break
      }
      'Arrow' {
        $this.Name = 'Arrow';
        $this.Interval = [TimeSpan]::FromMilliseconds(100);
        $this.IsUnicode = $true;
        $this.Frames = @('←', '↖', '↑', '↗', '→', '↘', '↓', '↙')
        break
      }
      'Arrow2' {
        $this.Name = 'Arrow2';
        $this.Interval = [TimeSpan]::FromMilliseconds(80);
        $this.IsUnicode = $true;
        $this.Frames = @('⬆️ ', '↗️ ', '➡️ ', '↘️ ', '⬇️ ', '↙️ ', '⬅️ ', '↖️ ')
        break
      }
      'Arrow3' {
        $this.Name = 'Arrow3';
        $this.Interval = [TimeSpan]::FromMilliseconds(120);
        $this.IsUnicode = $true;
        $this.Frames = @('▹▹▹▹▹', '▸▹▹▹▹', '▹▸▹▹▹', '▹▹▸▹▹', '▹▹▹▸▹', '▹▹▹▹▸')
        break
      }
      'BouncingBar' {
        $this.Name = 'BouncingBar';
        $this.Interval = [TimeSpan]::FromMilliseconds(80);
        $this.IsUnicode = $true;
        $this.Frames = @('[ ]', '[= ]', '[== ]', '[=== ]', '[====]', '[ ===]', '[ ==]', '[ =]', '[ ]', '[ =]', '[ ==]', '[ ===]', '[====]', '[=== ]', '[== ]', '[= ]')
        break
      }
      'BouncingBall' {
        $this.Name = 'BouncingBall';
        $this.Interval = [TimeSpan]::FromMilliseconds(80);
        $this.IsUnicode = $true;
        $this.Frames = @('( ● )', '( ● )', '( ● )', '( ● )', '( ●)', '( ● )', '( ● )', '( ● )', '( ● )', '(● )')
        break
      }
      'Smiley' {
        $this.Name = 'Smiley';
        $this.Interval = [TimeSpan]::FromMilliseconds(200);
        $this.IsUnicode = $true;
        $this.Frames = @('😄 ', '😝 ')
        break
      }
      'Monkey' {
        $this.Name = 'Monkey';
        $this.Interval = [TimeSpan]::FromMilliseconds(300);
        $this.IsUnicode = $true;
        $this.Frames = @('🙈 ', '🙈 ', '🙉 ', '🙊 ')
        break
      }
      'Hearts' {
        $this.Name = 'Hearts';
        $this.Interval = [TimeSpan]::FromMilliseconds(100);
        $this.IsUnicode = $true;
        $this.Frames = @('💛 ', '💙 ', '💜 ', '💚 ', '❤️ ')
        break
      }
      'Clock' {
        $this.Name = 'Clock';
        $this.Interval = [TimeSpan]::FromMilliseconds(100);
        $this.IsUnicode = $true;
        $this.Frames = @('🕛 ', '🕐 ', '🕑 ', '🕒 ', '🕓 ', '🕔 ', '🕕 ', '🕖 ', '🕗 ', '🕘 ', '🕙 ', '🕚 ')
        break
      }
      'Earth' {
        $this.Name = 'Earth';
        $this.Interval = [TimeSpan]::FromMilliseconds(180);
        $this.IsUnicode = $true;
        $this.Frames = @('🌍 ', '🌎 ', '🌏 ')
        break
      }
      'Material' {
        $this.Name = 'Material';
        $this.Interval = [TimeSpan]::FromMilliseconds(17);
        $this.IsUnicode = $true;
        $this.Frames = @('█▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁', '██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁', '███▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁', '████▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁', '██████▁▁▁▁▁▁▁▁▁▁▁▁▁▁', '██████▁▁▁▁▁▁▁▁▁▁▁▁▁▁', '███████▁▁▁▁▁▁▁▁▁▁▁▁▁', '████████▁▁▁▁▁▁▁▁▁▁▁▁', '█████████▁▁▁▁▁▁▁▁▁▁▁', '█████████▁▁▁▁▁▁▁▁▁▁▁', '██████████▁▁▁▁▁▁▁▁▁▁', '███████████▁▁▁▁▁▁▁▁▁', '█████████████▁▁▁▁▁▁▁', '██████████████▁▁▁▁▁▁', '██████████████▁▁▁▁▁▁', '▁██████████████▁▁▁▁▁', '▁██████████████▁▁▁▁▁', '▁██████████████▁▁▁▁▁', '▁▁██████████████▁▁▁▁', '▁▁▁██████████████▁▁▁', '▁▁▁▁█████████████▁▁▁', '▁▁▁▁██████████████▁▁', '▁▁▁▁██████████████▁▁', '▁▁▁▁▁██████████████▁', '▁▁▁▁▁██████████████▁', '▁▁▁▁▁██████████████▁', '▁▁▁▁▁▁██████████████', '▁▁▁▁▁▁██████████████', '▁▁▁▁▁▁▁█████████████', '▁▁▁▁▁▁▁█████████████', '▁▁▁▁▁▁▁▁████████████', '▁▁▁▁▁▁▁▁████████████', '▁▁▁▁▁▁▁▁▁███████████', '▁▁▁▁▁▁▁▁▁███████████', '▁▁▁▁▁▁▁▁▁▁██████████', '▁▁▁▁▁▁▁▁▁▁██████████', '▁▁▁▁▁▁▁▁▁▁▁▁████████', '▁▁▁▁▁▁▁▁▁▁▁▁▁███████', '▁▁▁▁▁▁▁▁▁▁▁▁▁▁██████', '▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████', '▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████', '█▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████', '██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███', '██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███', '███▁▁▁▁▁▁▁▁▁▁▁▁▁▁███', '████▁▁▁▁▁▁▁▁▁▁▁▁▁▁██', '█████▁▁▁▁▁▁▁▁▁▁▁▁▁▁█', '█████▁▁▁▁▁▁▁▁▁▁▁▁▁▁█', '██████▁▁▁▁▁▁▁▁▁▁▁▁▁█', '████████▁▁▁▁▁▁▁▁▁▁▁▁', '█████████▁▁▁▁▁▁▁▁▁▁▁', '█████████▁▁▁▁▁▁▁▁▁▁▁', '█████████▁▁▁▁▁▁▁▁▁▁▁', '█████████▁▁▁▁▁▁▁▁▁▁▁', '███████████▁▁▁▁▁▁▁▁▁', '████████████▁▁▁▁▁▁▁▁', '████████████▁▁▁▁▁▁▁▁', '██████████████▁▁▁▁▁▁', '██████████████▁▁▁▁▁▁', '▁██████████████▁▁▁▁▁', '▁██████████████▁▁▁▁▁', '▁▁▁█████████████▁▁▁▁', '▁▁▁▁▁████████████▁▁▁', '▁▁▁▁▁████████████▁▁▁', '▁▁▁▁▁▁███████████▁▁▁', '▁▁▁▁▁▁▁▁█████████▁▁▁', '▁▁▁▁▁▁▁▁█████████▁▁▁', '▁▁▁▁▁▁▁▁▁█████████▁▁', '▁▁▁▁▁▁▁▁▁█████████▁▁', '▁▁▁▁▁▁▁▁▁▁█████████▁', '▁▁▁▁▁▁▁▁▁▁▁████████▁', '▁▁▁▁▁▁▁▁▁▁▁████████▁', '▁▁▁▁▁▁▁▁▁▁▁▁███████▁', '▁▁▁▁▁▁▁▁▁▁▁▁███████▁', '▁▁▁▁▁▁▁▁▁▁▁▁▁███████', '▁▁▁▁▁▁▁▁▁▁▁▁▁███████', '▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████', '▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████', '▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████', '▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████', '▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███', '▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███', '▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██', '▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██', '▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██', '▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█', '▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█', '▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█', '▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁', '▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁', '▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁', '▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁')
        break
      }
      'Moon' {
        $this.Name = 'Moon';
        $this.Interval = [TimeSpan]::FromMilliseconds(80);
        $this.IsUnicode = $true;
        $this.Frames = @('🌑 ', '🌒 ', '🌓 ', '🌔 ', '🌕 ', '🌖 ', '🌗 ', '🌘 ')
        break
      }
      'Runner' {
        $this.Name = 'Runner';
        $this.Interval = [TimeSpan]::FromMilliseconds(140);
        $this.IsUnicode = $true;
        $this.Frames = @('🚶 ', '🏃 ')
        break
      }
      'Pong' {
        $this.Name = 'Pong';
        $this.Interval = [TimeSpan]::FromMilliseconds(80);
        $this.IsUnicode = $true;
        $this.Frames = @('▐⠂ ▌', '▐⠈ ▌', '▐ ⠂ ▌', '▐ ⠠ ▌', '▐ ⡀ ▌', '▐ ⠠ ▌', '▐ ⠂ ▌', '▐ ⠈ ▌', '▐ ⠂ ▌', '▐ ⠠ ▌', '▐ ⡀ ▌', '▐ ⠠ ▌', '▐ ⠂ ▌', '▐ ⠈ ▌', '▐ ⠂▌', '▐ ⠠▌', '▐ ⡀▌', '▐ ⠠ ▌', '▐ ⠂ ▌', '▐ ⠈ ▌', '▐ ⠂ ▌', '▐ ⠠ ▌', '▐ ⡀ ▌', '▐ ⠠ ▌', '▐ ⠂ ▌', '▐ ⠈ ▌', '▐ ⠂ ▌', '▐ ⠠ ▌', '▐ ⡀ ▌', '▐⠠ ▌')
        break
      }
      'Shark' {
        $this.Name = 'Shark';
        $this.Interval = [TimeSpan]::FromMilliseconds(120);
        $this.IsUnicode = $true;
        $this.Frames = @('▐|\\____________▌', '▐_|\\___________▌', '▐__|\\__________▌', '▐___|\\_________▌', '▐____|\\________▌', '▐_____|\\_______▌', '▐______|\\______▌', '▐_______|\\_____▌', '▐________|\\____▌', '▐_________|\\___▌', '▐__________|\\__▌', '▐___________|\\_▌', '▐____________|\\▌', '▐____________/|▌', '▐___________/|_▌', '▐__________/|__▌', '▐_________/|___▌', '▐________/|____▌', '▐_______/|_____▌', '▐______/|______▌', '▐_____/|_______▌', '▐____/|________▌', '▐___/|_________▌', '▐__/|__________▌', '▐_/|___________▌', '▐/|____________▌')
        break
      }
      'Dqpb' {
        $this.Name = 'Dqpb';
        $this.Interval = [TimeSpan]::FromMilliseconds(100);
        $this.IsUnicode = $false;
        $this.Frames = @('d', 'q', 'p', 'b')
        break
      }
      'Weather' {
        $this.Name = 'Weather';
        $this.Interval = [TimeSpan]::FromMilliseconds(100);
        $this.IsUnicode = $true;
        $this.Frames = @('☀️ ', '☀️ ', '☀️ ', '🌤 ', '⛅️ ', '🌥 ', '☁️ ', '🌧 ', '🌨 ', '🌧 ', '🌨 ', '🌧 ', '🌨 ', '⛈ ', '🌨 ', '🌧 ', '🌨 ', '☁️ ', '🌥 ', '⛅️ ', '🌤 ', '☀️ ', '☀️ ')
        break
      }
      'Christmas' {
        $this.Name = 'Christmas';
        $this.Interval = [TimeSpan]::FromMilliseconds(400);
        $this.IsUnicode = $true;
        $this.Frames = @('🌲', '🎄')
        break
      }
      'Grenade' {
        $this.Name = 'Grenade';
        $this.Interval = [TimeSpan]::FromMilliseconds(80);
        $this.IsUnicode = $true;
        $this.Frames = @('، ', '′ ', ' ´ ', ' ‾ ', ' ⸌', ' ⸊', ' |', ' ⁎', ' ⁕', ' ෴ ', ' ⁓', ' ', ' ', ' ')
        break
      }
      'Point' {
        $this.Name = 'Point';
        $this.Interval = [TimeSpan]::FromMilliseconds(125);
        $this.IsUnicode = $true;
        $this.Frames = @('∙∙∙', '●∙∙', '∙●∙', '∙∙●', '∙∙∙')
        break
      }
      'Layer' {
        $this.Name = 'Layer';
        $this.Interval = [TimeSpan]::FromMilliseconds(150);
        $this.IsUnicode = $true;
        $this.Frames = @('-', '=', '≡')
        break
      }
      'BetaWave' {
        $this.Name = 'BetaWave';
        $this.Interval = [TimeSpan]::FromMilliseconds(80);
        $this.IsUnicode = $true;
        $this.Frames = @('ρββββββ', 'βρβββββ', 'ββρββββ', 'βββρβββ', 'ββββρββ', 'βββββρβ', 'ββββββρ')
        break
      }
      'FingerDance' {
        $this.Name = 'FingerDance';
        $this.Interval = [TimeSpan]::FromMilliseconds(160);
        $this.IsUnicode = $true;
        $this.Frames = @('🤘 ', '🤟 ', '🖖 ', '✋ ', '🤚 ', '👆 ')
        break
      }
      'FistBump' {
        $this.Name = 'FistBump';
        $this.Interval = [TimeSpan]::FromMilliseconds(80);
        $this.IsUnicode = $true;
        $this.Frames = @('🤜    🤛 ', '🤜    🤛 ', '🤜    🤛 ', ' 🤜  🤛  ', '  🤜🤛   ', ' 🤜✨🤛   ', '🤜 ✨ 🤛  ')
        break
      }
      'SoccerHeader' {
        $this.Name = 'SoccerHeader';
        $this.Interval = [TimeSpan]::FromMilliseconds(80);
        $this.IsUnicode = $true;
        $this.Frames = @(' 🧑⚽️ 🧑 ', '🧑 ⚽️ 🧑 ', '🧑 ⚽️ 🧑 ', '🧑 ⚽️ 🧑 ', '🧑 ⚽️ 🧑 ', '🧑 ⚽️ 🧑 ', '🧑 ⚽️🧑 ', '🧑 ⚽️ 🧑 ', '🧑 ⚽️ 🧑 ', '🧑 ⚽️ 🧑 ', '🧑 ⚽️ 🧑 ', '🧑 ⚽️ 🧑 ')
        break
      }
      'Mindblown' {
        $this.Name = 'Mindblown';
        $this.Interval = [TimeSpan]::FromMilliseconds(160);
        $this.IsUnicode = $true;
        $this.Frames = @('😐 ', '😐 ', '😮 ', '😮 ', '😦 ', '😦 ', '😧 ', '😧 ', '🤯 ', '💥 ', '✨ ', '  ', '  ', '  ')
        break
      }
      'Speaker' {
        $this.Name = 'Speaker';
        $this.Interval = [TimeSpan]::FromMilliseconds(160);
        $this.IsUnicode = $true;
        $this.Frames = @('🔈 ', '🔉 ', '🔊 ', '🔉 ')
        break
      }
      'OrangePulse' {
        $this.Name = 'OrangePulse';
        $this.Interval = [TimeSpan]::FromMilliseconds(100);
        $this.IsUnicode = $true;
        $this.Frames = @('🔸 ', '🔶 ', '🟠 ', '🟠 ', '🔶 ')
        break
      }
      'BluePulse' {
        $this.Name = 'BluePulse';
        $this.Interval = [TimeSpan]::FromMilliseconds(100);
        $this.IsUnicode = $true;
        $this.Frames = @('🔹 ', '🔷 ', '🔵 ', '🔵 ', '🔷 ')
        break
      }
      'OrangeBluePulse' {
        $this.Name = 'OrangeBluePulse';
        $this.Interval = [TimeSpan]::FromMilliseconds(100);
        $this.IsUnicode = $true;
        $this.Frames = @('🔸 ', '🔶 ', '🟠 ', '🟠 ', '🔶 ', '🔹 ', '🔷 ', '🔵 ', '🔵 ', '🔷 ')
        break
      }
      'TimeTravel' {
        $this.Name = 'TimeTravel';
        $this.Interval = [TimeSpan]::FromMilliseconds(100);
        $this.IsUnicode = $true;
        $this.Frames = @('🕛 ', '🕚 ', '🕙 ', '🕘 ', '🕗 ', '🕖 ', '🕕 ', '🕔 ', '🕓 ', '🕒 ', '🕑 ', '🕐 ')
        break
      }
      'Aesthetic' {
        $this.Name = 'Aesthetic';
        $this.Interval = [TimeSpan]::FromMilliseconds(80);
        $this.IsUnicode = $true;
        $this.Frames = @('▰▱▱▱▱▱▱', '▰▰▱▱▱▱▱', '▰▰▰▱▱▱▱', '▰▰▰▰▱▱▱', '▰▰▰▰▰▱▱', '▰▰▰▰▰▰▱', '▰▰▰▰▰▰▰', '▰▱▱▱▱▱▱')
        break
      }
      'DwarfFortress' {
        $this.Name = 'DwarfFortress';
        $this.Interval = [TimeSpan]::FromMilliseconds(80);
        $this.IsUnicode = $true;
        $this.Frames = @(' ██████£££ ', '☺██████£££ ', '☺██████£££ ', '☺▓█████£££ ', '☺▓█████£££ ', '☺▒█████£££ ', '☺▒█████£££ ', '☺░█████£££ ', '☺░█████£££ ', '☺ █████£££ ', ' ☺█████£££ ', ' ☺█████£££ ', ' ☺▓████£££ ', ' ☺▓████£££ ', ' ☺▒████£££ ', ' ☺▒████£££ ', ' ☺░████£££ ', ' ☺░████£££ ', ' ☺ ████£££ ', ' ☺████£££ ', ' ☺████£££ ', ' ☺▓███£££ ', ' ☺▓███£££ ', ' ☺▒███£££ ', ' ☺▒███£££ ', ' ☺░███£££ ', ' ☺░███£££ ', ' ☺ ███£££ ', ' ☺███£££ ', ' ☺███£££ ', ' ☺▓██£££ ', ' ☺▓██£££ ', ' ☺▒██£££ ', ' ☺▒██£££ ', ' ☺░██£££ ', ' ☺░██£££ ', ' ☺ ██£££ ', ' ☺██£££ ', ' ☺██£££ ', ' ☺▓█£££ ', ' ☺▓█£££ ', ' ☺▒█£££ ', ' ☺▒█£££ ', ' ☺░█£££ ', ' ☺░█£££ ', ' ☺ █£££ ', ' ☺█£££ ', ' ☺█£££ ', ' ☺▓£££ ', ' ☺▓£££ ', ' ☺▒£££ ', ' ☺▒£££ ', ' ☺░£££ ', ' ☺░£££ ', ' ☺ £££ ', ' ☺£££ ', ' ☺£££ ', ' ☺▓££ ', ' ☺▓££ ', ' ☺▒££ ', ' ☺▒££ ', ' ☺░££ ', ' ☺░££ ', ' ☺ ££ ', ' ☺££ ', ' ☺££ ', ' ☺▓£ ', ' ☺▓£ ', ' ☺▒£ ', ' ☺▒£ ', ' ☺░£ ', ' ☺░£ ', ' ☺ £ ', ' ☺£ ', ' ☺£ ', ' ☺▓ ', ' ☺▓ ', ' ☺▒ ', ' ☺▒ ', ' ☺░ ', ' ☺░ ', ' ☺ ', ' ☺ &', ' ☺ ☼&', ' ☺ ☼ &', ' ☺☼ &', ' ☺☼ & ', ' ‼ & ', ' ☺ & ', ' ‼ & ', ' ☺ & ', ' ‼ & ', ' ☺ & ', '‼ & ', ' & ', ' & ', ' & ░ ', ' & ▒ ', ' & ▓ ', ' & £ ', ' & ░£ ', ' & ▒£ ', ' & ▓£ ', ' & ££ ', ' & ░££ ', ' & ▒££ ', '& ▓££ ', '& £££ ', ' ░£££ ', ' ▒£££ ', ' ▓£££ ', ' █£££ ', ' ░█£££ ', ' ▒█£££ ', ' ▓█£££ ', ' ██£££ ', ' ░██£££ ', ' ▒██£££ ', ' ▓██£££ ', ' ███£££ ', ' ░███£££ ', ' ▒███£££ ', ' ▓███£££ ', ' ████£££ ', ' ░████£££ ', ' ▒████£££ ', ' ▓████£££ ', ' █████£££ ', ' ░█████£££ ', ' ▒█████£££ ', ' ▓█████£££ ', ' ██████£££ ', ' ██████£££ ')
        break
      }
      default {
        # if the spinner name is "Default" or just unknown then we resort to this default config
        $this.Name = 'Default';
        $this.Interval = [TimeSpan]::FromMilliseconds(100);
        $this.IsUnicode = $true;
        $this.Frames = @('⣷', '⣯', '⣟', '⡿', '⢿', '⣻', '⣽', '⣾')
      }
    }
  }

  [int] GetFrameIndex([int]$frameCount) {
    return $frameCount % $this.Frames.Length
  }
}