├── .github └── workflows │ └── test.yml ├── .gitignore ├── CHANGELOG.md ├── README.md ├── gleam.toml ├── manifest.toml ├── spinner.gif ├── spinner.tape ├── src └── spinner.gleam └── test └── spinner_test.gleam /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: test 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | - main 8 | pull_request: 9 | 10 | jobs: 11 | test: 12 | runs-on: ubuntu-latest 13 | steps: 14 | - uses: actions/checkout@v3 15 | - uses: erlef/setup-beam@v1 16 | with: 17 | otp-version: "26.0.2" 18 | gleam-version: "1.0.0-rc2" 19 | rebar3-version: "3" 20 | # elixir-version: "1.15.4" 21 | - run: gleam deps download 22 | - run: gleam test 23 | - run: gleam format --check src test 24 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.beam 2 | *.ez 3 | /build 4 | erl_crash.dump 5 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## v1.3.1 - 2025-01-08 4 | 5 | - Dependency requirement for `glearray` has been relaxed to permit v1 or v2. 6 | 7 | ## v1.3.0 - 2024-12-03 8 | 9 | - Added `with_spinner` for callback based usage. 10 | 11 | ## v1.2.0 - 2024-11-06 12 | 13 | - Relaxed dependency requirements. 14 | - The default color is now `ansi.magenta` instead of `ansi.pink`. 15 | 16 | ## v1.1.0 - 2024-02-19 17 | 18 | - The terminal line is now reset when stopping the spinner, to avoid having a 19 | frozen spinner on the terminal. 20 | 21 | ## v1.0.0 - 2024-02-08 22 | 23 | - Initial release 24 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # spinner 2 | 3 | [![Package Version](https://img.shields.io/hexpm/v/spinner)](https://hex.pm/packages/spinner) 4 | [![Hex Docs](https://img.shields.io/badge/hex-docs-ffaff3)](https://hexdocs.pm/spinner/) 5 | 6 | ![The spinner running in a terminal](spinner.gif) 7 | 8 | Animated progress spinners for your console. 9 | 10 | Works on both Erlang and JavaScript runtimes. 11 | ```sh 12 | gleam add spinner 13 | ``` 14 | ```gleam 15 | import spinner 16 | import gleam/io 17 | import gleam_community/ansi 18 | 19 | pub fn main() { 20 | let spinner = 21 | spinner.new("Reticulating 3-Dimensional Splines") 22 | |> spinner.with_colour(ansi.yellow) 23 | |> spinner.start 24 | 25 | // Do some stuff while the spinner runs... 26 | 27 | // The spinner text can be changed 28 | spinner.set_text(spinner, "Collecting Meteor Particles") 29 | 30 | // Finish it when you're done 31 | spinner.stop(spinner) 32 | io.println("Done!") 33 | } 34 | ``` 35 | 36 | Further documentation can be found at . 37 | -------------------------------------------------------------------------------- /gleam.toml: -------------------------------------------------------------------------------- 1 | name = "spinner" 2 | version = "1.3.1" 3 | 4 | description = "Animated progress spinners for your console" 5 | licences = ["Apache-2.0"] 6 | repository = { type = "github", user = "lpil", repo = "spinner" } 7 | links = [ 8 | { title = "Website", href = "https://gleam.run" }, 9 | { title = "Sponsor", href = "https://github.com/sponsors/lpil" }, 10 | ] 11 | 12 | [dependencies] 13 | gleam_stdlib = ">= 0.34.0 and < 2.0.0" 14 | gleam_community_ansi = ">= 1.3.0 and < 2.0.0" 15 | glearray = ">= 1.0.0 and <= 3.0.0" 16 | repeatedly = ">= 2.1.2 and < 3.0.0" 17 | 18 | [dev-dependencies] 19 | gleeunit = ">= 1.2.0 and < 2.0.0" 20 | gleam_erlang = ">= 0.28.0 and < 1.0.0" 21 | -------------------------------------------------------------------------------- /manifest.toml: -------------------------------------------------------------------------------- 1 | # This file was generated by Gleam 2 | # You typically do not need to edit this file 3 | 4 | packages = [ 5 | { name = "gleam_community_ansi", version = "1.4.2", build_tools = ["gleam"], requirements = ["gleam_community_colour", "gleam_regexp", "gleam_stdlib"], otp_app = "gleam_community_ansi", source = "hex", outer_checksum = "479DEDC748D08B310C9FEB9C4CBEC46B95C874F7F4F2844304D6D20CA78A8BB5" }, 6 | { name = "gleam_community_colour", version = "1.4.1", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_community_colour", source = "hex", outer_checksum = "386CB9B01B33371538672EEA8A6375A0A0ADEF41F17C86DDCB81C92AD00DA610" }, 7 | { name = "gleam_erlang", version = "0.33.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "A1D26B80F01901B59AABEE3475DD4C18D27D58FA5C897D922FCB9B099749C064" }, 8 | { name = "gleam_json", version = "2.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_json", source = "hex", outer_checksum = "C55C5C2B318533A8072D221C5E06E5A75711C129E420DD1CE463342106012E5D" }, 9 | { name = "gleam_regexp", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_regexp", source = "hex", outer_checksum = "A3655FDD288571E90EE9C4009B719FEF59FA16AFCDF3952A76A125AF23CF1592" }, 10 | { name = "gleam_stdlib", version = "0.52.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "50703862DF26453B277688FFCDBE9DD4AC45B3BD9742C0B370DB62BC1629A07D" }, 11 | { name = "glearray", version = "2.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "glearray", source = "hex", outer_checksum = "2CDF973B9ECE4A1AB8FBFB719AA37D9F3F1FF947B260C1B21ED5B608B52BC111" }, 12 | { name = "gleeunit", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "F7A7228925D3EE7D0813C922E062BFD6D7E9310F0BEE585D3A42F3307E3CFD13" }, 13 | { name = "repeatedly", version = "2.1.2", build_tools = ["gleam"], requirements = [], otp_app = "repeatedly", source = "hex", outer_checksum = "93AE1938DDE0DC0F7034F32C1BF0D4E89ACEBA82198A1FE21F604E849DA5F589" }, 14 | ] 15 | 16 | [requirements] 17 | gleam_community_ansi = { version = ">= 1.3.0 and < 2.0.0" } 18 | gleam_erlang = { version = ">= 0.28.0 and < 1.0.0" } 19 | gleam_stdlib = { version = ">= 0.34.0 and < 2.0.0" } 20 | glearray = { version = ">= 1.0.0 and <= 3.0.0" } 21 | gleeunit = { version = ">= 1.2.0 and < 2.0.0" } 22 | repeatedly = { version = ">= 2.1.2 and < 3.0.0" } 23 | -------------------------------------------------------------------------------- /spinner.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lpil/spinner/2d46270c702fef1ffae53521cb6c806f1be789ea/spinner.gif -------------------------------------------------------------------------------- /spinner.tape: -------------------------------------------------------------------------------- 1 | Set FontSize 38 2 | Type gleam test 3 | Enter 4 | Sleep 8s 5 | 6 | -------------------------------------------------------------------------------- /src/spinner.gleam: -------------------------------------------------------------------------------- 1 | import gleam/io 2 | import gleam_community/ansi 3 | import glearray.{type Array} 4 | import repeatedly.{type Repeater} 5 | 6 | const clear_line_code = "\u{001b}[2K" 7 | 8 | const go_to_start_code = "\r" 9 | 10 | pub const clock_frames = [ 11 | "🕛", "🕐", "🕑", "🕒", "🕓", "🕔", "🕕", "🕖", "🕗", "🕘", 12 | "🕙", "🕚", 13 | ] 14 | 15 | pub const half_circle_frames = ["◐", "◓", "◑", "◒"] 16 | 17 | pub const moon_frames = [ 18 | "🌑", "🌒", "🌓", "🌔", "🌕", "🌖", "🌗", "🌘", 19 | ] 20 | 21 | pub const negative_dots_frames = [ 22 | "⣾", "⣽", "⣻", "⢿", "⡿", "⣟", "⣯", "⣷", 23 | ] 24 | 25 | pub const snake_frames = [ 26 | "⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏", 27 | ] 28 | 29 | pub const triangle_frames = ["◢", "◣", "◤", "◥"] 30 | 31 | pub const walking_frames = ["⢄", "⢂", "⢁", "⡁", "⡈", "⡐", "⡠"] 32 | 33 | pub opaque type Spinner { 34 | Spinner(repeater: Repeater(State), frames: Array(String)) 35 | } 36 | 37 | type State { 38 | State(text: String, colour: fn(String) -> String) 39 | } 40 | 41 | pub opaque type Builder { 42 | Builder(frames: List(String), text: String, colour: fn(String) -> String) 43 | } 44 | 45 | /// Start a spinner that runs concurrently in another Erlang process or 46 | /// JavaScript task. 47 | /// 48 | pub fn new(text: String) -> Builder { 49 | Builder(snake_frames, text, ansi.magenta) 50 | } 51 | 52 | pub fn with_frames(builder: Builder, frames: List(String)) -> Builder { 53 | Builder(..builder, frames: frames) 54 | } 55 | 56 | pub fn with_colour(builder: Builder, colour: fn(String) -> String) -> Builder { 57 | Builder(..builder, colour: colour) 58 | } 59 | 60 | pub fn with_spinner(builder: Builder, context: fn(Spinner) -> a) { 61 | let spinner = start(builder) 62 | 63 | context(spinner) 64 | 65 | stop(spinner) 66 | } 67 | 68 | pub fn start(builder: Builder) -> Spinner { 69 | let frames = glearray.from_list(builder.frames) 70 | let repeater = 71 | repeatedly.call(80, State(builder.text, builder.colour), fn(state, i) { 72 | print(frames, state, i) 73 | state 74 | }) 75 | Spinner(repeater, frames) 76 | } 77 | 78 | pub fn set_text(spinner: Spinner, text: String) -> Nil { 79 | repeatedly.update_state(spinner.repeater, fn(state) { 80 | State(..state, text: text) 81 | }) 82 | } 83 | 84 | pub fn set_colour(spinner: Spinner, colour: fn(String) -> String) -> Nil { 85 | repeatedly.update_state(spinner.repeater, fn(state) { 86 | State(..state, colour: colour) 87 | }) 88 | } 89 | 90 | /// Stop the spinner, clearing the terminal line and showing the cursor. You 91 | /// may want to print a success message after this. 92 | /// 93 | /// This should be called before your program ends to re-enable the terminal 94 | /// cursor. 95 | /// 96 | pub fn stop(spinner: Spinner) -> Nil { 97 | repeatedly.stop(spinner.repeater) 98 | let show_cursor = "\u{001b}[?25h" 99 | io.print(clear_line_code <> go_to_start_code <> show_cursor) 100 | } 101 | 102 | fn print(frames: Array(String), state: State, index: Int) -> Nil { 103 | let hide_cursor = "\u{001b}[?25l" 104 | io.print( 105 | hide_cursor 106 | <> clear_line_code 107 | <> go_to_start_code 108 | <> state.colour(frame(frames, index)) 109 | <> " " 110 | <> state.text, 111 | ) 112 | } 113 | 114 | fn frame(frames: Array(String), index: Int) -> String { 115 | let assert Ok(frame) = glearray.get(frames, index % glearray.length(frames)) 116 | frame 117 | } 118 | -------------------------------------------------------------------------------- /test/spinner_test.gleam: -------------------------------------------------------------------------------- 1 | import gleam/erlang/process 2 | import gleam/io 3 | import gleam_community/ansi 4 | import spinner 5 | 6 | pub fn main() { 7 | start_test() 8 | io.println("✅ Done!") 9 | 10 | with_spinner_test() 11 | io.println("✅ Done!") 12 | } 13 | 14 | fn start_test() { 15 | let spinner = 16 | spinner.new("Baking Bread for Toasters") 17 | |> spinner.with_colour(ansi.cyan) 18 | |> spinner.start 19 | 20 | process.sleep(1000) 21 | spinner.set_text(spinner, "Compositing Vampiric Complexions") 22 | spinner.set_colour(spinner, ansi.pink) 23 | 24 | process.sleep(1000) 25 | spinner.set_text(spinner, "Timing Temperature Transference") 26 | spinner.set_colour(spinner, ansi.blue) 27 | 28 | process.sleep(1000) 29 | spinner.stop(spinner) 30 | } 31 | 32 | fn with_spinner_test() { 33 | use spinner <- spinner.with_spinner( 34 | spinner.new("Activating Deviance Threshold") 35 | |> spinner.with_colour(ansi.green), 36 | ) 37 | 38 | process.sleep(1000) 39 | spinner.set_text(spinner, "Routing Neural Network Infanstructure") 40 | spinner.set_colour(spinner, ansi.yellow) 41 | 42 | process.sleep(1000) 43 | spinner.set_text(spinner, "Extrapolating Empire Eigenvectors") 44 | spinner.set_colour(spinner, ansi.red) 45 | 46 | process.sleep(1000) 47 | } 48 | 49 | pub const phrases = [ 50 | "Abolishing Pedestrian Posturing", "Abstracting Loading Procedures", 51 | "Activating Deviance Threshold", "Activating Hotel Staff", 52 | "Activating Story Arc", "Adapting Behavioral Model", "Adding Hidden Agendas", 53 | "Adjusting Acceptable Apparel", "Adjusting Bell Curves", 54 | "Adjusting Emotional Weights", "Anesthetizing Industrial Areas", 55 | "Aggregating Need Agents", "Aligning Covariance Matrices", 56 | "Alphabetizing Books", "Amplifying Sun to '11'", "Analyzing Adolescent Angst", 57 | "Analyzing Axe Trajectories", "Applying Feng Shui Shaders", 58 | "Applying Lampshade Headwear", "Applying Theatre Soda Layer", 59 | "Appointing Appealing Appurtenances", "Ascending Maslow's Hierarchy", 60 | "Assembling Playground", "Assembling Shower Stalls", 61 | "Asserting Packed Exemplars", "Assessing Loam Particle Sizes", 62 | "Assigning Mimic Propagation", "Atomizing Atomic Particles", 63 | "Attempting to Lock Back-Buffer", "Augmenting Assets", 64 | "Augmenting Occupational Conduits", "Baking Bread for Toasters", 65 | "Balancing Domestic Coefficients", "Besmirching Reputations", 66 | "Binding Sapling Root System", "Binding Trace Enchantments", 67 | "Blurring Reality Lines", "Borrowing Something Blue", "Boxing BILLY Bookcases", 68 | "Branching Family Trees", "Breaking Down Restorable Cars", "Breeding Fauna", 69 | "Bribing The Orangutans", "Buffing Splines for Reticulation", 70 | "Building Bedroom Displays", "Building Boring Bedrooms? As If!", 71 | "Building Data Trees", "Building High Ceilings", 72 | "Bureacritizing Bureaucracies", "Burning Calories", "Cabalizing NPC Controls", 73 | "Caffeinating Student Body", "Calculating Exchange Rate", 74 | "Calculating Inverse Probability Matrices", "Calculating Lifetime Aspirations", 75 | "Calculating Llama Expectoration Trajectory", "Calculating Maximum Velocity", 76 | "Calculating Money Supply", "Calculating Native Restlessness", 77 | "Calculating Snowball Trajectories", "Calculating Vincent's Wealth", 78 | "Calibrating Blue Skies", "Calibrating Canine Customization", 79 | "Calibrating Fame Indicant", "Calibrating Personality Matrix", 80 | "Calling Psychic Phone Pals", "Canceling Un-cancelable Actions", 81 | "Capacitating Genetic Modifiers", "Captivating Conspiracy Theorists", 82 | "Capturing Youthful Exuberance", "Catalyzing Chemicals", 83 | "Catching Cat Burglars", "Ceiling Fan Rotation = dL/dT", 84 | "Charging Ozone Layer", "Checkering Flags", "Chlorinating Car Pools", 85 | "Clearing Shipping Lanes", "Cluttering Closets", "Coalescing Cloud Formations", 86 | "Cohorting Exemplars", "Collecting Meteor Particles", 87 | "Compiling Reticulated Splines", "Compiling Riley's Wardrobe", 88 | "Composing Melodic Euphony", "Compositing Vampiric Complexions", 89 | "Compounding Inert Tessellations", "Compressing Fish Files", 90 | "Computing Optimal Bin Packing", "Concatenating Sub-Contractors", 91 | "Concatenating Vertex Nodes", "Configuring Lemony Squeezation", 92 | "Configuring Studio Operations", "Constructing Clothes Hangers", 93 | "Containing Existential Buffer", "Cooling Down Refrigerators", 94 | "Crash-Proofing Parties", "Creating Handmade Lampshades", 95 | "Crenellating Crenellations", "Cultivating Quality and Class", 96 | "Dampening Stray Generators", "De-chlorophyllizing Leaves", 97 | "De-inviting Don Lothario", "De-wrinkling Worry-Free Clothing", 98 | "Debarking Ark Ramp", "Debunching Unionized Commercial Services", 99 | "Deciding What Message to Display Next", "Decomposing Singular Values", 100 | "Decrementing Alice's Funds", "Decrementing Feline Life-Count", 101 | "Decrementing Tectonic Plates", "Deleting Ferry Routes", 102 | "Delineating Mask Dynamics", "Depixelating Inner Mountain Surface Back Faces", 103 | "Depositing Slush Funds", "Desalinizing Snorkels", 104 | "Destabilizing Economic Indicators", "Destabilizing Orbital Payloads", 105 | "Determining Rent Guidelines", "Determining Width of Blast Fronts", 106 | "Deunionizing Bulldozers", "Developing Delicious Designs", "Dicing Models", 107 | "Diluting Livestock Nutrition Variables", "Disgruntling Employees", 108 | "Distilling Doggie Dynamics", "Distressing Jeans", 109 | "Downloading Satellite Terrain Data", "Downloading Weather Data", 110 | "Dragon-proofing Dressers", "Dumbing Down Doofuses", 111 | "Eliminating Would-be Chicanery", "Enabling Lot Commercialization", 112 | "Enforcing Storyline", "Enhancing Crown Reflectivity", 113 | "Enlisting Elite Forces", "Ensuring Transplanar Synergy", 114 | "Eschewing Everyday Aesthetics", "Establishing Gift Registry", 115 | "Estimating Volcanic Activity", "Examining Tiles from All Zooms and Angles", 116 | "Exposing Flash Variables to Streak System", "Extracting Resources", 117 | "Extrapolating Empire Eigenvectors", "Extruding Mesh Terrain", 118 | "Fabricating Imaginary Infrastructure", "Faceting Precious Gems", 119 | "Factoring Fairy Frolicking Frequencies", "Factoring Hobby Enthusiasm", 120 | "Factoring Pay Scale", "Falsifying Faux Finishes", "Fashioning Late Arrivals", 121 | "Fiercely Reticulating Splines", "Filling in the Blanks", 122 | "Fixing Election Outcome Matrix", "Flavorizing Side-Dishes", 123 | "Flood-Filling Ground Water", "Flushing Pipe Network", 124 | "Formulating Fitting Rooms", "Gathering Particle Sources", 125 | "Generating Compatible Roommates", "Generating Gothic Glamour", 126 | "Generating Intrigue", "Generating Jobs", "Generating Population Model", 127 | "Generating Sand Grains", "Generating Schmoozing Algorithm", 128 | "Gesticulating Mimes", "Gleefully Stacking Inventories", 129 | "Going Apartment Hunting", "Graduating Scholars", "Graphing Whale Migration", 130 | "Grooming Grooms", "Growing Greener Gardens", 131 | "Happy 14th Birthday Reticulated Splines!", "Hiding Garden Gnomes", 132 | "Hiding Willio Webnet Mask", "Homogenizing Interest Anatomy", 133 | "Hybridizing Plant Material", "Hydrating Harvestables", 134 | "Hyperactivating Children", "Igniting Pilot Lights", 135 | "Implementing Impeachment Routine", "Importing Entertainment Talent", 136 | "Importing Personality Anchors", "Increasing Accuracy of RCI Simulators", 137 | "Increasing Magmafacation", "Increasing Water Plant Population", 138 | "Individualizing Snowflakes", "Infuriating Furious Bits", 139 | "Initializing Dastardly Schemes", "Initializing Forth-Rallying Protocol", 140 | "Initializing My Sim Tracking Mechanism", "Initializing Operant Construct", 141 | "Initializing Rhinoceros Breeding Timetable", 142 | "Initializing Robotic Click-Path AI", "Initializing Secret Societies", 143 | "Inserting Chaos Generator", "Inserting Extension Algorithms", 144 | "Inserting Sublimated Messages", "Integrating Curves", 145 | "Integrating Illumination Form Factors", "Integrating Population Graphs", 146 | "Intensifying Hawaiian Prints", "Interpreting Family Values", 147 | "Inventing Internets", "Inverting Career Ladder", 148 | "Invigorating Dull Habitations", "Iterating Cellular Automata", 149 | "Iterating Chaos Array", "Lacing Football Cleats", "Launching SimSat 9000", 150 | "Lecturing Errant Subsystems", "Leveling Playing Fields", 151 | "Like, Totally Reticulating Splines, Dude", "Limiting Litterbox Loads", 152 | "Loading \"First Batch\" Metrics", "Loading \"Vroom\" Sounds", 153 | "Loading School Spirit Algorithm", "Locating Misplaced Calculations", 154 | "Making a Little Bit of Magic", "Making a Mess", "Making Manic Mansions", 155 | "Making Many Mini Wrenches", "Making Owners Look Like Pets", 156 | "Making Pets Look Like Owners", "Making Stephen Loyal", 157 | "Managing Managers' Managers", "Manipulating Modal Memory", 158 | "Mapping Influence Attributes", "Mapping The Llama Genome", 159 | "Matching Walls and Floors", "Maximizing Social Network", 160 | "Meditating Modifiers", "Mingling", "Mitigating Time-Stream Discontinuities", 161 | "Mixing Genetic Pool", "Modeling Marquetry", "Modeling Object Components", 162 | "Monitoring Moody Minors", "Mopping Occupant Leaks", 163 | "Navigating Stormy Waters", "Neutralizing Shuriken Oxidization", 164 | "Normalizing Power", "Normalizing Social Network", 165 | "Obfuscating Quigley Matrix", "Optimizing Baking Temperature", 166 | "Originating Ocean Currents", "Over-Waxing Banisters", 167 | "Overconstraining Dirty Industry Calculations", 168 | "Partitioning City Grid Singularities", "Partitioning Prose", 169 | "Partitioning Social Network", "Perfecting Playground Pieces", 170 | "Performing A Sound Check", "Perturbing Matrices", "Pixalating Nude Patch", 171 | "Polarizing Image Conduits", "Polishing Water Highlights", 172 | "Populating Empyreal Entities", "Populating Lot Templates", 173 | "Populating Yards with Bugs and Birds", "Pre-fluffing Pillows", 174 | "Pre-Inking Simoleon Plates", "Predicating Predestined Paths", 175 | "Predicting Pagoda Peaks", "Predicting Puddle Prevalence", 176 | "Predicting Weather Unpredictability", "Prelaminating Drywall Inventory", 177 | "Preparing a Tasty Grilled Cheese Sandwich", 178 | "Preparing Bacon for Homeward Transportation", "Preparing Captive Simulators", 179 | "Preparing for Pops and Locks", "Preparing Perfect Plumbing", 180 | "Preparing Personal Spaces", "Preparing Sprites for Random Walks", 181 | "Preparing Vacation Days", "Pressurizing Fruit Punch Barrel Hydraulics", 182 | "Priming Mascot Mischief Coefficients", "Prioritizing Landmarks", 183 | "Projecting Law Enforcement Pastry Intake", "Proscribing Plebeian Palates", 184 | "Putting Down Toilet Seats", "Randomizing Inhabitant Characteristics", 185 | "Rasterizing Reputation Algorithms", "Rasterizing Rodent Residences", 186 | "Re-Activating Story Arc", "Re-Inverting Career Ladder", 187 | "Re-Re-Re-Re-Re-Reticulating Splines", "Readjusting Emotional Weights", 188 | "Readying Relaxation Receptors", "Realigning Alternate Time Frames", 189 | "Recomputing Mammal Matrix", "Reconfiguring Genetic Algorithms", 190 | "Reconfiguring User Mental Processes", "Recruiting Snooty Food Judges", 191 | "Recycling Hex Decimals", "Redefining Family Values", 192 | "Redistributing Resources", "Rehearsing Dinner", "Reinforcing Story Lines", 193 | "Relaxing Splines", "Remodeling Spline Reticulator", 194 | "Removing Road Network Speed Bumps", "Removing Texture Gradients", 195 | "Removing Vehicle Avoidance Behavior", "Renewing Urban Combinatorics", 196 | "Replacing Wheel Bearings", "Requisitioning Alumni Donations", 197 | "Resolving GUID Conflict", "Restocking Sim Inventories", 198 | "Reticulated Splines for Sale: §2000", "Reticulating 3-Dimensional Splines", 199 | "Reticulating 4-D Splines", "Reticulating Dog Show Object Splines", 200 | "Reticulating Golden Splines", "Reticulating Graduated Splines", 201 | "Reticulating Ninja Splines", "Reticulating Splines", 202 | "Reticulating Splines Again", "Reticulating Splines in the Zone", 203 | "Reticulating Splines One Last Time", "Reticulating Story Splines", 204 | "Reticulating Underwater Splines", "Reticulating Unreticulated Splines", 205 | "Reticulator of Splines Reticulating", "Retracting Phong Shader", 206 | "Retrieving from Back Store", "Reverse Engineering Image Consultant", 207 | "Reverse-Engineering Party Scores", "Rezoning Residual Residents", 208 | "Roof = Roof(1/3*pi*r^2*h)", "Routing Neural Network Infanstructure", 209 | "Scattering Rhino Food Sources", "Scheduling Copious Catnaps", 210 | "Scolding Splines for Reticulating", "Scrubbing Terrain", 211 | "Searching for Llamas", "Securing Online Grades Database", 212 | "Seeding Architecture Simulation Parameters", 213 | "Sequencing Cinematic Specifiers", "Sequencing Particles", 214 | "Setting Advisor Moods", "Setting Inner Deity Indicators", 215 | "Setting Universal Physical Constants", "Severing Civilization Connections", 216 | "Shampooing Dirty Rugs", "Simmering Swedish Meatballs", 217 | "Simulating Program Execution", "Simulating Sparkling Surfaces", 218 | "Some Spline Reticulating Required", 219 | "Sonically Enhancing Occupant-Free Timber", "Space Ponies: Achieved", 220 | "Sparking Imaginations", "Spawning Sights to See", 221 | "Speculating Stock Market Indices", "Spinning New Tunes", 222 | "Splatting Transforms", "Spooling IKEA Awesomeness", "Spreading Rumors", 223 | "Still Reticulating Splines", "Stocking Clearance Racks", "Stocking Ponds", 224 | "Stocking Stylish Sinks", "Stooping and Scooping", 225 | "Stopping To Smell The Flowers", "Storing Solar Energy", 226 | "Stratifying Ground Layers", "Strengthening Award Foundations", 227 | "Stress-Testing POÄNG Chairs", "Stuffing Genies Into Bottles", 228 | "Sub-Sampling Water Data", "Submerging Bedroom Furniture", 229 | "Supplying Self-Serve Furniture Area", "Sweetening Sixteens", 230 | "Synthesizing Gravity", "Synthesizing Natural Selection", 231 | "Synthesizing Wavelets", "Tabulating Spell Effectors", "Tabulating Traits", 232 | "Tailoring Trendy Threads", "Taking Countertops for Granite", 233 | "Teasing Teenage Hair-dos", "Telling Splines to Reticulate More Quietly", 234 | "Testing Test Subjects", "Testing Underworld Telecommunications", 235 | "Texture-Compositing Teddy Bears", "Threading Fabric Compositors", 236 | "Threading Sewing Needles", "Time-Compressing Simulator Clock", 237 | "Timing Temperature Transference", "Training Team Mascots", 238 | "Training Tour Guides", "Transmitting Message Bottles", "Turning On Turn-Ons", 239 | "Twisting Spiral Staircases", "Unable to Reveal Current Activity", 240 | "Unexpectedly Reticulating Splines", "Unfolding Foldy Chairs", 241 | "Unfolding Helix Packet", "Unloading Loading Screens", 242 | "Updating Hotel Registry", "Updating Vacancy Request Hotline", 243 | "Upgrading Gadgets", "Upholstering Sofas and Loveseats", 244 | "Weathering Buildings", "Wrangling All Wreckage", 245 | "Writing Scrolling Startup String Text", "Zeroing Crime Network", 246 | ] 247 | --------------------------------------------------------------------------------