[{"data":1,"prerenderedAt":3354},["ShallowReactive",2],{"item-lessons-light-ch25-command-based-programming":3,"item-examples-light-ch25-command-based-programming":444,"item-exercises-light-ch25-command-based-programming":753,"item-lesson-full-ch25-command-based-programming-25.3":1070,"item-example-full-ch25-command-based-programming-25.3":1672,"item-exercise-full-ch25-command-based-programming-25.3":2053},[4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140,144,148,152,156,160,164,168,172,176,180,184,188,192,196,200,204,208,212,216,220,224,228,232,236,240,244,248,252,256,260,264,268,272,276,280,284,288,292,296,300,304,308,312,316,320,324,328,332,336,340,344,348,352,356,360,364,368,372,376,380,384,388,392,396,400,404,408,412,416,420,424,428,432,436,440],{"path":5,"title":6,"stem":7},"\u002Fshockwave-curriculum\u002Flessons\u002Fch01-why-java-for-frc\u002F1-why-java-for-frc","Why Java for FRC?","shockwave-curriculum\u002Flessons\u002Fch01-why-java-for-frc\u002F1.1-why-java-for-frc",{"path":9,"title":10,"stem":11},"\u002Fshockwave-curriculum\u002Flessons\u002Fch01-why-java-for-frc\u002F2-intro-to-algorithms-programming-and-compilers","Intro to Algorithms, Programming and Compilers","shockwave-curriculum\u002Flessons\u002Fch01-why-java-for-frc\u002F1.2-intro-to-algorithms-programming-and-compilers",{"path":13,"title":14,"stem":15},"\u002Fshockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F1-variables-and-data-types","Variables & Data Types","shockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F2.1-variables-and-data-types",{"path":17,"title":18,"stem":19},"\u002Fshockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F2-expressions-and-output","Expressions & Output","shockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F2.2-expressions-and-output",{"path":21,"title":22,"stem":23},"\u002Fshockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F3-assignment-and-input","Assignment & Input","shockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F2.3-assignment-and-input",{"path":25,"title":26,"stem":27},"\u002Fshockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F4-casting-and-ranges-of-values","Casting & Ranges of Values","shockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F2.4-casting-and-ranges-of-values",{"path":29,"title":30,"stem":31},"\u002Fshockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F5-compound-assignment-operators","Compound Assignment Operators","shockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F2.5-compound-assignment-operators",{"path":33,"title":34,"stem":35},"\u002Fshockwave-curriculum\u002Flessons\u002Fch03-apis-libraries-and-documentation\u002F1-apis-and-libraries","APIs and Libraries","shockwave-curriculum\u002Flessons\u002Fch03-apis-libraries-and-documentation\u002F3.1-apis-and-libraries",{"path":37,"title":38,"stem":39},"\u002Fshockwave-curriculum\u002Flessons\u002Fch03-apis-libraries-and-documentation\u002F2-documentation-with-comments-and-preconditions","Documentation with Comments and Preconditions","shockwave-curriculum\u002Flessons\u002Fch03-apis-libraries-and-documentation\u002F3.2-documentation-with-comments-and-preconditions",{"path":41,"title":42,"stem":43},"\u002Fshockwave-curriculum\u002Flessons\u002Fch03-apis-libraries-and-documentation\u002F3-packages-and-imports","Packages & Imports","shockwave-curriculum\u002Flessons\u002Fch03-apis-libraries-and-documentation\u002F3.3-packages-and-imports",{"path":45,"title":46,"stem":47},"\u002Fshockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F1-methods-signatures-and-parameters","Methods, Signatures & Parameters","shockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F4.1-methods-signatures-and-parameters",{"path":49,"title":50,"stem":51},"\u002Fshockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F2-calling-class-methods","Calling Class Methods","shockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F4.2-calling-class-methods",{"path":53,"title":54,"stem":55},"\u002Fshockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F3-using-the-math-class","Using the Math Class","shockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F4.3-using-the-math-class",{"path":57,"title":58,"stem":59},"\u002Fshockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F4-objects-instances-of-classes","Objects — Instances of Classes","shockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F4.4-objects-instances-of-classes",{"path":61,"title":62,"stem":63},"\u002Fshockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F5-creating-and-initializing-objects-constructors","Creating & Initializing Objects: Constructors","shockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F4.5-creating-and-initializing-objects-constructors",{"path":65,"title":66,"stem":67},"\u002Fshockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F6-calling-instance-methods","Calling Instance Methods","shockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F4.6-calling-instance-methods",{"path":69,"title":70,"stem":71},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F1-5.2-if-statements-and-for-loops","Control Structures: if Statements & For Loops","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.1-5.2-if-statements-and-for-loops",{"path":73,"title":74,"stem":75},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F10-nested-iteration","Nested Iteration","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.10-nested-iteration",{"path":77,"title":78,"stem":79},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F11-informal-runtime-analysis-of-loops","Informal Runtime Analysis of Loops","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.11-informal-runtime-analysis-of-loops",{"path":81,"title":82,"stem":83},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F12-switch-statements-and-expressions","switch Statements and Expressions","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.12-switch-statements-and-expressions",{"path":85,"title":86,"stem":87},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F3-algorithms-with-selection-and-repetition","Algorithms with Selection and Repetition","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.3-algorithms-with-selection-and-repetition",{"path":89,"title":90,"stem":91},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F4-boolean-expressions","Boolean Expressions","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.4-boolean-expressions",{"path":93,"title":94,"stem":95},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5-nested-if-statements","Nested if Statements","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.5-nested-if-statements",{"path":97,"title":98,"stem":99},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F6-compound-boolean-expressions","Compound Boolean Expressions","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.6-compound-boolean-expressions",{"path":101,"title":102,"stem":103},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F7-comparing-boolean-expressions-de-morgans-laws","Comparing Boolean Expressions (De Morgan's Laws)","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.7-comparing-boolean-expressions-de-morgans-laws",{"path":105,"title":106,"stem":107},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F8-while-loops","While Loops","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.8-while-loops",{"path":109,"title":110,"stem":111},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F9-implementing-selection-and-iteration-algorithms","Implementing Selection and Iteration Algorithms","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.9-implementing-selection-and-iteration-algorithms",{"path":113,"title":114,"stem":115},"\u002Fshockwave-curriculum\u002Flessons\u002Fch06-strings\u002F1-strings","Strings","shockwave-curriculum\u002Flessons\u002Fch06-strings\u002F6.1-strings",{"path":117,"title":118,"stem":119},"\u002Fshockwave-curriculum\u002Flessons\u002Fch06-strings\u002F2-string-algorithms","String Algorithms","shockwave-curriculum\u002Flessons\u002Fch06-strings\u002F6.2-string-algorithms",{"path":121,"title":122,"stem":123},"\u002Fshockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F1-anatomy-of-a-java-class","The Class Blueprint","shockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F7.1-anatomy-of-a-java-class",{"path":125,"title":126,"stem":127},"\u002Fshockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F2-methods-how-to-write-them","Methods: How to Write Them","shockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F7.2-methods-how-to-write-them",{"path":129,"title":130,"stem":131},"\u002Fshockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F3-methods-passing-and-returning-references-of-an-object","Methods: Passing & Returning References of an Object","shockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F7.3-methods-passing-and-returning-references-of-an-object",{"path":133,"title":134,"stem":135},"\u002Fshockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F4-class-static-variables-and-methods","Class (static) Variables & Methods","shockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F7.4-class-static-variables-and-methods",{"path":137,"title":138,"stem":139},"\u002Fshockwave-curriculum\u002Flessons\u002Fch08-constructors-and-this\u002F1-8.2-constructors-and-this","Constructors & \"this\"","shockwave-curriculum\u002Flessons\u002Fch08-constructors-and-this\u002F8.1-8.2-constructors-and-this",{"path":141,"title":142,"stem":143},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F1-array-creation-and-access","Array Creation and Access","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.1-array-creation-and-access",{"path":145,"title":146,"stem":147},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F2-arraylist-and-its-methods","ArrayList and its Methods","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.2-arraylist-and-its-methods",{"path":149,"title":150,"stem":151},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F3-optional-hashmap-dictionary-data-structure","HashMap (Dictionary) Data Structure","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.3-optional-hashmap-dictionary-data-structure",{"path":153,"title":154,"stem":155},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F4-array-traversals","Array Traversals","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.4-array-traversals",{"path":157,"title":158,"stem":159},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F5-implementing-array-algorithms","Implementing Array Algorithms","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.5-implementing-array-algorithms",{"path":161,"title":162,"stem":163},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F6-arraylist-traversals","ArrayList Traversals","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.6-arraylist-traversals",{"path":165,"title":166,"stem":167},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F7-implementing-arraylist-algorithms","Implementing ArrayList Algorithms","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.7-implementing-arraylist-algorithms",{"path":169,"title":170,"stem":171},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F8-using-text-files","Using Text Files","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.8-using-text-files",{"path":173,"title":174,"stem":175},"\u002Fshockwave-curriculum\u002Flessons\u002Fch10-2d-arrays\u002F1-2d-array-creation-and-access","2D Array Creation and Access","shockwave-curriculum\u002Flessons\u002Fch10-2d-arrays\u002F10.1-2d-array-creation-and-access",{"path":177,"title":178,"stem":179},"\u002Fshockwave-curriculum\u002Flessons\u002Fch10-2d-arrays\u002F2-2d-array-traversals-nested-loops","2D Array Traversals: Nested Loops","shockwave-curriculum\u002Flessons\u002Fch10-2d-arrays\u002F10.2-2d-array-traversals-nested-loops",{"path":181,"title":182,"stem":183},"\u002Fshockwave-curriculum\u002Flessons\u002Fch10-2d-arrays\u002F3-implementing-2d-array-algorithms","Implementing 2D Array Algorithms","shockwave-curriculum\u002Flessons\u002Fch10-2d-arrays\u002F10.3-implementing-2d-array-algorithms",{"path":185,"title":186,"stem":187},"\u002Fshockwave-curriculum\u002Flessons\u002Fch11-enums-named-choices\u002F11-enums-named-choices","Enums: Named Choices","shockwave-curriculum\u002Flessons\u002Fch11-enums-named-choices\u002F11-enums-named-choices",{"path":189,"title":190,"stem":191},"\u002Fshockwave-curriculum\u002Flessons\u002Fch12-exceptions-and-try-catch\u002F12-exceptions-and-try-catch","Exceptions & try\u002Fcatch","shockwave-curriculum\u002Flessons\u002Fch12-exceptions-and-try-catch\u002F12-exceptions-and-try-catch",{"path":193,"title":194,"stem":195},"\u002Fshockwave-curriculum\u002Flessons\u002Fch13-common-gotchas\u002F13-common-gotchas","Common Gotchas","shockwave-curriculum\u002Flessons\u002Fch13-common-gotchas\u002F13-common-gotchas",{"path":197,"title":198,"stem":199},"\u002Fshockwave-curriculum\u002Flessons\u002Fch14-why-design-patterns\u002F14-why-design-patterns","Why Design Patterns?","shockwave-curriculum\u002Flessons\u002Fch14-why-design-patterns\u002F14-why-design-patterns",{"path":201,"title":202,"stem":203},"\u002Fshockwave-curriculum\u002Flessons\u002Fch15-advanced-collections\u002F15-advanced-collections","Advanced Collections (Set\u002FQueue\u002FMap)","shockwave-curriculum\u002Flessons\u002Fch15-advanced-collections\u002F15-advanced-collections",{"path":205,"title":206,"stem":207},"\u002Fshockwave-curriculum\u002Flessons\u002Fch16-writing-your-own-generics\u002F16-writing-your-own-generics","Writing Your Own Generics","shockwave-curriculum\u002Flessons\u002Fch16-writing-your-own-generics\u002F16-writing-your-own-generics",{"path":209,"title":210,"stem":211},"\u002Fshockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F1-inheritance-superclass-subclass","Inheritance, Superclass, Subclass","shockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F17.1-inheritance-superclass-subclass",{"path":213,"title":214,"stem":215},"\u002Fshockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F2-inheritance-and-constructors","Inheritance and Constructors","shockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F17.2-inheritance-and-constructors",{"path":217,"title":218,"stem":219},"\u002Fshockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F3-inheritance-hierarchies","Inheritance Hierarchies","shockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F17.3-inheritance-hierarchies",{"path":221,"title":222,"stem":223},"\u002Fshockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F4-object-superclass","Object Superclass","shockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F17.4-object-superclass",{"path":225,"title":226,"stem":227},"\u002Fshockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F5-abstract-classes-and-methods","Abstract Classes and Methods","shockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F17.5-abstract-classes-and-methods",{"path":229,"title":230,"stem":231},"\u002Fshockwave-curriculum\u002Flessons\u002Fch18-polymorphism-many-forms\u002F1-overriding-methods","Overriding Methods","shockwave-curriculum\u002Flessons\u002Fch18-polymorphism-many-forms\u002F18.1-overriding-methods",{"path":233,"title":234,"stem":235},"\u002Fshockwave-curriculum\u002Flessons\u002Fch18-polymorphism-many-forms\u002F2-super-keyword","super Keyword","shockwave-curriculum\u002Flessons\u002Fch18-polymorphism-many-forms\u002F18.2-super-keyword",{"path":237,"title":238,"stem":239},"\u002Fshockwave-curriculum\u002Flessons\u002Fch18-polymorphism-many-forms\u002F3-polymorphism","Polymorphism","shockwave-curriculum\u002Flessons\u002Fch18-polymorphism-many-forms\u002F18.3-polymorphism",{"path":241,"title":242,"stem":243},"\u002Fshockwave-curriculum\u002Flessons\u002Fch19-interfaces-as-contracts\u002F19-interfaces-as-contracts","Interfaces as Contracts","shockwave-curriculum\u002Flessons\u002Fch19-interfaces-as-contracts\u002F19-interfaces-as-contracts",{"path":245,"title":246,"stem":247},"\u002Fshockwave-curriculum\u002Flessons\u002Fch19-interfaces-as-contracts\u002F1-lambdas-and-method-references","Lambdas & Method References","shockwave-curriculum\u002Flessons\u002Fch19-interfaces-as-contracts\u002F19.1-lambdas-and-method-references",{"path":249,"title":250,"stem":251},"\u002Fshockwave-curriculum\u002Flessons\u002Fch20-the-io-layer-pattern\u002F20-the-io-layer-pattern","The IO-Layer Pattern","shockwave-curriculum\u002Flessons\u002Fch20-the-io-layer-pattern\u002F20-the-io-layer-pattern",{"path":253,"title":254,"stem":255},"\u002Fshockwave-curriculum\u002Flessons\u002Fch21-static-factories\u002F21-static-factories","Static Factories","shockwave-curriculum\u002Flessons\u002Fch21-static-factories\u002F21-static-factories",{"path":257,"title":258,"stem":259},"\u002Fshockwave-curriculum\u002Flessons\u002Fch22-the-builder-pattern\u002F22-the-builder-pattern","The Builder Pattern","shockwave-curriculum\u002Flessons\u002Fch22-the-builder-pattern\u002F22-the-builder-pattern",{"path":261,"title":262,"stem":263},"\u002Fshockwave-curriculum\u002Flessons\u002Fch23-encapsulation-and-final\u002F1-scope-and-access","Access, final, and Immutability","shockwave-curriculum\u002Flessons\u002Fch23-encapsulation-and-final\u002F23.1-scope-and-access",{"path":265,"title":266,"stem":267},"\u002Fshockwave-curriculum\u002Flessons\u002Fch24-optional-avoiding-null-pointer-exceptions\u002F24-optional-avoiding-null-pointer-exceptions","Optional: Avoiding Null Pointer Exceptions","shockwave-curriculum\u002Flessons\u002Fch24-optional-avoiding-null-pointer-exceptions\u002F24-optional-avoiding-null-pointer-exceptions",{"path":269,"title":270,"stem":271},"\u002Fshockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F1-what-is-command-based-programming","What Is Command-Based Programming?","shockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F25.1-what-is-command-based-programming",{"path":273,"title":274,"stem":275},"\u002Fshockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F2-commands-and-command-compositions","Commands & Command Compositions","shockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F25.2-commands-and-command-compositions",{"path":277,"title":278,"stem":279},"\u002Fshockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F3-the-command-scheduler","The Command Scheduler","shockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F25.3-the-command-scheduler",{"path":281,"title":282,"stem":283},"\u002Fshockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F4-state-machines-logic","State Machines: Logic","shockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F25.4-state-machines-logic",{"path":285,"title":286,"stem":287},"\u002Fshockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F5-managing-transitions","Managing Transitions","shockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F25.5-managing-transitions",{"path":289,"title":290,"stem":291},"\u002Fshockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F6-binding-commands-to-triggers","Binding Commands to Triggers","shockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F25.6-binding-commands-to-triggers",{"path":293,"title":294,"stem":295},"\u002Fshockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F7-structuring-a-command-based-robot-project","Structuring a Command-Based Robot Project","shockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F25.7-structuring-a-command-based-robot-project",{"path":297,"title":298,"stem":299},"\u002Fshockwave-curriculum\u002Flessons\u002Fch26-architecture-takeaways\u002F26-architecture-takeaways","Architecture Takeaways","shockwave-curriculum\u002Flessons\u002Fch26-architecture-takeaways\u002F26-architecture-takeaways",{"path":301,"title":302,"stem":303},"\u002Fshockwave-curriculum\u002Flessons\u002Fch27-program-design-and-abstraction\u002F1-abstraction-and-program-design","Abstraction and Program Design","shockwave-curriculum\u002Flessons\u002Fch27-program-design-and-abstraction\u002F27.1-abstraction-and-program-design",{"path":305,"title":306,"stem":307},"\u002Fshockwave-curriculum\u002Flessons\u002Fch27-program-design-and-abstraction\u002F2-impact-of-program-design","Impact of Program Design","shockwave-curriculum\u002Flessons\u002Fch27-program-design-and-abstraction\u002F27.2-impact-of-program-design",{"path":309,"title":310,"stem":311},"\u002Fshockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F1-searching-algorithms","Searching Algorithms","shockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F28.1-searching-algorithms",{"path":313,"title":314,"stem":315},"\u002Fshockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F2-sorting-algorithms","Sorting Algorithms","shockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F28.2-sorting-algorithms",{"path":317,"title":318,"stem":319},"\u002Fshockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F3-recursion","Recursion","shockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F28.3-recursion",{"path":321,"title":322,"stem":323},"\u002Fshockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F4-recursive-searching-and-sorting","Recursive Searching and Sorting","shockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F28.4-recursive-searching-and-sorting",{"path":325,"title":326,"stem":327},"\u002Fshockwave-curriculum\u002Flessons\u002Fch29-git-and-github-basics\u002F1-coming-soon","Git & GitHub Basics — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch29-git-and-github-basics\u002F29.1-coming-soon",{"path":329,"title":330,"stem":331},"\u002Fshockwave-curriculum\u002Flessons\u002Fch30-git-history-and-merging\u002F1-coming-soon","Git — History & Merging — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch30-git-history-and-merging\u002F30.1-coming-soon",{"path":333,"title":334,"stem":335},"\u002Fshockwave-curriculum\u002Flessons\u002Fch31-dev-environment-and-tooling\u002F1-coming-soon","Dev Environment & Tooling — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch31-dev-environment-and-tooling\u002F31.1-coming-soon",{"path":337,"title":338,"stem":339},"\u002Fshockwave-curriculum\u002Flessons\u002Fch32-unit-testing\u002F1-coming-soon","Unit Testing — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch32-unit-testing\u002F32.1-coming-soon",{"path":341,"title":342,"stem":343},"\u002Fshockwave-curriculum\u002Flessons\u002Fch33-advantagekit-autologging\u002F1-coming-soon","AdvantageKit — AutoLogging — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch33-advantagekit-autologging\u002F33.1-coming-soon",{"path":345,"title":346,"stem":347},"\u002Fshockwave-curriculum\u002Flessons\u002Fch34-log-replay\u002F1-coming-soon","Log Replay — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch34-log-replay\u002F34.1-coming-soon",{"path":349,"title":350,"stem":351},"\u002Fshockwave-curriculum\u002Flessons\u002Fch35-advantagescope-i-visualization\u002F1-coming-soon","AdvantageScope I: Visualization — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch35-advantagescope-i-visualization\u002F35.1-coming-soon",{"path":353,"title":354,"stem":355},"\u002Fshockwave-curriculum\u002Flessons\u002Fch36-advantagescope-ii-custom-3d-assets\u002F1-coming-soon","AdvantageScope II: Custom 3D Assets — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch36-advantagescope-ii-custom-3d-assets\u002F36.1-coming-soon",{"path":357,"title":358,"stem":359},"\u002Fshockwave-curriculum\u002Flessons\u002Fch37-autonomous-i\u002F1-coming-soon","Autonomous I — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch37-autonomous-i\u002F37.1-coming-soon",{"path":361,"title":362,"stem":363},"\u002Fshockwave-curriculum\u002Flessons\u002Fch38-autonomous-ii-pathplanner-and-trajectories\u002F1-coming-soon","Autonomous II: PathPlanner & Trajectories — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch38-autonomous-ii-pathplanner-and-trajectories\u002F38.1-coming-soon",{"path":365,"title":366,"stem":367},"\u002Fshockwave-curriculum\u002Flessons\u002Fch39-control-fundamentals\u002F1-coming-soon","Control Fundamentals — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch39-control-fundamentals\u002F39.1-coming-soon",{"path":369,"title":370,"stem":371},"\u002Fshockwave-curriculum\u002Flessons\u002Fch40-motion-profiles\u002F1-coming-soon","Motion Profiles — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch40-motion-profiles\u002F40.1-coming-soon",{"path":373,"title":374,"stem":375},"\u002Fshockwave-curriculum\u002Flessons\u002Fch41-hardware-fundamentals\u002F1-coming-soon","Hardware Fundamentals — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch41-hardware-fundamentals\u002F41.1-coming-soon",{"path":377,"title":378,"stem":379},"\u002Fshockwave-curriculum\u002Flessons\u002Fch42-photonvision\u002F1-coming-soon","PhotonVision — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch42-photonvision\u002F42.1-coming-soon",{"path":381,"title":382,"stem":383},"\u002Fshockwave-curriculum\u002Flessons\u002Fch43-apriltags-and-pose\u002F1-coming-soon","AprilTags & Pose — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch43-apriltags-and-pose\u002F43.1-coming-soon",{"path":385,"title":386,"stem":387},"\u002Fshockwave-curriculum\u002Flessons\u002Fch44-subsystems-i\u002F1-coming-soon","Subsystems I — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch44-subsystems-i\u002F44.1-coming-soon",{"path":389,"title":390,"stem":391},"\u002Fshockwave-curriculum\u002Flessons\u002Fch45-subsystems-ii-advanced\u002F1-coming-soon","Subsystems II — Advanced — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch45-subsystems-ii-advanced\u002F45.1-coming-soon",{"path":393,"title":394,"stem":395},"\u002Fshockwave-curriculum\u002Flessons\u002Fch46-team-utilities-i\u002F1-coming-soon","Team Utilities I — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch46-team-utilities-i\u002F46.1-coming-soon",{"path":397,"title":398,"stem":399},"\u002Fshockwave-curriculum\u002Flessons\u002Fch47-field-constants\u002F1-coming-soon","Field Constants — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch47-field-constants\u002F47.1-coming-soon",{"path":401,"title":402,"stem":403},"\u002Fshockwave-curriculum\u002Flessons\u002Fch48-troubleshooting-i-runtime-debug\u002F1-coming-soon","Troubleshooting I — Runtime Debug — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch48-troubleshooting-i-runtime-debug\u002F48.1-coming-soon",{"path":405,"title":406,"stem":407},"\u002Fshockwave-curriculum\u002Flessons\u002Fch49-troubleshooting-ii-can-and-sim\u002F1-coming-soon","Troubleshooting II: CAN & Sim — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch49-troubleshooting-ii-can-and-sim\u002F49.1-coming-soon",{"path":409,"title":410,"stem":411},"\u002Fshockwave-curriculum\u002Flessons\u002Fch50-vendor-libraries-talonfx\u002F1-coming-soon","Vendor Libraries: TalonFX — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch50-vendor-libraries-talonfx\u002F50.1-coming-soon",{"path":413,"title":414,"stem":415},"\u002Fshockwave-curriculum\u002Flessons\u002Fch51-robot-alerts\u002F1-coming-soon","Robot Alerts — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch51-robot-alerts\u002F51.1-coming-soon",{"path":417,"title":418,"stem":419},"\u002Fshockwave-curriculum\u002Flessons\u002Fch52-wpilib-commands\u002F1-coming-soon","WPILib Commands — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch52-wpilib-commands\u002F52.1-coming-soon",{"path":421,"title":422,"stem":423},"\u002Fshockwave-curriculum\u002Flessons\u002Fch53-wpilib-geometry\u002F1-coming-soon","WPILib Geometry — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch53-wpilib-geometry\u002F53.1-coming-soon",{"path":425,"title":426,"stem":427},"\u002Fshockwave-curriculum\u002Flessons\u002Fch54-networktables\u002F1-coming-soon","NetworkTables — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch54-networktables\u002F54.1-coming-soon",{"path":429,"title":430,"stem":431},"\u002Fshockwave-curriculum\u002Flessons\u002Fch55-command-scheduler\u002F1-coming-soon","Command Scheduler — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch55-command-scheduler\u002F55.1-coming-soon",{"path":433,"title":434,"stem":435},"\u002Fshockwave-curriculum\u002Flessons\u002Fch56-wpilib-timers\u002F1-coming-soon","WPILib Timers — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch56-wpilib-timers\u002F56.1-coming-soon",{"path":437,"title":438,"stem":439},"\u002Fshockwave-curriculum\u002Flessons\u002Fch57-wpilib-triggers\u002F1-coming-soon","WPILib Triggers — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch57-wpilib-triggers\u002F57.1-coming-soon",{"path":441,"title":442,"stem":443},"\u002Fshockwave-curriculum\u002Flessons\u002Fch58-vendor-units-and-conversions\u002F1-coming-soon","Vendor Units & Conversions — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch58-vendor-units-and-conversions\u002F58.1-coming-soon",[445,449,453,457,461,465,469,473,477,481,485,489,493,497,501,505,509,513,517,521,525,529,533,537,541,545,549,553,557,561,565,569,573,577,581,585,589,593,597,601,605,609,613,617,621,625,629,633,637,641,645,649,653,657,661,665,669,673,677,681,685,689,693,697,701,705,709,713,717,721,725,729,733,737,741,745,749],{"path":446,"title":447,"stem":448},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch01-why-java-for-frc\u002F2-intro-to-algorithms-programming-and-compilers","Intro to Algorithms, Programming and Compilers — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch01-why-java-for-frc\u002F1.2-intro-to-algorithms-programming-and-compilers",{"path":450,"title":451,"stem":452},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F1-variables-and-data-types","Variables & Data Types — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F2.1-variables-and-data-types",{"path":454,"title":455,"stem":456},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F2-expressions-and-output","Expressions & Output — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F2.2-expressions-and-output",{"path":458,"title":459,"stem":460},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F3-assignment-and-input","Assignment & Input — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F2.3-assignment-and-input",{"path":462,"title":463,"stem":464},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F4-casting-and-ranges-of-values","Casting & Ranges of Values — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F2.4-casting-and-ranges-of-values",{"path":466,"title":467,"stem":468},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F5-compound-assignment-operators","Compound Assignment Operators — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F2.5-compound-assignment-operators",{"path":470,"title":471,"stem":472},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch03-apis-libraries-and-documentation\u002F1-apis-and-libraries","APIs and Libraries — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch03-apis-libraries-and-documentation\u002F3.1-apis-and-libraries",{"path":474,"title":475,"stem":476},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch03-apis-libraries-and-documentation\u002F2-documentation-with-comments-and-preconditions","Documentation with Comments and Preconditions — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch03-apis-libraries-and-documentation\u002F3.2-documentation-with-comments-and-preconditions",{"path":478,"title":479,"stem":480},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch03-apis-libraries-and-documentation\u002F3-packages-and-imports","Packages & Imports — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch03-apis-libraries-and-documentation\u002F3.3-packages-and-imports",{"path":482,"title":483,"stem":484},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F1-methods-signatures-and-parameters","Methods, Signatures & Parameters — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F4.1-methods-signatures-and-parameters",{"path":486,"title":487,"stem":488},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F2-calling-class-methods","Calling Class Methods — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F4.2-calling-class-methods",{"path":490,"title":491,"stem":492},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F3-using-the-math-class","Using the Math Class — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F4.3-using-the-math-class",{"path":494,"title":495,"stem":496},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F4-objects-instances-of-classes","Objects — Instances of Classes — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F4.4-objects-instances-of-classes",{"path":498,"title":499,"stem":500},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F5-creating-and-initializing-objects-constructors","Creating & Initializing Objects: Constructors — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F4.5-creating-and-initializing-objects-constructors",{"path":502,"title":503,"stem":504},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F6-calling-instance-methods","Calling Instance Methods — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F4.6-calling-instance-methods",{"path":506,"title":507,"stem":508},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F1-5.2-if-statements-and-for-loops","if Statements & For Loops — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.1-5.2-if-statements-and-for-loops",{"path":510,"title":511,"stem":512},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F10-nested-iteration","Nested Iteration — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.10-nested-iteration",{"path":514,"title":515,"stem":516},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F11-informal-runtime-analysis-of-loops","Informal Runtime Analysis of Loops — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.11-informal-runtime-analysis-of-loops",{"path":518,"title":519,"stem":520},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F12-switch-statements-and-expressions","switch Statements and Expressions — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.12-switch-statements-and-expressions",{"path":522,"title":523,"stem":524},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F3-algorithms-with-selection-and-repetition","Algorithms with Selection and Repetition — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.3-algorithms-with-selection-and-repetition",{"path":526,"title":527,"stem":528},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F4-boolean-expressions","Boolean Expressions — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.4-boolean-expressions",{"path":530,"title":531,"stem":532},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5-nested-if-statements","Nested if Statements — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.5-nested-if-statements",{"path":534,"title":535,"stem":536},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F6-compound-boolean-expressions","Compound Boolean Expressions — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.6-compound-boolean-expressions",{"path":538,"title":539,"stem":540},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F7-comparing-boolean-expressions-de-morgans-laws","Comparing Boolean Expressions (De Morgan's Laws) — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.7-comparing-boolean-expressions-de-morgans-laws",{"path":542,"title":543,"stem":544},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F8-while-loops","While Loops — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.8-while-loops",{"path":546,"title":547,"stem":548},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F9-implementing-selection-and-iteration-algorithms","Implementing Selection and Iteration Algorithms — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.9-implementing-selection-and-iteration-algorithms",{"path":550,"title":551,"stem":552},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch06-strings\u002F1-strings","Strings — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch06-strings\u002F6.1-strings",{"path":554,"title":555,"stem":556},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch06-strings\u002F2-string-algorithms","String Algorithms — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch06-strings\u002F6.2-string-algorithms",{"path":558,"title":559,"stem":560},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F1-anatomy-of-a-java-class","Anatomy of a Java Class — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F7.1-anatomy-of-a-java-class",{"path":562,"title":563,"stem":564},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F2-methods-how-to-write-them","Methods: How to Write Them — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F7.2-methods-how-to-write-them",{"path":566,"title":567,"stem":568},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F3-methods-passing-and-returning-references-of-an-object","Methods: Passing & Returning References of an Object — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F7.3-methods-passing-and-returning-references-of-an-object",{"path":570,"title":571,"stem":572},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F4-class-static-variables-and-methods","Class (static) Variables & Methods — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F7.4-class-static-variables-and-methods",{"path":574,"title":575,"stem":576},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch08-constructors-and-this\u002F1-8.2-constructors-and-this","Constructors & \"this\" — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch08-constructors-and-this\u002F8.1-8.2-constructors-and-this",{"path":578,"title":579,"stem":580},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F1-array-creation-and-access","Array Creation and Access — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.1-array-creation-and-access",{"path":582,"title":583,"stem":584},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F2-arraylist-and-its-methods","ArrayList and its Methods — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.2-arraylist-and-its-methods",{"path":586,"title":587,"stem":588},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F3-optional-hashmap-dictionary-data-structure","HashMap (Dictionary) Data Structure — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.3-optional-hashmap-dictionary-data-structure",{"path":590,"title":591,"stem":592},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F4-array-traversals","Array Traversals — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.4-array-traversals",{"path":594,"title":595,"stem":596},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F5-implementing-array-algorithms","Implementing Array Algorithms — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.5-implementing-array-algorithms",{"path":598,"title":599,"stem":600},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F6-arraylist-traversals","ArrayList Traversals — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.6-arraylist-traversals",{"path":602,"title":603,"stem":604},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F7-implementing-arraylist-algorithms","Implementing ArrayList Algorithms — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.7-implementing-arraylist-algorithms",{"path":606,"title":607,"stem":608},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F8-using-text-files","Using Text Files — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.8-using-text-files",{"path":610,"title":611,"stem":612},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch10-2d-arrays\u002F1-2d-array-creation-and-access","2D Array Creation and Access — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch10-2d-arrays\u002F10.1-2d-array-creation-and-access",{"path":614,"title":615,"stem":616},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch10-2d-arrays\u002F2-2d-array-traversals-nested-loops","2D Array Traversals: Nested Loops — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch10-2d-arrays\u002F10.2-2d-array-traversals-nested-loops",{"path":618,"title":619,"stem":620},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch10-2d-arrays\u002F3-implementing-2d-array-algorithms","Implementing 2D Array Algorithms — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch10-2d-arrays\u002F10.3-implementing-2d-array-algorithms",{"path":622,"title":623,"stem":624},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch11-enums-named-choices\u002F11-enums-named-choices","Enums: Named Choices — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch11-enums-named-choices\u002F11-enums-named-choices",{"path":626,"title":627,"stem":628},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch12-exceptions-and-try-catch\u002F12-exceptions-and-try-catch","Exceptions & try\u002Fcatch — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch12-exceptions-and-try-catch\u002F12-exceptions-and-try-catch",{"path":630,"title":631,"stem":632},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch13-common-gotchas\u002F13-common-gotchas","Common Gotchas — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch13-common-gotchas\u002F13-common-gotchas",{"path":634,"title":635,"stem":636},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch15-advanced-collections\u002F15-advanced-collections","Advanced Collections (Set\u002FQueue\u002FMap) — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch15-advanced-collections\u002F15-advanced-collections",{"path":638,"title":639,"stem":640},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch16-writing-your-own-generics\u002F16-writing-your-own-generics","Writing Your Own Generics — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch16-writing-your-own-generics\u002F16-writing-your-own-generics",{"path":642,"title":643,"stem":644},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F1-inheritance-superclass-subclass","Inheritance, Superclass, Subclass — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F17.1-inheritance-superclass-subclass",{"path":646,"title":647,"stem":648},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F2-inheritance-and-constructors","Inheritance and Constructors — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F17.2-inheritance-and-constructors",{"path":650,"title":651,"stem":652},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F3-inheritance-hierarchies","Inheritance Hierarchies — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F17.3-inheritance-hierarchies",{"path":654,"title":655,"stem":656},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F4-object-superclass","Object Superclass — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F17.4-object-superclass",{"path":658,"title":659,"stem":660},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F5-abstract-classes-and-methods","Abstract Classes and Methods — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F17.5-abstract-classes-and-methods",{"path":662,"title":663,"stem":664},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch18-polymorphism-many-forms\u002F1-overriding-methods","Overriding Methods — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch18-polymorphism-many-forms\u002F18.1-overriding-methods",{"path":666,"title":667,"stem":668},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch18-polymorphism-many-forms\u002F2-super-keyword","super Keyword — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch18-polymorphism-many-forms\u002F18.2-super-keyword",{"path":670,"title":671,"stem":672},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch18-polymorphism-many-forms\u002F3-polymorphism","Polymorphism — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch18-polymorphism-many-forms\u002F18.3-polymorphism",{"path":674,"title":675,"stem":676},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch19-interfaces-as-contracts\u002F19-interfaces-as-contracts","Interfaces as Contracts — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch19-interfaces-as-contracts\u002F19-interfaces-as-contracts",{"path":678,"title":679,"stem":680},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch19-interfaces-as-contracts\u002F1-lambdas-and-method-references","Lambdas & Method References — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch19-interfaces-as-contracts\u002F19.1-lambdas-and-method-references",{"path":682,"title":683,"stem":684},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch20-the-io-layer-pattern\u002F20-the-io-layer-pattern","The IO-Layer Pattern — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch20-the-io-layer-pattern\u002F20-the-io-layer-pattern",{"path":686,"title":687,"stem":688},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch21-static-factories\u002F21-static-factories","Static Factories — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch21-static-factories\u002F21-static-factories",{"path":690,"title":691,"stem":692},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch22-the-builder-pattern\u002F22-the-builder-pattern","The Builder Pattern — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch22-the-builder-pattern\u002F22-the-builder-pattern",{"path":694,"title":695,"stem":696},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch23-encapsulation-and-final\u002F1-scope-and-access","Access, final, and Immutability — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch23-encapsulation-and-final\u002F23.1-scope-and-access",{"path":698,"title":699,"stem":700},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch24-optional-avoiding-null-pointer-exceptions\u002F24-optional-avoiding-null-pointer-exceptions","Optional: Avoiding Null Pointer Exceptions — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch24-optional-avoiding-null-pointer-exceptions\u002F24-optional-avoiding-null-pointer-exceptions",{"path":702,"title":703,"stem":704},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F1-what-is-command-based-programming","What Is Command-Based Programming? — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F25.1-what-is-command-based-programming",{"path":706,"title":707,"stem":708},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F2-commands-and-command-compositions","Commands & Command Compositions — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F25.2-commands-and-command-compositions",{"path":710,"title":711,"stem":712},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F3-the-command-scheduler","The Command Scheduler — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F25.3-the-command-scheduler",{"path":714,"title":715,"stem":716},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F4-state-machines-logic","State Machines: Logic — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F25.4-state-machines-logic",{"path":718,"title":719,"stem":720},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F5-managing-transitions","Managing Transitions — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F25.5-managing-transitions",{"path":722,"title":723,"stem":724},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F6-binding-commands-to-triggers","Binding Commands to Triggers — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F25.6-binding-commands-to-triggers",{"path":726,"title":727,"stem":728},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F7-structuring-a-command-based-robot-project","Structuring a Command-Based Robot Project — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F25.7-structuring-a-command-based-robot-project",{"path":730,"title":731,"stem":732},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch26-architecture-takeaways\u002F26-architecture-takeaways","Architecture Takeaways — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch26-architecture-takeaways\u002F26-architecture-takeaways",{"path":734,"title":735,"stem":736},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch27-program-design-and-abstraction\u002F1-abstraction-and-program-design","Abstraction and Program Design — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch27-program-design-and-abstraction\u002F27.1-abstraction-and-program-design",{"path":738,"title":739,"stem":740},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F1-searching-algorithms","Searching Algorithms — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F28.1-searching-algorithms",{"path":742,"title":743,"stem":744},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F2-sorting-algorithms","Sorting Algorithms — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F28.2-sorting-algorithms",{"path":746,"title":747,"stem":748},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F3-recursion","Recursion — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F28.3-recursion",{"path":750,"title":751,"stem":752},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F4-recursive-searching-and-sorting","Recursive Searching and Sorting — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F28.4-recursive-searching-and-sorting",[754,758,762,766,770,774,778,782,786,790,794,798,802,806,810,814,818,822,826,830,834,838,842,846,850,854,858,862,866,870,874,878,882,886,890,894,898,902,906,910,914,918,922,926,930,934,938,942,946,950,954,958,962,966,970,974,978,982,986,990,994,998,1002,1006,1010,1014,1018,1022,1026,1030,1034,1038,1042,1046,1050,1054,1058,1062,1066],{"path":755,"title":756,"stem":757},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch01-why-java-for-frc\u002F2-intro-to-algorithms-programming-and-compilers","Intro to Algorithms, Programming and Compilers — Exercises","shockwave-curriculum\u002Fexercises\u002Fch01-why-java-for-frc\u002F1.2-intro-to-algorithms-programming-and-compilers",{"path":759,"title":760,"stem":761},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F1-variables-and-data-types","Variables & Data Types — Exercises","shockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F2.1-variables-and-data-types",{"path":763,"title":764,"stem":765},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F2-expressions-and-output","Expressions & Output — Exercises","shockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F2.2-expressions-and-output",{"path":767,"title":768,"stem":769},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F3-assignment-and-input","Assignment & Input — Exercises","shockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F2.3-assignment-and-input",{"path":771,"title":772,"stem":773},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F4-casting-and-ranges-of-values","Casting & Ranges of Values — Exercises","shockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F2.4-casting-and-ranges-of-values",{"path":775,"title":776,"stem":777},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F5-compound-assignment-operators","Compound Assignment Operators — Exercises","shockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F2.5-compound-assignment-operators",{"path":779,"title":780,"stem":781},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch03-apis-libraries-and-documentation\u002F1-apis-and-libraries","APIs and Libraries — Exercises","shockwave-curriculum\u002Fexercises\u002Fch03-apis-libraries-and-documentation\u002F3.1-apis-and-libraries",{"path":783,"title":784,"stem":785},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch03-apis-libraries-and-documentation\u002F2-documentation-with-comments-and-preconditions","Documentation with Comments and Preconditions — Exercises","shockwave-curriculum\u002Fexercises\u002Fch03-apis-libraries-and-documentation\u002F3.2-documentation-with-comments-and-preconditions",{"path":787,"title":788,"stem":789},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch03-apis-libraries-and-documentation\u002F3-packages-and-imports","Packages & Imports — Exercises","shockwave-curriculum\u002Fexercises\u002Fch03-apis-libraries-and-documentation\u002F3.3-packages-and-imports",{"path":791,"title":792,"stem":793},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F1-methods-signatures-and-parameters","Methods, Signatures & Parameters — Exercises","shockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F4.1-methods-signatures-and-parameters",{"path":795,"title":796,"stem":797},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F2-calling-class-methods","Calling Class Methods — Exercises","shockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F4.2-calling-class-methods",{"path":799,"title":800,"stem":801},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F3-using-the-math-class","Using the Math Class — Exercises","shockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F4.3-using-the-math-class",{"path":803,"title":804,"stem":805},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F4-objects-instances-of-classes","Objects — Instances of Classes — Exercises","shockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F4.4-objects-instances-of-classes",{"path":807,"title":808,"stem":809},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F5-creating-and-initializing-objects-constructors","Creating & Initializing Objects: Constructors — Exercises","shockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F4.5-creating-and-initializing-objects-constructors",{"path":811,"title":812,"stem":813},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F6-calling-instance-methods","Calling Instance Methods — Exercises","shockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F4.6-calling-instance-methods",{"path":815,"title":816,"stem":817},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F1-5.2-if-statements-and-for-loops","if Statements & For Loops — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.1-5.2-if-statements-and-for-loops",{"path":819,"title":820,"stem":821},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F10-nested-iteration","Nested Iteration — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.10-nested-iteration",{"path":823,"title":824,"stem":825},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F11-informal-runtime-analysis-of-loops","Informal Runtime Analysis of Loops — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.11-informal-runtime-analysis-of-loops",{"path":827,"title":828,"stem":829},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F12-switch-statements-and-expressions","switch Statements and Expressions — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.12-switch-statements-and-expressions",{"path":831,"title":832,"stem":833},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F3-algorithms-with-selection-and-repetition","Algorithms with Selection and Repetition — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.3-algorithms-with-selection-and-repetition",{"path":835,"title":836,"stem":837},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F4-boolean-expressions","Boolean Expressions — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.4-boolean-expressions",{"path":839,"title":840,"stem":841},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5-nested-if-statements","Nested if Statements — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.5-nested-if-statements",{"path":843,"title":844,"stem":845},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F6-compound-boolean-expressions","Compound Boolean Expressions — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.6-compound-boolean-expressions",{"path":847,"title":848,"stem":849},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F7-comparing-boolean-expressions-de-morgans-laws","Comparing Boolean Expressions (De Morgan's Laws) — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.7-comparing-boolean-expressions-de-morgans-laws",{"path":851,"title":852,"stem":853},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F8-while-loops","While Loops — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.8-while-loops",{"path":855,"title":856,"stem":857},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F9-implementing-selection-and-iteration-algorithms","Implementing Selection and Iteration Algorithms — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.9-implementing-selection-and-iteration-algorithms",{"path":859,"title":860,"stem":861},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch06-strings\u002F1-strings","Strings — Exercises","shockwave-curriculum\u002Fexercises\u002Fch06-strings\u002F6.1-strings",{"path":863,"title":864,"stem":865},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch06-strings\u002F2-string-algorithms","String Algorithms — Exercises","shockwave-curriculum\u002Fexercises\u002Fch06-strings\u002F6.2-string-algorithms",{"path":867,"title":868,"stem":869},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F1-anatomy-of-a-java-class","Anatomy of a Java Class — Exercises","shockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F7.1-anatomy-of-a-java-class",{"path":871,"title":872,"stem":873},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F2-methods-how-to-write-them","Methods: How to Write Them — Exercises","shockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F7.2-methods-how-to-write-them",{"path":875,"title":876,"stem":877},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F3-methods-passing-and-returning-references-of-an-object","Methods: Passing & Returning References of an Object — Exercises","shockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F7.3-methods-passing-and-returning-references-of-an-object",{"path":879,"title":880,"stem":881},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F4-class-static-variables-and-methods","Class (static) Variables & Methods — Exercises","shockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F7.4-class-static-variables-and-methods",{"path":883,"title":884,"stem":885},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch08-constructors-and-this\u002F1-8.2-constructors-and-this","Constructors & \"this\" — Exercises","shockwave-curriculum\u002Fexercises\u002Fch08-constructors-and-this\u002F8.1-8.2-constructors-and-this",{"path":887,"title":888,"stem":889},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F1-array-creation-and-access","Array Creation and Access — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.1-array-creation-and-access",{"path":891,"title":892,"stem":893},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F2-arraylist-and-its-methods","ArrayList and its Methods — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.2-arraylist-and-its-methods",{"path":895,"title":896,"stem":897},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F3-optional-hashmap-dictionary-data-structure","HashMap (Dictionary) Data Structure — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.3-optional-hashmap-dictionary-data-structure",{"path":899,"title":900,"stem":901},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F4-array-traversals","Array Traversals — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.4-array-traversals",{"path":903,"title":904,"stem":905},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F5-implementing-array-algorithms","Implementing Array Algorithms — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.5-implementing-array-algorithms",{"path":907,"title":908,"stem":909},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F6-arraylist-traversals","ArrayList Traversals — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.6-arraylist-traversals",{"path":911,"title":912,"stem":913},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F7-implementing-arraylist-algorithms","Implementing ArrayList Algorithms — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.7-implementing-arraylist-algorithms",{"path":915,"title":916,"stem":917},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F8-using-text-files","Using Text Files — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.8-using-text-files",{"path":919,"title":920,"stem":921},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch10-2d-arrays\u002F1-2d-array-creation-and-access","2D Array Creation and Access — Exercises","shockwave-curriculum\u002Fexercises\u002Fch10-2d-arrays\u002F10.1-2d-array-creation-and-access",{"path":923,"title":924,"stem":925},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch10-2d-arrays\u002F2-2d-array-traversals-nested-loops","2D Array Traversals: Nested Loops — Exercises","shockwave-curriculum\u002Fexercises\u002Fch10-2d-arrays\u002F10.2-2d-array-traversals-nested-loops",{"path":927,"title":928,"stem":929},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch10-2d-arrays\u002F3-implementing-2d-array-algorithms","Implementing 2D Array Algorithms — Exercises","shockwave-curriculum\u002Fexercises\u002Fch10-2d-arrays\u002F10.3-implementing-2d-array-algorithms",{"path":931,"title":932,"stem":933},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch11-enums-named-choices\u002F11-enums-named-choices","Enums: Named Choices — Exercises","shockwave-curriculum\u002Fexercises\u002Fch11-enums-named-choices\u002F11-enums-named-choices",{"path":935,"title":936,"stem":937},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch12-exceptions-and-try-catch\u002F12-exceptions-and-try-catch","Exceptions & try\u002Fcatch — Exercises","shockwave-curriculum\u002Fexercises\u002Fch12-exceptions-and-try-catch\u002F12-exceptions-and-try-catch",{"path":939,"title":940,"stem":941},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch13-common-gotchas\u002F13-common-gotchas","Common Gotchas — Exercises","shockwave-curriculum\u002Fexercises\u002Fch13-common-gotchas\u002F13-common-gotchas",{"path":943,"title":944,"stem":945},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch14-why-design-patterns\u002F14-why-design-patterns","Why Design Patterns? — Exercises","shockwave-curriculum\u002Fexercises\u002Fch14-why-design-patterns\u002F14-why-design-patterns",{"path":947,"title":948,"stem":949},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch15-advanced-collections\u002F15-advanced-collections","Advanced Collections (Set\u002FQueue\u002FMap) — Exercises","shockwave-curriculum\u002Fexercises\u002Fch15-advanced-collections\u002F15-advanced-collections",{"path":951,"title":952,"stem":953},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch16-writing-your-own-generics\u002F16-writing-your-own-generics","Writing Your Own Generics — Exercises","shockwave-curriculum\u002Fexercises\u002Fch16-writing-your-own-generics\u002F16-writing-your-own-generics",{"path":955,"title":956,"stem":957},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F1-inheritance-superclass-subclass","Inheritance, Superclass, Subclass — Exercises","shockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F17.1-inheritance-superclass-subclass",{"path":959,"title":960,"stem":961},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F2-inheritance-and-constructors","Inheritance and Constructors — Exercises","shockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F17.2-inheritance-and-constructors",{"path":963,"title":964,"stem":965},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F3-inheritance-hierarchies","Inheritance Hierarchies — Exercises","shockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F17.3-inheritance-hierarchies",{"path":967,"title":968,"stem":969},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F4-object-superclass","Object Superclass — Exercises","shockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F17.4-object-superclass",{"path":971,"title":972,"stem":973},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F5-abstract-classes-and-methods","Abstract Classes and Methods — Exercises","shockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F17.5-abstract-classes-and-methods",{"path":975,"title":976,"stem":977},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch18-polymorphism-many-forms\u002F1-overriding-methods","Overriding Methods — Exercises","shockwave-curriculum\u002Fexercises\u002Fch18-polymorphism-many-forms\u002F18.1-overriding-methods",{"path":979,"title":980,"stem":981},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch18-polymorphism-many-forms\u002F2-super-keyword","super Keyword — Exercises","shockwave-curriculum\u002Fexercises\u002Fch18-polymorphism-many-forms\u002F18.2-super-keyword",{"path":983,"title":984,"stem":985},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch18-polymorphism-many-forms\u002F3-polymorphism","Polymorphism — Exercises","shockwave-curriculum\u002Fexercises\u002Fch18-polymorphism-many-forms\u002F18.3-polymorphism",{"path":987,"title":988,"stem":989},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch19-interfaces-as-contracts\u002F19-interfaces-as-contracts","Interfaces as Contracts — Exercises","shockwave-curriculum\u002Fexercises\u002Fch19-interfaces-as-contracts\u002F19-interfaces-as-contracts",{"path":991,"title":992,"stem":993},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch19-interfaces-as-contracts\u002F1-lambdas-and-method-references","Lambdas & Method References — Exercises","shockwave-curriculum\u002Fexercises\u002Fch19-interfaces-as-contracts\u002F19.1-lambdas-and-method-references",{"path":995,"title":996,"stem":997},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch20-the-io-layer-pattern\u002F20-the-io-layer-pattern","The IO-Layer Pattern — Exercises","shockwave-curriculum\u002Fexercises\u002Fch20-the-io-layer-pattern\u002F20-the-io-layer-pattern",{"path":999,"title":1000,"stem":1001},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch21-static-factories\u002F21-static-factories","Static Factories — Exercises","shockwave-curriculum\u002Fexercises\u002Fch21-static-factories\u002F21-static-factories",{"path":1003,"title":1004,"stem":1005},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch22-the-builder-pattern\u002F22-the-builder-pattern","The Builder Pattern — Exercises","shockwave-curriculum\u002Fexercises\u002Fch22-the-builder-pattern\u002F22-the-builder-pattern",{"path":1007,"title":1008,"stem":1009},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch23-encapsulation-and-final\u002F1-scope-and-access","Access, final, and Immutability — Exercises","shockwave-curriculum\u002Fexercises\u002Fch23-encapsulation-and-final\u002F23.1-scope-and-access",{"path":1011,"title":1012,"stem":1013},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch24-optional-avoiding-null-pointer-exceptions\u002F24-optional-avoiding-null-pointer-exceptions","Optional: Avoiding Null Pointer Exceptions — Exercises","shockwave-curriculum\u002Fexercises\u002Fch24-optional-avoiding-null-pointer-exceptions\u002F24-optional-avoiding-null-pointer-exceptions",{"path":1015,"title":1016,"stem":1017},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F1-what-is-command-based-programming","What Is Command-Based Programming? — Exercises","shockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F25.1-what-is-command-based-programming",{"path":1019,"title":1020,"stem":1021},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F2-commands-and-command-compositions","Commands & Command Compositions — Exercises","shockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F25.2-commands-and-command-compositions",{"path":1023,"title":1024,"stem":1025},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F3-the-command-scheduler","The Command Scheduler — Exercises","shockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F25.3-the-command-scheduler",{"path":1027,"title":1028,"stem":1029},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F4-state-machines-logic","State Machines: Logic — Exercises","shockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F25.4-state-machines-logic",{"path":1031,"title":1032,"stem":1033},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F5-managing-transitions","Managing Transitions — Exercises","shockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F25.5-managing-transitions",{"path":1035,"title":1036,"stem":1037},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F6-binding-commands-to-triggers","Binding Commands to Triggers — Exercises","shockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F25.6-binding-commands-to-triggers",{"path":1039,"title":1040,"stem":1041},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F7-structuring-a-command-based-robot-project","Structuring a Command-Based Robot Project — Exercises","shockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F25.7-structuring-a-command-based-robot-project",{"path":1043,"title":1044,"stem":1045},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch26-architecture-takeaways\u002F26-architecture-takeaways","Architecture Takeaways — Exercises","shockwave-curriculum\u002Fexercises\u002Fch26-architecture-takeaways\u002F26-architecture-takeaways",{"path":1047,"title":1048,"stem":1049},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch27-program-design-and-abstraction\u002F1-abstraction-and-program-design","Abstraction and Program Design — Exercises","shockwave-curriculum\u002Fexercises\u002Fch27-program-design-and-abstraction\u002F27.1-abstraction-and-program-design",{"path":1051,"title":1052,"stem":1053},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch27-program-design-and-abstraction\u002F2-impact-of-program-design","Impact of Program Design — Exercises","shockwave-curriculum\u002Fexercises\u002Fch27-program-design-and-abstraction\u002F27.2-impact-of-program-design",{"path":1055,"title":1056,"stem":1057},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F1-searching-algorithms","Searching Algorithms — Exercises","shockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F28.1-searching-algorithms",{"path":1059,"title":1060,"stem":1061},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F2-sorting-algorithms","Sorting Algorithms — Exercises","shockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F28.2-sorting-algorithms",{"path":1063,"title":1064,"stem":1065},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F3-recursion","Recursion — Exercises","shockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F28.3-recursion",{"path":1067,"title":1068,"stem":1069},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F4-recursive-searching-and-sorting","Recursive Searching and Sorting — Exercises","shockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F28.4-recursive-searching-and-sorting",{"id":1071,"title":278,"body":1072,"description":1112,"extension":1665,"meta":1666,"navigation":1669,"path":277,"seo":1670,"stem":279,"__hash__":1671},"lessons\u002Fshockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F25.3-the-command-scheduler.md",{"type":1073,"value":1074,"toc":1653},"minimark",[1075,1079,1084,1106,1147,1157,1161,1168,1224,1247,1251,1270,1286,1293,1333,1354,1358,1369,1394,1409,1412,1416,1439,1468,1472,1479,1482,1490,1501,1510,1513,1517,1562,1566,1612,1649],[1076,1077,278],"h1",{"id":1078},"the-command-scheduler",[1080,1081,1083],"h2",{"id":1082},"the-engine-underneath-everything","The Engine Underneath Everything",[1085,1086,1087,1088,1092,1093,1097,1098,1101,1102,1105],"p",{},"The ",[1089,1090,1091],"strong",{},"default scheduler",", ",[1094,1095,1096],"code",{},"Scheduler.getDefault()",", is the object that actually runs commands — everything in Lessons 25.1-25.2 depends on it silently doing its job every single loop. Every mechanism and trigger uses it unless you deliberately create a separate one (",[1094,1099,1100],{},"Scheduler.createIndependentScheduler()",", mostly useful in tests). It must be told to run explicitly, from ",[1094,1103,1104],{},"robotPeriodic()"," (Lesson 25.7 shows exactly where), or nothing in the whole command-based framework ever executes:",[1107,1108,1113],"pre",{"className":1109,"code":1110,"language":1111,"meta":1112,"style":1112},"language-java shiki shiki-themes github-light github-dark","@Override\npublic void robotPeriodic()\n{\n    Scheduler.getDefault().run();\n}\n","java","",[1094,1114,1115,1123,1129,1135,1141],{"__ignoreMap":1112},[1116,1117,1120],"span",{"class":1118,"line":1119},"line",1,[1116,1121,1122],{},"@Override\n",[1116,1124,1126],{"class":1118,"line":1125},2,[1116,1127,1128],{},"public void robotPeriodic()\n",[1116,1130,1132],{"class":1118,"line":1131},3,[1116,1133,1134],{},"{\n",[1116,1136,1138],{"class":1118,"line":1137},4,[1116,1139,1140],{},"    Scheduler.getDefault().run();\n",[1116,1142,1144],{"class":1118,"line":1143},5,[1116,1145,1146],{},"}\n",[1085,1148,1149,1152,1153,1156],{},[1089,1150,1151],{},"In v2 code you'll see"," ",[1094,1154,1155],{},"CommandScheduler.getInstance().run()"," in this same spot — same job, older name.",[1080,1158,1160],{"id":1159},"one-scheduler-loop-step-by-step","One Scheduler Loop, Step by Step",[1085,1162,1163,1164,1167],{},"Every 20ms (WPILib's default loop rate), one call to ",[1094,1165,1166],{},"run()"," works through these steps, always in this order (slightly simplified from the source):",[1169,1170,1171,1178,1188,1202,1208,1214],"ol",{},[1172,1173,1174,1177],"li",{},[1089,1175,1176],{},"Clean up."," Cancel any commands and trigger bindings whose scope has ended (see \"Scopes\" below). While the robot is disabled, also cancel commands on mechanisms that aren't allowed to move while disabled.",[1172,1179,1180,1183,1184,1187],{},[1089,1181,1182],{},"Run periodic side jobs"," added with ",[1094,1185,1186],{},"addPeriodic(...)"," — data updates such as odometry or logging.",[1172,1189,1190,1193,1194,1197,1198,1201],{},[1089,1191,1192],{},"Poll triggers."," Every registered ",[1094,1195,1196],{},"Trigger"," (Lesson 25.6) is checked. A binding whose condition changed ",[1089,1199,1200],{},"queues"," its command — it doesn't start it yet — or cancels a command it started earlier.",[1172,1203,1204,1207],{},[1089,1205,1206],{},"Queue default commands"," for every mechanism that has nothing running or queued.",[1172,1209,1210,1213],{},[1089,1211,1212],{},"Start the queued commands."," Requirement conflicts are settled here, by priority (next section). A running command that loses its mechanism is canceled now. If two queued commands with the same priority need the same mechanism, the one queued last wins.",[1172,1215,1216,1219,1220,1223],{},[1089,1217,1218],{},"Run every running command",", one at a time, until each one calls ",[1094,1221,1222],{},"coroutine.yield()"," or finishes.",[1085,1225,1226,1227,1231,1232,1234,1235,1238,1239,1242,1243,1246],{},"Because triggers only ",[1228,1229,1230],"em",{},"queue"," commands in step 3, a command bound to a button starts in step 5 of the same ",[1094,1233,1166],{}," and gets its first turn in step 6 — still within the same loop. One exception: a command started from ",[1228,1236,1237],{},"inside"," another command's body (with ",[1094,1240,1241],{},"coroutine.await(...)"," or ",[1094,1244,1245],{},"coroutine.fork(...)",") skips the queue and starts immediately.",[1080,1248,1250],{"id":1249},"priorities-who-wins-a-requirement-conflict","Priorities: Who Wins a Requirement Conflict",[1085,1252,1253,1254,1257,1258,1261,1262,1265,1266,1269],{},"Every command has an integer ",[1089,1255,1256],{},"priority",". The default is ",[1094,1259,1260],{},"Command.DEFAULT_PRIORITY"," (0); the extremes are ",[1094,1263,1264],{},"Command.LOWEST_PRIORITY"," and ",[1094,1267,1268],{},"Command.HIGHEST_PRIORITY",". When a new command needs a mechanism that a running command already has, the scheduler compares them:",[1271,1272,1273,1280],"ul",{},[1172,1274,1275,1276,1279],{},"New command's priority is ",[1089,1277,1278],{},"equal or higher"," — the running command is canceled and the new one takes over.",[1172,1281,1275,1282,1285],{},[1089,1283,1284],{},"lower"," — the new command simply isn't scheduled, and the running one keeps going.",[1085,1287,1288,1289,1292],{},"Priority is set while building the command, with ",[1094,1290,1291],{},".withPriority(...)",":",[1107,1294,1296],{"className":1109,"code":1295,"language":1111,"meta":1112,"style":1112},"public Command lowBatteryWarning()\n{\n    return run(coroutine -> {\n        showRed();\n        coroutine.wait(Seconds.of(2));\n    }).withPriority(10).named(\"Low Battery Warning\"); \u002F\u002F beats any priority-0 LED command\n}\n",[1094,1297,1298,1303,1307,1312,1317,1322,1328],{"__ignoreMap":1112},[1116,1299,1300],{"class":1118,"line":1119},[1116,1301,1302],{},"public Command lowBatteryWarning()\n",[1116,1304,1305],{"class":1118,"line":1125},[1116,1306,1134],{},[1116,1308,1309],{"class":1118,"line":1131},[1116,1310,1311],{},"    return run(coroutine -> {\n",[1116,1313,1314],{"class":1118,"line":1137},[1116,1315,1316],{},"        showRed();\n",[1116,1318,1319],{"class":1118,"line":1143},[1116,1320,1321],{},"        coroutine.wait(Seconds.of(2));\n",[1116,1323,1325],{"class":1118,"line":1324},6,[1116,1326,1327],{},"    }).withPriority(10).named(\"Low Battery Warning\"); \u002F\u002F beats any priority-0 LED command\n",[1116,1329,1331],{"class":1118,"line":1330},7,[1116,1332,1146],{},[1085,1334,1335,1337,1338,1341,1342,1345,1346,1349,1350,1353],{},[1089,1336,1151],{}," this job done by an \"interruption behavior\" instead: ",[1094,1339,1340],{},"InterruptionBehavior.CANCEL_SELF"," (the running command gives way) or ",[1094,1343,1344],{},"CANCEL_INCOMING"," (the new command is refused) — spelled ",[1094,1347,1348],{},"kCancelSelf","\u002F",[1094,1351,1352],{},"kCancelIncoming"," in code from 2026 and earlier.",[1080,1355,1357],{"id":1356},"default-commands","Default Commands",[1085,1359,1360,1361,1364,1365,1368],{},"A mechanism's ",[1089,1362,1363],{},"default command"," runs whenever no other command requires that mechanism. If you never set one, the mechanism simply sits unused whenever nothing requires it. You set one with ",[1094,1366,1367],{},"setDefaultCommand(...)",", once, during setup:",[1107,1370,1372],{"className":1109,"code":1371,"language":1111,"meta":1112,"style":1112},"drive.setDefaultCommand(\n    drive.runRepeatedly(() -> drive.arcade(forward.getAsDouble(), turn.getAsDouble()))\n        .withPriority(Command.LOWEST_PRIORITY)\n        .named(\"Arcade Drive\"));\n",[1094,1373,1374,1379,1384,1389],{"__ignoreMap":1112},[1116,1375,1376],{"class":1118,"line":1119},[1116,1377,1378],{},"drive.setDefaultCommand(\n",[1116,1380,1381],{"class":1118,"line":1125},[1116,1382,1383],{},"    drive.runRepeatedly(() -> drive.arcade(forward.getAsDouble(), turn.getAsDouble()))\n",[1116,1385,1386],{"class":1118,"line":1131},[1116,1387,1388],{},"        .withPriority(Command.LOWEST_PRIORITY)\n",[1116,1390,1391],{"class":1118,"line":1137},[1116,1392,1393],{},"        .named(\"Arcade Drive\"));\n",[1085,1395,1396,1397,1400,1401,1404,1405,1408],{},"Give a default command a priority ",[1228,1398,1399],{},"below"," the default — usually ",[1094,1402,1403],{},"LOWEST_PRIORITY"," — so any ordinary command can take the mechanism from it. Once that other command ends, the next time step 4 runs it queues the default command again, and the default command starts over from the top of its body. A default command must require its own mechanism and no other; ",[1094,1406,1407],{},"setDefaultCommand"," throws an error otherwise.",[1085,1410,1411],{},"This \"runs every loop, lowest priority, gives way to anything else\" shape is exactly what Lesson 25.5 uses to run a mechanism's state machine.",[1080,1413,1415],{"id":1414},"how-a-command-ends-finished-or-canceled","How a Command Ends: Finished or Canceled",[1085,1417,1418,1419,1422,1423,1426,1427,1430,1431,1434,1435,1438],{},"A command ",[1089,1420,1421],{},"finishes"," when its body returns. It is ",[1089,1424,1425],{},"canceled"," when something stops it early: a ",[1094,1428,1429],{},"whileTrue"," button is released, an ",[1094,1432,1433],{},"until(...)"," condition or timeout fires, a higher-or-equal-priority command takes its mechanism, or code calls ",[1094,1436,1437],{},"Scheduler.getDefault().cancel(command)",". A canceled command stops wherever it last yielded — the code after its loop never runs.",[1085,1440,1441,1442,1445,1446,1449,1450,1453,1454,1265,1457,1460,1461,1463,1464,1467],{},"That's why cleanup belongs in ",[1094,1443,1444],{},"whenExited(...)"," (runs on every exit) or ",[1094,1447,1448],{},"whenCanceled(...)"," (runs only when stopped early) from Lesson 25.2. A class that implements ",[1094,1451,1452],{},"Command"," directly gets the same two hooks as the methods ",[1094,1455,1456],{},"onExit()",[1094,1458,1459],{},"onCancel()",". ",[1089,1462,1151],{}," a single ",[1094,1465,1466],{},"end(boolean interrupted)"," method doing both jobs.",[1080,1469,1471],{"id":1470},"scopes-commands-that-clean-up-after-themselves","Scopes: Commands That Clean Up After Themselves",[1085,1473,1474,1475,1478],{},"v3 tracks the ",[1089,1476,1477],{},"scope"," a command or trigger binding was created in, and cancels it automatically when that scope ends. A command scheduled during autonomous is canceled when autonomous ends; a trigger binding created inside an opmode (Lesson 25.7) only works while that opmode is selected; a command started by another command never outlives it. So there's no \"remember to cancel the autonomous command when teleop starts\" step to forget.",[1085,1480,1481],{},"Alpha note: scopes are one of the newest parts of v3 (the robot-mode scopes landed in September 2026), so the exact rules may still change.",[1080,1483,1485,1486,1489],{"id":1484},"periodic-side-jobs-addperiodic-is-for-data-not-motors","Periodic Side Jobs: ",[1094,1487,1488],{},"addPeriodic"," Is for Data, Not Motors",[1085,1491,1492,1493,1496,1497,1500],{},"v3 mechanisms have no ",[1094,1494,1495],{},"periodic()"," method. A mechanism's getters usually just read their sensor when called, so a command always sees a fresh value. For work that has to happen every loop but doesn't ",[1228,1498,1499],{},"control"," anything — updating odometry, logging, filling an LED data buffer — register a side job once during setup:",[1107,1502,1504],{"className":1109,"code":1503,"language":1111,"meta":1112,"style":1112},"Scheduler.getDefault().addPeriodic(() -> drive.updateOdometry());\n",[1094,1505,1506],{"__ignoreMap":1112},[1116,1507,1508],{"class":1118,"line":1119},[1116,1509,1503],{},[1085,1511,1512],{},"Side jobs run in step 2, before triggers and commands, so commands in step 6 see this loop's data. They must never drive a motor, though: a side job requires no mechanisms, so it would bypass the whole requirement system. Anything that controls a mechanism every loop belongs in a command — often its default command.",[1080,1514,1516],{"id":1515},"common-pitfalls","Common Pitfalls",[1271,1518,1519,1532,1541,1553],{},[1172,1520,1521,1531],{},[1089,1522,1523,1524,1527,1528,1530],{},"Forgetting to call ",[1094,1525,1526],{},"Scheduler.getDefault().run()"," in ",[1094,1529,1104],{},"."," Without this one line, nothing in the entire command-based framework does anything — commands never run, triggers never fire.",[1172,1533,1534,1537,1538,1540],{},[1089,1535,1536],{},"Assuming a trigger starts its command the instant its condition changes."," The trigger only ",[1228,1539,1200],{}," the command in step 3; it starts in step 5 — and if another command with the same priority that needs the same mechanism is queued later in that loop, the later one wins.",[1172,1542,1543,1548,1549,1242,1551,1530],{},[1089,1544,1545,1546,1530],{},"Putting cleanup after the loop instead of in ",[1094,1547,1444],{}," A canceled command never reaches the code after its loop, so a motor started by the command keeps running unless the cleanup is in ",[1094,1550,1444],{},[1094,1552,1448],{},[1172,1554,1555,1561],{},[1089,1556,1557,1558,1560],{},"Controlling a motor from an ",[1094,1559,1186],{}," side job."," Side jobs have no requirements, so they fight whatever command owns that mechanism; use a command (usually the default command) instead.",[1080,1563,1565],{"id":1564},"key-takeaways","Key Takeaways",[1271,1567,1568,1581,1590,1593,1599,1607],{},[1172,1569,1570,1571,1574,1575,1577,1578,1580],{},"The default ",[1094,1572,1573],{},"Scheduler"," (",[1094,1576,1096],{},") must be run explicitly, from ",[1094,1579,1104],{}," — without this call, the framework does nothing.",[1172,1582,1583,1584,1586,1587,1589],{},"Each ",[1094,1585,1166],{}," goes in a fixed order: clean up ended scopes, run ",[1094,1588,1488],{}," side jobs, poll triggers (which queue commands), queue default commands, start queued commands (settling conflicts), then run each command until it yields or finishes.",[1172,1591,1592],{},"Requirement conflicts are settled by priority: an equal-or-higher-priority command takes over, a lower-priority one is refused.",[1172,1594,1595,1596,1598],{},"A default command runs whenever its mechanism is free; give it ",[1094,1597,1403],{}," so any other command can take over.",[1172,1600,1601,1602,1349,1604,1606],{},"Cleanup goes in ",[1094,1603,1444],{},[1094,1605,1448],{},", because a canceled command stops where it last yielded; scopes cancel autonomous- and opmode-scoped commands automatically.",[1172,1608,1609,1611],{},[1094,1610,1186],{}," is for data updates only — never for controlling a mechanism.",[1085,1613,1614,1615,1618,1619,1622,1623,1574,1626,1152,1629,1349,1631,1349,1634,1092,1637,1640,1641,1644,1645,1648],{},"Derived from ",[1094,1616,1617],{},"other-reference-repo",": ",[1094,1620,1621],{},"wpilib\u002Fcommand-based\u002F08-command-scheduler.md"," (WPILIB 20.8); updated for Commands v3 from allwpilib ",[1094,1624,1625],{},"main",[1094,1627,1628],{},"commandsv3\u002F…\u002Fcommand3\u002FScheduler.java",[1094,1630,1166],{},[1094,1632,1633],{},"schedule()",[1094,1635,1636],{},"addPeriodic()",[1094,1638,1639],{},"Command.java"," priorities, ",[1094,1642,1643],{},"Mechanism.java"," default commands, ",[1094,1646,1647],{},"BindingScope.java",")",[1650,1651,1652],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":1112,"searchDepth":1125,"depth":1125,"links":1654},[1655,1656,1657,1658,1659,1660,1661,1663,1664],{"id":1082,"depth":1125,"text":1083},{"id":1159,"depth":1125,"text":1160},{"id":1249,"depth":1125,"text":1250},{"id":1356,"depth":1125,"text":1357},{"id":1414,"depth":1125,"text":1415},{"id":1470,"depth":1125,"text":1471},{"id":1484,"depth":1125,"text":1662},"Periodic Side Jobs: addPeriodic Is for Data, Not Motors",{"id":1515,"depth":1125,"text":1516},{"id":1564,"depth":1125,"text":1565},"md",{"outlineRef":1667,"status":1668},"25.3 — The Command Scheduler (WPILIB 20.8)","new — authored lesson (rewritten for Commands v3, WPILib 2027)",true,{"title":278,"description":1112},"Q_x0PeUrVhWRazI57oZvBCHuYE2yXqfIUgvFm7Airy0",{"id":1673,"title":711,"body":1674,"description":1112,"extension":1665,"meta":2048,"navigation":1669,"path":710,"seo":2051,"stem":712,"__hash__":2052},"examples\u002Fshockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F25.3-the-command-scheduler.md",{"type":1073,"value":1675,"toc":2039},[1676,1679,1683,1698,1707,1721,1776,1786,1790,1804,1808,1814,1838,1844,1848,1871,1875,1881,1918,1924,1952,1958,1985,1991,1995,2002,2009,2013,2037],[1076,1677,711],{"id":1678},"the-command-scheduler-worked-example",[1080,1680,1682],{"id":1681},"problem","Problem",[1085,1684,1685,1686,1689,1690,1693,1694,1697],{},"A ",[1094,1687,1688],{},"Shooter"," mechanism stores the flywheel's measured speed in a field, ",[1094,1691,1692],{},"measuredRpm",", which its ",[1094,1695,1696],{},"refreshRpm()"," method copies from the encoder. During setup, the team registers that refresh as a side job, so it happens once every loop:",[1107,1699,1701],{"className":1109,"code":1700,"language":1111,"meta":1112,"style":1112},"Scheduler.getDefault().addPeriodic(() -> shooter.refreshRpm());\n",[1094,1702,1703],{"__ignoreMap":1112},[1116,1704,1705],{"class":1118,"line":1119},[1116,1706,1700],{},[1085,1708,1709,1710,1713,1714,1717,1718,1720],{},"The shooter's ",[1094,1711,1712],{},"spinUpCommand()"," starts the flywheel and finishes once ",[1094,1715,1716],{},"getRpm()"," (which returns ",[1094,1719,1692],{},") reaches 4000:",[1107,1722,1724],{"className":1109,"code":1723,"language":1111,"meta":1112,"style":1112},"public Command spinUpCommand()\n{\n    return run(coroutine -> {\n        motor.setThrottle(1.0);\n        while (getRpm() \u003C 4000)\n        {\n            coroutine.yield();\n        }\n    }).named(\"Spin Up\");\n}\n",[1094,1725,1726,1731,1735,1739,1744,1749,1754,1759,1765,1771],{"__ignoreMap":1112},[1116,1727,1728],{"class":1118,"line":1119},[1116,1729,1730],{},"public Command spinUpCommand()\n",[1116,1732,1733],{"class":1118,"line":1125},[1116,1734,1134],{},[1116,1736,1737],{"class":1118,"line":1131},[1116,1738,1311],{},[1116,1740,1741],{"class":1118,"line":1137},[1116,1742,1743],{},"        motor.setThrottle(1.0);\n",[1116,1745,1746],{"class":1118,"line":1143},[1116,1747,1748],{},"        while (getRpm() \u003C 4000)\n",[1116,1750,1751],{"class":1118,"line":1324},[1116,1752,1753],{},"        {\n",[1116,1755,1756],{"class":1118,"line":1330},[1116,1757,1758],{},"            coroutine.yield();\n",[1116,1760,1762],{"class":1118,"line":1761},8,[1116,1763,1764],{},"        }\n",[1116,1766,1768],{"class":1118,"line":1767},9,[1116,1769,1770],{},"    }).named(\"Spin Up\");\n",[1116,1772,1774],{"class":1118,"line":1773},10,[1116,1775,1146],{},[1085,1777,1778,1779,1781,1782,1785],{},"A trigger binds ",[1094,1780,1712],{}," with ",[1094,1783,1784],{},"onTrue"," to a button, and the shooter has no default command. The driver presses the button right before loop 1. The encoder reads 0 RPM on loop 1, 2500 RPM on loop 2, and 4100 RPM on loop 3. Trace what the scheduler does on each loop, and find the loop on which Spin Up finishes.",[1080,1787,1789],{"id":1788},"step-1-plan-it-first","Step 1: Plan It First",[1169,1791,1792,1795,1798,1801],{},[1172,1793,1794],{},"Confirm the scheduler is actually being run every loop.",[1172,1796,1797],{},"Write down the steps of one scheduler loop, in order.",[1172,1799,1800],{},"Walk through loops 1, 2, and 3, one step at a time, keeping track of where Spin Up's body is paused.",[1172,1802,1803],{},"Check which RPM value the loop condition sees on each loop.",[1080,1805,1807],{"id":1806},"step-2-make-sure-the-scheduler-runs","Step 2: Make Sure the Scheduler Runs",[1085,1809,1810,1811,1813],{},"None of this happens unless ",[1094,1812,1104],{}," runs the scheduler:",[1107,1815,1816],{"className":1109,"code":1110,"language":1111,"meta":1112,"style":1112},[1094,1817,1818,1822,1826,1830,1834],{"__ignoreMap":1112},[1116,1819,1820],{"class":1118,"line":1119},[1116,1821,1122],{},[1116,1823,1824],{"class":1118,"line":1125},[1116,1825,1128],{},[1116,1827,1828],{"class":1118,"line":1131},[1116,1829,1134],{},[1116,1831,1832],{"class":1118,"line":1137},[1116,1833,1140],{},[1116,1835,1836],{"class":1118,"line":1143},[1116,1837,1146],{},[1085,1839,1840,1841,1843],{},"Every call to ",[1094,1842,1166],{}," is one full loop of the scheduler: all six steps, in order.",[1080,1845,1847],{"id":1846},"step-3-the-six-steps-in-order","Step 3: The Six Steps, in Order",[1169,1849,1850,1853,1859,1862,1865,1868],{},[1172,1851,1852],{},"Clean up ended scopes (nothing to clean up in this example).",[1172,1854,1855,1856,1530],{},"Run side jobs — here, ",[1094,1857,1858],{},"shooter.refreshRpm()",[1172,1860,1861],{},"Poll triggers — a binding whose condition changed queues its command.",[1172,1863,1864],{},"Queue default commands for free mechanisms.",[1172,1866,1867],{},"Start queued commands, settling any conflicts.",[1172,1869,1870],{},"Run each running command until it yields or finishes.",[1080,1872,1874],{"id":1873},"step-4-trace-each-loop","Step 4: Trace Each Loop",[1085,1876,1877,1880],{},[1089,1878,1879],{},"Loop 1"," (encoder reads 0):",[1271,1882,1883,1892,1898,1901,1904],{},[1172,1884,1885,1886,1888,1889,1891],{},"Step 2: ",[1094,1887,1696],{}," sets ",[1094,1890,1692],{}," to 0.",[1172,1893,1894,1895,1897],{},"Step 3: the button has just been pressed, so ",[1094,1896,1784],{}," queues Spin Up. It hasn't started yet.",[1172,1899,1900],{},"Step 4: Spin Up is queued for the shooter, so there's nothing to do (and the shooter has no default command anyway).",[1172,1902,1903],{},"Step 5: Spin Up moves from the queue to the running set. Nothing else needs the shooter, so there's no conflict.",[1172,1905,1906,1907,1910,1911,1914,1915,1917],{},"Step 6: Spin Up's body runs for the first time: ",[1094,1908,1909],{},"motor.setThrottle(1.0)"," starts the flywheel, then the loop condition checks 0 \u003C 4000 — ",[1094,1912,1913],{},"true"," — so the body reaches ",[1094,1916,1222],{}," and pauses there.",[1085,1919,1920,1923],{},[1089,1921,1922],{},"Loop 2"," (encoder reads 2500):",[1271,1925,1926,1933,1939,1942],{},[1172,1927,1885,1928,1888,1930,1932],{},[1094,1929,1696],{},[1094,1931,1692],{}," to 2500.",[1172,1934,1935,1936,1938],{},"Step 3: the button is still held, but ",[1094,1937,1784],{}," only reacts to the press itself — nothing new is queued.",[1172,1940,1941],{},"Steps 4-5: the shooter is busy with Spin Up; nothing to queue or start.",[1172,1943,1944,1945,1948,1949,1951],{},"Step 6: Spin Up resumes right after its ",[1094,1946,1947],{},"yield()",", and the loop condition checks 2500 \u003C 4000 — ",[1094,1950,1913],{}," — so it yields again.",[1085,1953,1954,1957],{},[1089,1955,1956],{},"Loop 3"," (encoder reads 4100):",[1271,1959,1960,1967,1970],{},[1172,1961,1885,1962,1888,1964,1966],{},[1094,1963,1696],{},[1094,1965,1692],{}," to 4100.",[1172,1968,1969],{},"Steps 3-5: nothing new.",[1172,1971,1972,1973,1976,1977,1980,1981,1984],{},"Step 6: Spin Up resumes; the loop condition checks 4100 \u003C 4000 — ",[1094,1974,1975],{},"false"," — so the ",[1094,1978,1979],{},"while"," loop ends. There's no code after the loop, so the body returns and Spin Up is ",[1089,1982,1983],{},"finished",", freeing the shooter.",[1085,1986,1987,1990],{},[1089,1988,1989],{},"Answer:"," Spin Up finishes on loop 3, during step 6. The flywheel keeps spinning at full throttle afterward — the body never turned it off — which is exactly what \"spin up and stay up to speed\" should do.",[1080,1992,1994],{"id":1993},"step-5-why-the-order-mattered","Step 5: Why the Order Mattered",[1085,1996,1997,1998,2001],{},"On loop 3, the loop condition saw 4100, not last loop's 2500 — because side jobs (step 2) always run before commands (step 6). If the refresh ran ",[1228,1999,2000],{},"after"," the commands, Spin Up would have checked a stale 2500, yielded one extra time, and finished on loop 4 instead.",[1085,2003,2004,2005,2008],{},"Notice also that the button press on loop 1 didn't start Spin Up the instant the trigger was polled: step 3 only ",[1228,2006,2007],{},"queued"," it, step 5 started it, and step 6 gave it its first turn — all within that same loop. And because the refresh is a side job, not a command, it never requires the shooter, so it can't conflict with Spin Up; it only updates data, never the motor.",[1080,2010,2012],{"id":2011},"recap","Recap",[1271,2014,2015,2022,2028,2034],{},[1172,2016,2017,1527,2019,2021],{},[1094,2018,1526],{},[1094,2020,1104],{}," is what makes every loop happen at all.",[1172,2023,2024,2025,2027],{},"Each loop: clean up scopes → side jobs (",[1094,2026,1488],{},") → poll triggers (which queue commands) → queue default commands → start queued commands → run each command until it yields or finishes.",[1172,2029,2030,2031,2033],{},"A command's body pauses at ",[1094,2032,1222],{}," and resumes from that exact spot on the next loop; it finishes when the body returns.",[1172,2035,2036],{},"Because side jobs run before commands, commands always act on this loop's freshly updated data.",[1650,2038,1652],{},{"title":1112,"searchDepth":1125,"depth":1125,"links":2040},[2041,2042,2043,2044,2045,2046,2047],{"id":1681,"depth":1125,"text":1682},{"id":1788,"depth":1125,"text":1789},{"id":1806,"depth":1125,"text":1807},{"id":1846,"depth":1125,"text":1847},{"id":1873,"depth":1125,"text":1874},{"id":1993,"depth":1125,"text":1994},{"id":2011,"depth":1125,"text":2012},{"outlineRef":1667,"pairsWith":2049,"status":2050},"[`lessons\u002Fch25-command-based-programming\u002F25.3-the-command-scheduler.md`](..\u002F..\u002Flessons\u002Fch25-command-based-programming\u002F25.3-the-command-scheduler.md)","new — authored worked example (fully solved, walked step by step — not a problem to attempt); rewritten for Commands v3",{"title":711,"description":1112},"jlQhI_3YHajQuWgx_YpciTKDN54ma2wvkmeGlH9G6VY",{"id":2054,"title":1024,"body":2055,"description":1112,"extension":1665,"meta":3350,"navigation":1669,"path":1023,"seo":3352,"stem":1025,"__hash__":3353},"exercises\u002Fshockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F25.3-the-command-scheduler.md",{"type":1073,"value":2056,"toc":3345},[2057,2060,2064,2080,2089,2098,2103,2117,2122,2134,2148,2152,2169,2172,2175,2243,2248,2307,2329,2368,2385,2389,2395,2403,2451,2478,2486,2491,2828,2833,2838,2844,2849,2854,2859,2863,2869,2873,2879,2884,2888,2894,2898,2904,2909,2913,2919,2923,2929,2934,2938,2944,2948,2954,2959,2963,2969,2973,2979,2984,3267,3343],[1076,2058,1024],{"id":2059},"the-command-scheduler-exercises",[1080,2061,2063],{"id":2062},"multiple-choice","Multiple Choice",[1085,2065,2066,2069,2070,2073,2074,2077,2078,1292],{},[1089,2067,2068],{},"Question:"," An ",[1094,2071,2072],{},"Elevator"," mechanism has a ",[1094,2075,2076],{},"currentHeight"," field. During setup, this line registers a side job that copies the encoder's reading into ",[1094,2079,2076],{},[1107,2081,2083],{"className":1109,"code":2082,"language":1111,"meta":1112,"style":1112},"Scheduler.getDefault().addPeriodic(() -> elevator.refreshHeight());\n",[1094,2084,2085],{"__ignoreMap":1112},[1116,2086,2087],{"class":1118,"line":1119},[1116,2088,2082],{},[1085,2090,2091,2092,2094,2095,2097],{},"A running command's body reads ",[1094,2093,2076],{},". Within a single call to ",[1094,2096,1526],{},", which value does the command see?",[1085,2099,2100],{},[1089,2101,2102],{},"Options:",[1271,2104,2105,2108,2111,2114],{},[1172,2106,2107],{},"A. The height from the previous loop, because commands run before side jobs",[1172,2109,2110],{},"B. The height just refreshed in this same loop, because side jobs run before commands",[1172,2112,2113],{},"C. It changes from loop to loop, depending on whether the command or the side job was created first",[1172,2115,2116],{},"D. Always the height from when the robot turned on, because side jobs only run while no command is using the elevator",[1085,2118,2119,2121],{},[1089,2120,1989],{}," B",[1085,2123,2124,2127,2128,2130,2131,2133],{},[1089,2125,2126],{},"Why:"," Every scheduler loop runs in a fixed order, and side jobs added with ",[1094,2129,1186],{}," run early — before triggers are polled and before any command runs. By the time the command's body resumes (the last step), ",[1094,2132,2076],{}," has already been refreshed for this loop.",[1271,2135,2136,2142,2145],{},[1172,2137,2138,2139,2141],{},"A is wrong — it reverses the order: commands run ",[1228,2140,2000],{}," side jobs, not before.",[1172,2143,2144],{},"C is wrong — the order is the same every single loop, no matter which object was created first; that fixed order is exactly what makes command-based code predictable.",[1172,2146,2147],{},"D is wrong — a side job requires no mechanisms, so it runs every loop whether or not a command is using the elevator. (That's also why a side job should only update data, never drive the elevator's motor.)",[1080,2149,2151],{"id":2150},"micro-parsons","Micro-Parsons",[1085,2153,2154,2157,2158,2161,2162,2164,2165,2168],{},[1089,2155,2156],{},"Problem:"," A ",[1094,2159,2160],{},"Wrist"," mechanism's default command, Hold Wrist, is currently running, and the scheduler also has one side job, which logs the wrist's angle. On this loop, a trigger's condition becomes true, and its ",[1094,2163,1784],{}," binding schedules Tuck Wrist, which requires the wrist and has the default priority. Tuck Wrist's body calls ",[1094,2166,2167],{},"tuck()"," once, with no loop — so it finishes the first time it runs.",[1085,2170,2171],{},"These lines, once correctly ordered, form a complete program that prints — in order — what the scheduler does during this one loop.",[1085,2173,2174],{},"Reorder the fragments below into a working program:",[1271,2176,2177,2183,2189,2195,2201,2207,2213,2219,2225,2231,2237],{},[1172,2178,2179,2180],{},"a. ",[1094,2181,2182],{},"        System.out.println(\"Hold Wrist canceled\");",[1172,2184,2185,2186],{},"b. ",[1094,2187,2188],{},"public class WristLoopTrace",[1172,2190,2191,2192],{},"c. ",[1094,2193,2194],{},"        System.out.println(\"Tuck Wrist finished\");",[1172,2196,2197,2198],{},"d. ",[1094,2199,2200],{},"    }",[1172,2202,2203,2204],{},"e. ",[1094,2205,2206],{},"        System.out.println(\"Side job: log wrist angle\");",[1172,2208,2209,2210],{},"f. ",[1094,2211,2212],{},"{",[1172,2214,2215,2216],{},"g. ",[1094,2217,2218],{},"        System.out.println(\"Tuck Wrist runs tuck()\");",[1172,2220,2221,2222],{},"h. ",[1094,2223,2224],{},"    public static void main(String[] args)",[1172,2226,2227,2228],{},"i. ",[1094,2229,2230],{},"        System.out.println(\"Trigger queues Tuck Wrist\");",[1172,2232,2233,2234],{},"j. ",[1094,2235,2236],{},"    {",[1172,2238,2239,2240],{},"k. ",[1094,2241,2242],{},"}",[1085,2244,2245,2247],{},[1089,2246,1989],{}," b, f, h, j, e, i, a, g, c, d, k",[1107,2249,2251],{"className":1109,"code":2250,"language":1111,"meta":1112,"style":1112},"public class WristLoopTrace\n{\n    public static void main(String[] args)\n    {\n        System.out.println(\"Side job: log wrist angle\");\n        System.out.println(\"Trigger queues Tuck Wrist\");\n        System.out.println(\"Hold Wrist canceled\");\n        System.out.println(\"Tuck Wrist runs tuck()\");\n        System.out.println(\"Tuck Wrist finished\");\n    }\n}\n",[1094,2252,2253,2258,2262,2267,2272,2277,2282,2287,2292,2297,2302],{"__ignoreMap":1112},[1116,2254,2255],{"class":1118,"line":1119},[1116,2256,2257],{},"public class WristLoopTrace\n",[1116,2259,2260],{"class":1118,"line":1125},[1116,2261,1134],{},[1116,2263,2264],{"class":1118,"line":1131},[1116,2265,2266],{},"    public static void main(String[] args)\n",[1116,2268,2269],{"class":1118,"line":1137},[1116,2270,2271],{},"    {\n",[1116,2273,2274],{"class":1118,"line":1143},[1116,2275,2276],{},"        System.out.println(\"Side job: log wrist angle\");\n",[1116,2278,2279],{"class":1118,"line":1324},[1116,2280,2281],{},"        System.out.println(\"Trigger queues Tuck Wrist\");\n",[1116,2283,2284],{"class":1118,"line":1330},[1116,2285,2286],{},"        System.out.println(\"Hold Wrist canceled\");\n",[1116,2288,2289],{"class":1118,"line":1761},[1116,2290,2291],{},"        System.out.println(\"Tuck Wrist runs tuck()\");\n",[1116,2293,2294],{"class":1118,"line":1767},[1116,2295,2296],{},"        System.out.println(\"Tuck Wrist finished\");\n",[1116,2298,2299],{"class":1118,"line":1773},[1116,2300,2301],{},"    }\n",[1116,2303,2305],{"class":1118,"line":2304},11,[1116,2306,1146],{},[1085,2308,2309,2312,2313,2315,2316,1092,2319,1092,2322,1092,2325,2328],{},[1089,2310,2311],{},"Why this order:"," After the usual class and ",[1094,2314,1625],{}," scaffolding (",[1094,2317,2318],{},"b",[1094,2320,2321],{},"f",[1094,2323,2324],{},"h",[1094,2326,2327],{},"j","), the trace follows the scheduler's fixed steps:",[1169,2330,2331,2338,2348,2355],{},[1172,2332,2333,2334,2337],{},"Side jobs run before anything else that matters here (",[1094,2335,2336],{},"e",").",[1172,2339,2340,2341,2343,2344,2347],{},"Polling triggers ",[1228,2342,1200],{}," Tuck Wrist (",[1094,2345,2346],{},"i",") — it doesn't start yet.",[1172,2349,2350,2351,2354],{},"Queued commands are started. Tuck Wrist needs the wrist, which Hold Wrist has. Hold Wrist is a default command with the lowest priority, so Tuck Wrist wins: Hold Wrist is canceled right here (",[1094,2352,2353],{},"a","), before Tuck Wrist ever runs.",[1172,2356,2357,2358,1574,2360,2363,2364,2367],{},"Running commands take their turn: Tuck Wrist's body calls ",[1094,2359,2167],{},[1094,2361,2362],{},"g","), reaches the end of its body, and is finished (",[1094,2365,2366],{},"c","), freeing the wrist.",[1085,2369,2370,2371,2374,2375,2377,2378,2381,2382,2337],{},"Hold Wrist doesn't restart during this loop: default commands are queued ",[1228,2372,2373],{},"before"," queued commands start, and at that point Tuck Wrist was still queued for the wrist. On the next loop, the wrist is free, so Hold Wrist is queued and started again. Then ",[1094,2376,1625],{},"'s brace closes (",[1094,2379,2380],{},"d","), then the class's (",[1094,2383,2384],{},"k",[1080,2386,2388],{"id":2387},"coding","Coding",[1085,2390,2391,2394],{},[1089,2392,2393],{},"Mode:"," full-program",[1085,2396,2397,2069,2399,2402],{},[1089,2398,2156],{},[1094,2400,2401],{},"LedStrip"," (below) is a Commands v3 mechanism with two commands. Write both factory methods:",[1271,2404,2405,2425],{},[1172,2406,2407,2410,2411,2414,2415,2418,2419,2421,2422,1530],{},[1094,2408,2409],{},"warningCommand(name, priority)",": a command that ",[1089,2412,2413],{},"requires the strip",", waits forever\n(",[1094,2416,2417],{},"coroutine.park()","), has the given ",[1089,2420,1256],{},", and is named ",[1094,2423,2424],{},"name",[1172,2426,2427,2410,2430,2432,2433,2436,2437,2440,2441,1574,2444,2446,2447,2450],{},[1094,2428,2429],{},"glowCommand()",[1089,2431,2413],{},", calls ",[1094,2434,2435],{},"fade()"," once per loop (with\n",[1094,2438,2439],{},"runRepeatedly","), has the ",[1089,2442,2443],{},"lowest possible priority",[1094,2445,1264],{},"), and is named\n",[1094,2448,2449],{},"\"Glow\"",", so any other command can take the strip from it.",[1085,2452,2453,2454,2456,2457,2459,2460,2462,2463,2466,2467,2470,2471,2474,2475,1292],{},"The fixed ",[1094,2455,1625],{}," makes ",[1094,2458,2429],{}," the strip's ",[1089,2461,1363],{},", then runs the ",[1089,2464,2465],{},"real\nscheduler",": it schedules warning ",[1094,2468,2469],{},"A",", then warning ",[1094,2472,2473],{},"B",", then cancels both, printing which commands\nare running on the strip after each step. For the input ",[1094,2476,2477],{},"Low 1 High 5",[1107,2479,2484],{"className":2480,"code":2482,"language":2483,"meta":1112},[2481],"language-text","idle: [Glow]\nafter Low: [Low]\nafter High: [High]\nafter cancel: [Glow]\n","text",[1094,2485,2482],{"__ignoreMap":1112},[1085,2487,2488],{},[1089,2489,2490],{},"Starter:",[1107,2492,2494],{"className":1109,"code":2493,"language":1111,"meta":1112,"style":1112},"import java.util.*;\nimport org.wpilib.command3.Command;\nimport org.wpilib.command3.Mechanism;\nimport org.wpilib.command3.Scheduler;\nimport org.wpilib.command3.TestSupport;\n\npublic class Main\n{\n    \u002F\u002F Don't change main\n    public static void main(String[] args)\n    {\n        TestSupport.init(); \u002F\u002F a fake robot clock and opmode, so the scheduler can run without a robot\n        Scanner in = new Scanner(System.in);\n        String nameA = in.next();\n        int priorityA = in.nextInt();\n        String nameB = in.next();\n        int priorityB = in.nextInt();\n\n        Scheduler scheduler = Scheduler.getDefault();\n        LedStrip strip = new LedStrip();\n        strip.setDefaultCommand(strip.glowCommand());\n        Command a = strip.warningCommand(nameA, priorityA);\n        Command b = strip.warningCommand(nameB, priorityB);\n\n        scheduler.run();\n        System.out.println(\"idle: \" + runningOn(strip));\n        scheduler.schedule(a);\n        scheduler.run();\n        System.out.println(\"after \" + nameA + \": \" + runningOn(strip));\n        scheduler.schedule(b);\n        scheduler.run();\n        System.out.println(\"after \" + nameB + \": \" + runningOn(strip));\n        scheduler.cancel(a);\n        scheduler.cancel(b);\n        scheduler.run();\n        scheduler.run();\n        System.out.println(\"after cancel: \" + runningOn(strip));\n    }\n\n    static List\u003CString> runningOn(Mechanism mechanism)\n    {\n        List\u003CString> names = new ArrayList\u003C>();\n        for (Command command : mechanism.getRunningCommands())\n        {\n            names.add(command.name());\n        }\n        return names;\n    }\n}\n\nclass LedStrip implements Mechanism\n{\n    private void fade()\n    {\n        \u002F\u002F writes the next LED color; not needed for this exercise\n    }\n\n    \u002F\u002F TODO: warningCommand(String name, int priority)\n\n    \u002F\u002F TODO: glowCommand()\n}\n",[1094,2495,2496,2501,2506,2511,2516,2521,2526,2531,2535,2540,2544,2548,2554,2560,2566,2572,2578,2584,2589,2595,2601,2607,2613,2619,2624,2630,2636,2642,2647,2653,2659,2664,2670,2676,2682,2687,2692,2698,2703,2708,2714,2719,2725,2731,2736,2742,2747,2753,2758,2763,2768,2774,2779,2785,2790,2796,2801,2806,2812,2817,2823],{"__ignoreMap":1112},[1116,2497,2498],{"class":1118,"line":1119},[1116,2499,2500],{},"import java.util.*;\n",[1116,2502,2503],{"class":1118,"line":1125},[1116,2504,2505],{},"import org.wpilib.command3.Command;\n",[1116,2507,2508],{"class":1118,"line":1131},[1116,2509,2510],{},"import org.wpilib.command3.Mechanism;\n",[1116,2512,2513],{"class":1118,"line":1137},[1116,2514,2515],{},"import org.wpilib.command3.Scheduler;\n",[1116,2517,2518],{"class":1118,"line":1143},[1116,2519,2520],{},"import org.wpilib.command3.TestSupport;\n",[1116,2522,2523],{"class":1118,"line":1324},[1116,2524,2525],{"emptyLinePlaceholder":1669},"\n",[1116,2527,2528],{"class":1118,"line":1330},[1116,2529,2530],{},"public class Main\n",[1116,2532,2533],{"class":1118,"line":1761},[1116,2534,1134],{},[1116,2536,2537],{"class":1118,"line":1767},[1116,2538,2539],{},"    \u002F\u002F Don't change main\n",[1116,2541,2542],{"class":1118,"line":1773},[1116,2543,2266],{},[1116,2545,2546],{"class":1118,"line":2304},[1116,2547,2271],{},[1116,2549,2551],{"class":1118,"line":2550},12,[1116,2552,2553],{},"        TestSupport.init(); \u002F\u002F a fake robot clock and opmode, so the scheduler can run without a robot\n",[1116,2555,2557],{"class":1118,"line":2556},13,[1116,2558,2559],{},"        Scanner in = new Scanner(System.in);\n",[1116,2561,2563],{"class":1118,"line":2562},14,[1116,2564,2565],{},"        String nameA = in.next();\n",[1116,2567,2569],{"class":1118,"line":2568},15,[1116,2570,2571],{},"        int priorityA = in.nextInt();\n",[1116,2573,2575],{"class":1118,"line":2574},16,[1116,2576,2577],{},"        String nameB = in.next();\n",[1116,2579,2581],{"class":1118,"line":2580},17,[1116,2582,2583],{},"        int priorityB = in.nextInt();\n",[1116,2585,2587],{"class":1118,"line":2586},18,[1116,2588,2525],{"emptyLinePlaceholder":1669},[1116,2590,2592],{"class":1118,"line":2591},19,[1116,2593,2594],{},"        Scheduler scheduler = Scheduler.getDefault();\n",[1116,2596,2598],{"class":1118,"line":2597},20,[1116,2599,2600],{},"        LedStrip strip = new LedStrip();\n",[1116,2602,2604],{"class":1118,"line":2603},21,[1116,2605,2606],{},"        strip.setDefaultCommand(strip.glowCommand());\n",[1116,2608,2610],{"class":1118,"line":2609},22,[1116,2611,2612],{},"        Command a = strip.warningCommand(nameA, priorityA);\n",[1116,2614,2616],{"class":1118,"line":2615},23,[1116,2617,2618],{},"        Command b = strip.warningCommand(nameB, priorityB);\n",[1116,2620,2622],{"class":1118,"line":2621},24,[1116,2623,2525],{"emptyLinePlaceholder":1669},[1116,2625,2627],{"class":1118,"line":2626},25,[1116,2628,2629],{},"        scheduler.run();\n",[1116,2631,2633],{"class":1118,"line":2632},26,[1116,2634,2635],{},"        System.out.println(\"idle: \" + runningOn(strip));\n",[1116,2637,2639],{"class":1118,"line":2638},27,[1116,2640,2641],{},"        scheduler.schedule(a);\n",[1116,2643,2645],{"class":1118,"line":2644},28,[1116,2646,2629],{},[1116,2648,2650],{"class":1118,"line":2649},29,[1116,2651,2652],{},"        System.out.println(\"after \" + nameA + \": \" + runningOn(strip));\n",[1116,2654,2656],{"class":1118,"line":2655},30,[1116,2657,2658],{},"        scheduler.schedule(b);\n",[1116,2660,2662],{"class":1118,"line":2661},31,[1116,2663,2629],{},[1116,2665,2667],{"class":1118,"line":2666},32,[1116,2668,2669],{},"        System.out.println(\"after \" + nameB + \": \" + runningOn(strip));\n",[1116,2671,2673],{"class":1118,"line":2672},33,[1116,2674,2675],{},"        scheduler.cancel(a);\n",[1116,2677,2679],{"class":1118,"line":2678},34,[1116,2680,2681],{},"        scheduler.cancel(b);\n",[1116,2683,2685],{"class":1118,"line":2684},35,[1116,2686,2629],{},[1116,2688,2690],{"class":1118,"line":2689},36,[1116,2691,2629],{},[1116,2693,2695],{"class":1118,"line":2694},37,[1116,2696,2697],{},"        System.out.println(\"after cancel: \" + runningOn(strip));\n",[1116,2699,2701],{"class":1118,"line":2700},38,[1116,2702,2301],{},[1116,2704,2706],{"class":1118,"line":2705},39,[1116,2707,2525],{"emptyLinePlaceholder":1669},[1116,2709,2711],{"class":1118,"line":2710},40,[1116,2712,2713],{},"    static List\u003CString> runningOn(Mechanism mechanism)\n",[1116,2715,2717],{"class":1118,"line":2716},41,[1116,2718,2271],{},[1116,2720,2722],{"class":1118,"line":2721},42,[1116,2723,2724],{},"        List\u003CString> names = new ArrayList\u003C>();\n",[1116,2726,2728],{"class":1118,"line":2727},43,[1116,2729,2730],{},"        for (Command command : mechanism.getRunningCommands())\n",[1116,2732,2734],{"class":1118,"line":2733},44,[1116,2735,1753],{},[1116,2737,2739],{"class":1118,"line":2738},45,[1116,2740,2741],{},"            names.add(command.name());\n",[1116,2743,2745],{"class":1118,"line":2744},46,[1116,2746,1764],{},[1116,2748,2750],{"class":1118,"line":2749},47,[1116,2751,2752],{},"        return names;\n",[1116,2754,2756],{"class":1118,"line":2755},48,[1116,2757,2301],{},[1116,2759,2761],{"class":1118,"line":2760},49,[1116,2762,1146],{},[1116,2764,2766],{"class":1118,"line":2765},50,[1116,2767,2525],{"emptyLinePlaceholder":1669},[1116,2769,2771],{"class":1118,"line":2770},51,[1116,2772,2773],{},"class LedStrip implements Mechanism\n",[1116,2775,2777],{"class":1118,"line":2776},52,[1116,2778,1134],{},[1116,2780,2782],{"class":1118,"line":2781},53,[1116,2783,2784],{},"    private void fade()\n",[1116,2786,2788],{"class":1118,"line":2787},54,[1116,2789,2271],{},[1116,2791,2793],{"class":1118,"line":2792},55,[1116,2794,2795],{},"        \u002F\u002F writes the next LED color; not needed for this exercise\n",[1116,2797,2799],{"class":1118,"line":2798},56,[1116,2800,2301],{},[1116,2802,2804],{"class":1118,"line":2803},57,[1116,2805,2525],{"emptyLinePlaceholder":1669},[1116,2807,2809],{"class":1118,"line":2808},58,[1116,2810,2811],{},"    \u002F\u002F TODO: warningCommand(String name, int priority)\n",[1116,2813,2815],{"class":1118,"line":2814},59,[1116,2816,2525],{"emptyLinePlaceholder":1669},[1116,2818,2820],{"class":1118,"line":2819},60,[1116,2821,2822],{},"    \u002F\u002F TODO: glowCommand()\n",[1116,2824,2826],{"class":1118,"line":2825},61,[1116,2827,1146],{},[1085,2829,2830],{},[1089,2831,2832],{},"Scenario 1 (visible):",[1085,2834,2835],{},[1089,2836,2837],{},"Input:",[1107,2839,2842],{"className":2840,"code":2841,"language":2483,"meta":1112},[2481],"Low 1 High 5\n",[1094,2843,2841],{"__ignoreMap":1112},[1085,2845,2846],{},[1089,2847,2848],{},"Expected output:",[1107,2850,2852],{"className":2851,"code":2482,"language":2483,"meta":1112},[2481],[1094,2853,2482],{"__ignoreMap":1112},[1085,2855,2856],{},[1089,2857,2858],{},"Scenario 2 (visible):",[1085,2860,2861],{},[1089,2862,2837],{},[1107,2864,2867],{"className":2865,"code":2866,"language":2483,"meta":1112},[2481],"High 5 Low 1\n",[1094,2868,2866],{"__ignoreMap":1112},[1085,2870,2871],{},[1089,2872,2848],{},[1107,2874,2877],{"className":2875,"code":2876,"language":2483,"meta":1112},[2481],"idle: [Glow]\nafter High: [High]\nafter Low: [High]\nafter cancel: [Glow]\n",[1094,2878,2876],{"__ignoreMap":1112},[1085,2880,2881],{},[1089,2882,2883],{},"Scenario 3 (hidden):",[1085,2885,2886],{},[1089,2887,2837],{},[1107,2889,2892],{"className":2890,"code":2891,"language":2483,"meta":1112},[2481],"A 3 B 3\n",[1094,2893,2891],{"__ignoreMap":1112},[1085,2895,2896],{},[1089,2897,2848],{},[1107,2899,2902],{"className":2900,"code":2901,"language":2483,"meta":1112},[2481],"idle: [Glow]\nafter A: [A]\nafter B: [B]\nafter cancel: [Glow]\n",[1094,2903,2901],{"__ignoreMap":1112},[1085,2905,2906],{},[1089,2907,2908],{},"Scenario 4 (hidden):",[1085,2910,2911],{},[1089,2912,2837],{},[1107,2914,2917],{"className":2915,"code":2916,"language":2483,"meta":1112},[2481],"Neg -5 Low 1\n",[1094,2918,2916],{"__ignoreMap":1112},[1085,2920,2921],{},[1089,2922,2848],{},[1107,2924,2927],{"className":2925,"code":2926,"language":2483,"meta":1112},[2481],"idle: [Glow]\nafter Neg: [Neg]\nafter Low: [Low]\nafter cancel: [Glow]\n",[1094,2928,2926],{"__ignoreMap":1112},[1085,2930,2931],{},[1089,2932,2933],{},"Scenario 5 (hidden):",[1085,2935,2936],{},[1089,2937,2837],{},[1107,2939,2942],{"className":2940,"code":2941,"language":2483,"meta":1112},[2481],"Min -2147483648 Neg -5\n",[1094,2943,2941],{"__ignoreMap":1112},[1085,2945,2946],{},[1089,2947,2848],{},[1107,2949,2952],{"className":2950,"code":2951,"language":2483,"meta":1112},[2481],"idle: [Glow]\nafter Min: [Min]\nafter Neg: [Neg]\nafter cancel: [Glow]\n",[1094,2953,2951],{"__ignoreMap":1112},[1085,2955,2956],{},[1089,2957,2958],{},"Scenario 6 (hidden):",[1085,2960,2961],{},[1089,2962,2837],{},[1107,2964,2967],{"className":2965,"code":2966,"language":2483,"meta":1112},[2481],"Hi 9 Lo -3\n",[1094,2968,2966],{"__ignoreMap":1112},[1085,2970,2971],{},[1089,2972,2848],{},[1107,2974,2977],{"className":2975,"code":2976,"language":2483,"meta":1112},[2481],"idle: [Glow]\nafter Hi: [Hi]\nafter Lo: [Hi]\nafter cancel: [Glow]\n",[1094,2978,2976],{"__ignoreMap":1112},[1085,2980,2981],{},[1089,2982,2983],{},"Solution:",[1107,2985,2987],{"className":1109,"code":2986,"language":1111,"meta":1112,"style":1112},"import java.util.*;\nimport org.wpilib.command3.Command;\nimport org.wpilib.command3.Mechanism;\nimport org.wpilib.command3.Scheduler;\nimport org.wpilib.command3.TestSupport;\n\npublic class Main\n{\n    \u002F\u002F Don't change main\n    public static void main(String[] args)\n    {\n        TestSupport.init(); \u002F\u002F a fake robot clock and opmode, so the scheduler can run without a robot\n        Scanner in = new Scanner(System.in);\n        String nameA = in.next();\n        int priorityA = in.nextInt();\n        String nameB = in.next();\n        int priorityB = in.nextInt();\n\n        Scheduler scheduler = Scheduler.getDefault();\n        LedStrip strip = new LedStrip();\n        strip.setDefaultCommand(strip.glowCommand());\n        Command a = strip.warningCommand(nameA, priorityA);\n        Command b = strip.warningCommand(nameB, priorityB);\n\n        scheduler.run();\n        System.out.println(\"idle: \" + runningOn(strip));\n        scheduler.schedule(a);\n        scheduler.run();\n        System.out.println(\"after \" + nameA + \": \" + runningOn(strip));\n        scheduler.schedule(b);\n        scheduler.run();\n        System.out.println(\"after \" + nameB + \": \" + runningOn(strip));\n        scheduler.cancel(a);\n        scheduler.cancel(b);\n        scheduler.run();\n        scheduler.run();\n        System.out.println(\"after cancel: \" + runningOn(strip));\n    }\n\n    static List\u003CString> runningOn(Mechanism mechanism)\n    {\n        List\u003CString> names = new ArrayList\u003C>();\n        for (Command command : mechanism.getRunningCommands())\n        {\n            names.add(command.name());\n        }\n        return names;\n    }\n}\n\nclass LedStrip implements Mechanism\n{\n    private void fade()\n    {\n        \u002F\u002F writes the next LED color; not needed for this exercise\n    }\n\n    public Command warningCommand(String name, int priority)\n    {\n        return run(coroutine -> coroutine.park()).withPriority(priority).named(name);\n    }\n\n    public Command glowCommand()\n    {\n        return runRepeatedly(this::fade).withPriority(Command.LOWEST_PRIORITY).named(\"Glow\");\n    }\n}\n",[1094,2988,2989,2993,2997,3001,3005,3009,3013,3017,3021,3025,3029,3033,3037,3041,3045,3049,3053,3057,3061,3065,3069,3073,3077,3081,3085,3089,3093,3097,3101,3105,3109,3113,3117,3121,3125,3129,3133,3137,3141,3145,3149,3153,3157,3161,3165,3169,3173,3177,3181,3185,3189,3193,3197,3201,3205,3209,3213,3217,3222,3226,3231,3235,3240,3246,3251,3257,3262],{"__ignoreMap":1112},[1116,2990,2991],{"class":1118,"line":1119},[1116,2992,2500],{},[1116,2994,2995],{"class":1118,"line":1125},[1116,2996,2505],{},[1116,2998,2999],{"class":1118,"line":1131},[1116,3000,2510],{},[1116,3002,3003],{"class":1118,"line":1137},[1116,3004,2515],{},[1116,3006,3007],{"class":1118,"line":1143},[1116,3008,2520],{},[1116,3010,3011],{"class":1118,"line":1324},[1116,3012,2525],{"emptyLinePlaceholder":1669},[1116,3014,3015],{"class":1118,"line":1330},[1116,3016,2530],{},[1116,3018,3019],{"class":1118,"line":1761},[1116,3020,1134],{},[1116,3022,3023],{"class":1118,"line":1767},[1116,3024,2539],{},[1116,3026,3027],{"class":1118,"line":1773},[1116,3028,2266],{},[1116,3030,3031],{"class":1118,"line":2304},[1116,3032,2271],{},[1116,3034,3035],{"class":1118,"line":2550},[1116,3036,2553],{},[1116,3038,3039],{"class":1118,"line":2556},[1116,3040,2559],{},[1116,3042,3043],{"class":1118,"line":2562},[1116,3044,2565],{},[1116,3046,3047],{"class":1118,"line":2568},[1116,3048,2571],{},[1116,3050,3051],{"class":1118,"line":2574},[1116,3052,2577],{},[1116,3054,3055],{"class":1118,"line":2580},[1116,3056,2583],{},[1116,3058,3059],{"class":1118,"line":2586},[1116,3060,2525],{"emptyLinePlaceholder":1669},[1116,3062,3063],{"class":1118,"line":2591},[1116,3064,2594],{},[1116,3066,3067],{"class":1118,"line":2597},[1116,3068,2600],{},[1116,3070,3071],{"class":1118,"line":2603},[1116,3072,2606],{},[1116,3074,3075],{"class":1118,"line":2609},[1116,3076,2612],{},[1116,3078,3079],{"class":1118,"line":2615},[1116,3080,2618],{},[1116,3082,3083],{"class":1118,"line":2621},[1116,3084,2525],{"emptyLinePlaceholder":1669},[1116,3086,3087],{"class":1118,"line":2626},[1116,3088,2629],{},[1116,3090,3091],{"class":1118,"line":2632},[1116,3092,2635],{},[1116,3094,3095],{"class":1118,"line":2638},[1116,3096,2641],{},[1116,3098,3099],{"class":1118,"line":2644},[1116,3100,2629],{},[1116,3102,3103],{"class":1118,"line":2649},[1116,3104,2652],{},[1116,3106,3107],{"class":1118,"line":2655},[1116,3108,2658],{},[1116,3110,3111],{"class":1118,"line":2661},[1116,3112,2629],{},[1116,3114,3115],{"class":1118,"line":2666},[1116,3116,2669],{},[1116,3118,3119],{"class":1118,"line":2672},[1116,3120,2675],{},[1116,3122,3123],{"class":1118,"line":2678},[1116,3124,2681],{},[1116,3126,3127],{"class":1118,"line":2684},[1116,3128,2629],{},[1116,3130,3131],{"class":1118,"line":2689},[1116,3132,2629],{},[1116,3134,3135],{"class":1118,"line":2694},[1116,3136,2697],{},[1116,3138,3139],{"class":1118,"line":2700},[1116,3140,2301],{},[1116,3142,3143],{"class":1118,"line":2705},[1116,3144,2525],{"emptyLinePlaceholder":1669},[1116,3146,3147],{"class":1118,"line":2710},[1116,3148,2713],{},[1116,3150,3151],{"class":1118,"line":2716},[1116,3152,2271],{},[1116,3154,3155],{"class":1118,"line":2721},[1116,3156,2724],{},[1116,3158,3159],{"class":1118,"line":2727},[1116,3160,2730],{},[1116,3162,3163],{"class":1118,"line":2733},[1116,3164,1753],{},[1116,3166,3167],{"class":1118,"line":2738},[1116,3168,2741],{},[1116,3170,3171],{"class":1118,"line":2744},[1116,3172,1764],{},[1116,3174,3175],{"class":1118,"line":2749},[1116,3176,2752],{},[1116,3178,3179],{"class":1118,"line":2755},[1116,3180,2301],{},[1116,3182,3183],{"class":1118,"line":2760},[1116,3184,1146],{},[1116,3186,3187],{"class":1118,"line":2765},[1116,3188,2525],{"emptyLinePlaceholder":1669},[1116,3190,3191],{"class":1118,"line":2770},[1116,3192,2773],{},[1116,3194,3195],{"class":1118,"line":2776},[1116,3196,1134],{},[1116,3198,3199],{"class":1118,"line":2781},[1116,3200,2784],{},[1116,3202,3203],{"class":1118,"line":2787},[1116,3204,2271],{},[1116,3206,3207],{"class":1118,"line":2792},[1116,3208,2795],{},[1116,3210,3211],{"class":1118,"line":2798},[1116,3212,2301],{},[1116,3214,3215],{"class":1118,"line":2803},[1116,3216,2525],{"emptyLinePlaceholder":1669},[1116,3218,3219],{"class":1118,"line":2808},[1116,3220,3221],{},"    public Command warningCommand(String name, int priority)\n",[1116,3223,3224],{"class":1118,"line":2814},[1116,3225,2271],{},[1116,3227,3228],{"class":1118,"line":2819},[1116,3229,3230],{},"        return run(coroutine -> coroutine.park()).withPriority(priority).named(name);\n",[1116,3232,3233],{"class":1118,"line":2825},[1116,3234,2301],{},[1116,3236,3238],{"class":1118,"line":3237},62,[1116,3239,2525],{"emptyLinePlaceholder":1669},[1116,3241,3243],{"class":1118,"line":3242},63,[1116,3244,3245],{},"    public Command glowCommand()\n",[1116,3247,3249],{"class":1118,"line":3248},64,[1116,3250,2271],{},[1116,3252,3254],{"class":1118,"line":3253},65,[1116,3255,3256],{},"        return runRepeatedly(this::fade).withPriority(Command.LOWEST_PRIORITY).named(\"Glow\");\n",[1116,3258,3260],{"class":1118,"line":3259},66,[1116,3261,2301],{},[1116,3263,3265],{"class":1118,"line":3264},67,[1116,3266,1146],{},[1085,3268,3269,1152,3271,3274,3275,1152,3277,3280,3281,3283,3284,3286,3287,3289,3290,3292,3293,1092,3296,3299,3300,3303,3304,3307,3308,3310,3311,3314,3315,3318,3319,3322,3323,3325,3326,3329,3330,3333,3334,3336,3337,3339,3340,3342],{},[1089,3270,2126],{},[1094,3272,3273],{},"withPriority(...)"," goes ",[1089,3276,2373],{},[1094,3278,3279],{},".named(...)",", because ",[1094,3282,3279],{}," is what produces the\nfinished ",[1094,3285,1452],{},". The scheduler settles a requirement conflict by comparing priorities: a\nnewcomer with an ",[1089,3288,1278],{}," priority takes the strip, and a ",[1089,3291,1284],{}," one is refused. So\nin ",[1094,3294,3295],{},"High 5 Low 1",[1094,3297,3298],{},"Low"," is refused and ",[1094,3301,3302],{},"High"," keeps running, while in ",[1094,3305,3306],{},"A 3 B 3"," the equal-priority\n",[1094,3309,2473],{}," takes over. ",[1094,3312,3313],{},"Glow"," has the lowest possible priority, so even a warning with a ",[1228,3316,3317],{},"negative","\npriority (",[1094,3320,3321],{},"Neg -5",") beats it: if ",[1094,3324,2429],{}," forgot ",[1094,3327,3328],{},".withPriority(Command.LOWEST_PRIORITY)",",\nits priority would be ",[1094,3331,3332],{},"0",", and ",[1094,3335,3321],{}," would be refused. When both warnings are canceled, nothing\nrequires the strip any more, so the scheduler queues the ",[1089,3338,1363],{}," again and ",[1094,3341,3313],{},"\nreturns.",[1650,3344,1652],{},{"title":1112,"searchDepth":1125,"depth":1125,"links":3346},[3347,3348,3349],{"id":2062,"depth":1125,"text":2063},{"id":2150,"depth":1125,"text":2151},{"id":2387,"depth":1125,"text":2388},{"outlineRef":1667,"pairsWith":2049,"status":3351},"new — authored exercises (Multiple Choice + Micro-Parsons + Coding); rewritten for Commands v3",{"title":1024,"description":1112},"pn85xJQBtfVuxtnWP_pqJxOmGcdL30GO8HFGrcuHWkE",1792718166796]