[{"data":1,"prerenderedAt":3863},["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.2":1070,"item-example-full-ch25-command-based-programming-25.2":2008,"item-exercise-full-ch25-command-based-programming-25.2":2469},[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":274,"body":1072,"description":1104,"extension":2002,"meta":2003,"navigation":1601,"path":273,"seo":2006,"stem":275,"__hash__":2007},"lessons\u002Fshockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F25.2-commands-and-command-compositions.md",{"type":1073,"value":1074,"toc":1988},"minimark",[1075,1079,1084,1098,1175,1209,1284,1298,1301,1305,1346,1350,1357,1387,1393,1397,1432,1458,1461,1486,1490,1508,1545,1556,1564,1582,1613,1624,1628,1645,1700,1713,1728,1742,1750,1756,1763,1788,1801,1805,1866,1870,1947,1984],[1076,1077,274],"h1",{"id":1078},"commands-command-compositions",[1080,1081,1083],"h2",{"id":1082},"one-body-written-like-a-normal-method","One Body, Written Like a Normal Method",[1085,1086,1087,1088,1092,1093,1097],"p",{},"In Commands v3, a command's entire behavior is ",[1089,1090,1091],"strong",{},"one block of code"," — a lambda that receives a ",[1094,1095,1096],"code",{},"Coroutine"," object. The body reads top to bottom like any method you've written: code before a loop runs once when the command starts, the loop runs once per scheduler loop, and code after the loop runs once when the goal is reached.",[1099,1100,1105],"pre",{"className":1101,"code":1102,"language":1103,"meta":1104,"style":1104},"language-java shiki shiki-themes github-light github-dark","public Command raiseCommand()\n{\n    return run(coroutine -> {\n        motor.setThrottle(0.5);       \u002F\u002F once, when the command starts\n        while (!topLimit.get())\n        {\n            coroutine.yield();        \u002F\u002F pause here until the next loop\n        }\n        motor.setThrottle(0.0);       \u002F\u002F once, when the top limit switch trips\n    }).named(\"Raise Elevator\");\n}\n","java","",[1094,1106,1107,1115,1121,1127,1133,1139,1145,1151,1157,1163,1169],{"__ignoreMap":1104},[1108,1109,1112],"span",{"class":1110,"line":1111},"line",1,[1108,1113,1114],{},"public Command raiseCommand()\n",[1108,1116,1118],{"class":1110,"line":1117},2,[1108,1119,1120],{},"{\n",[1108,1122,1124],{"class":1110,"line":1123},3,[1108,1125,1126],{},"    return run(coroutine -> {\n",[1108,1128,1130],{"class":1110,"line":1129},4,[1108,1131,1132],{},"        motor.setThrottle(0.5);       \u002F\u002F once, when the command starts\n",[1108,1134,1136],{"class":1110,"line":1135},5,[1108,1137,1138],{},"        while (!topLimit.get())\n",[1108,1140,1142],{"class":1110,"line":1141},6,[1108,1143,1144],{},"        {\n",[1108,1146,1148],{"class":1110,"line":1147},7,[1108,1149,1150],{},"            coroutine.yield();        \u002F\u002F pause here until the next loop\n",[1108,1152,1154],{"class":1110,"line":1153},8,[1108,1155,1156],{},"        }\n",[1108,1158,1160],{"class":1110,"line":1159},9,[1108,1161,1162],{},"        motor.setThrottle(0.0);       \u002F\u002F once, when the top limit switch trips\n",[1108,1164,1166],{"class":1110,"line":1165},10,[1108,1167,1168],{},"    }).named(\"Raise Elevator\");\n",[1108,1170,1172],{"class":1110,"line":1171},11,[1108,1173,1174],{},"}\n",[1085,1176,1177,1178,1181,1182,1185,1186,1189,1190,1193,1194,1189,1197,1200,1201,1204,1205,1208],{},"This method lives in an ",[1094,1179,1180],{},"Elevator"," class that ",[1094,1183,1184],{},"implements Mechanism",", where ",[1094,1187,1188],{},"motor"," is a ",[1094,1191,1192],{},"DriveMotor"," (Ch.4) and ",[1094,1195,1196],{},"topLimit",[1094,1198,1199],{},"DigitalInput"," (Ch.3). The ",[1089,1202,1203],{},"coroutine"," is the object that lets a command pause partway through and pick up again later: ",[1094,1206,1207],{},"coroutine.yield()"," means \"I'm done for this loop — let the rest of the robot run, and resume me right here next loop.\"",[1210,1211,1212,1228],"table",{},[1213,1214,1215],"thead",{},[1216,1217,1218,1222,1225],"tr",{},[1219,1220,1221],"th",{},"Part of the body",[1219,1223,1224],{},"When it runs",[1219,1226,1227],{},"The v2 method you'll see in older code",[1229,1230,1231,1245,1258,1271],"tbody",{},[1216,1232,1233,1237,1240],{},[1234,1235,1236],"td",{},"Code before the loop",[1234,1238,1239],{},"Once, when the command starts",[1234,1241,1242],{},[1094,1243,1244],{},"initialize()",[1216,1246,1247,1250,1253],{},[1234,1248,1249],{},"The loop's body",[1234,1251,1252],{},"Once per scheduler loop",[1234,1254,1255],{},[1094,1256,1257],{},"execute()",[1216,1259,1260,1263,1266],{},[1234,1261,1262],{},"The loop's condition",[1234,1264,1265],{},"Checked every loop to decide when to stop",[1234,1267,1268],{},[1094,1269,1270],{},"isFinished()",[1216,1272,1273,1276,1279],{},[1234,1274,1275],{},"Code after the loop",[1234,1277,1278],{},"Once, when the command finishes on its own",[1234,1280,1281],{},[1094,1282,1283],{},"end(false)",[1085,1285,1286,1289,1290,1293,1294,1297],{},[1089,1287,1288],{},"In v2 code you'll see"," a class that ",[1094,1291,1292],{},"extends Command"," and overrides those four methods separately, plus ",[1094,1295,1296],{},"addRequirements(...)"," in its constructor. v3 folds all four into the one body above; Lesson 25.7 has a v2 reading guide.",[1085,1299,1300],{},"A body with no loop at all simply runs once and ends — that's how a one-shot action like \"extend the piston\" is written.",[1080,1302,1304],{"id":1303},"every-command-has-a-name-enforced-by-a-staged-builder","Every Command Has a Name — Enforced by a Staged Builder",[1085,1306,1307,1310,1311,1314,1315,1318,1319,1322,1323,1325,1326,1330,1331,1334,1335,1334,1338,1341,1342,1345],{},[1094,1308,1309],{},"run(...)"," doesn't return a ",[1094,1312,1313],{},"Command"," yet. It returns a builder ",[1089,1316,1317],{},"stage",", and only calling ",[1094,1320,1321],{},".named(\"...\")"," on it produces the finished ",[1094,1324,1313],{},". This is the Builder Pattern from Ch.22 in a strict form: each stage only offers the methods that are legal next, so forgetting the name is a ",[1327,1328,1329],"em",{},"compile"," error, not a surprise at a match. Before naming, a stage can take optional settings — ",[1094,1332,1333],{},".whenExited(...)",", ",[1094,1336,1337],{},".whenCanceled(...)",[1094,1339,1340],{},".withPriority(...)",", and ",[1094,1343,1344],{},".until(...)"," — covered below and in Lesson 25.3.",[1080,1347,1349],{"id":1348},"requirements-come-from-how-you-build-the-command","Requirements Come From How You Build the Command",[1085,1351,1352,1353,1356],{},"A command ",[1089,1354,1355],{},"requires"," the mechanisms it controls, and the way you start building it decides which ones:",[1358,1359,1360,1375,1381],"ul",{},[1361,1362,1363,1366,1367,1370,1371,1374],"li",{},[1094,1364,1365],{},"elevator.run(...)"," or ",[1094,1368,1369],{},"elevator.runRepeatedly(...)"," — requires ",[1094,1372,1373],{},"elevator",", automatically.",[1361,1376,1377,1380],{},[1094,1378,1379],{},"Command.requiring(drive, arm).executing(coroutine -> ...)"," — requires several mechanisms at once.",[1361,1382,1383,1386],{},[1094,1384,1385],{},"Command.noRequirements(coroutine -> ...)"," — requires nothing; for commands that don't touch hardware, like resetting a software value or logging.",[1085,1388,1389,1390,1392],{},"There's no separate \"declare my requirements\" step to forget — which is exactly the mistake v2's ",[1094,1391,1296],{}," made easy.",[1080,1394,1396],{"id":1395},"built-in-factories-most-commands-are-one-statement","Built-In Factories: Most Commands Are One Statement",[1099,1398,1400],{"className":1101,"code":1399,"language":1103,"meta":1104,"style":1104},"hatch.run(coroutine -> hatch.grab()).named(\"Grab Hatch\");     \u002F\u002F runs once, then ends\ndrive.runRepeatedly(() -> drive.arcade(forward.getAsDouble(), turn.getAsDouble()))\n    .named(\"Arcade Drive\");                                   \u002F\u002F repeats until interrupted\nintake.idle();                                                \u002F\u002F owns the intake, idles\nCommand.waitFor(Seconds.of(5)).named(\"Wait 5 s\");             \u002F\u002F ends after 5 seconds\nCommand.waitUntil(limitSwitch::get).named(\"Wait for Switch\"); \u002F\u002F ends once this is true\n",[1094,1401,1402,1407,1412,1417,1422,1427],{"__ignoreMap":1104},[1108,1403,1404],{"class":1110,"line":1111},[1108,1405,1406],{},"hatch.run(coroutine -> hatch.grab()).named(\"Grab Hatch\");     \u002F\u002F runs once, then ends\n",[1108,1408,1409],{"class":1110,"line":1117},[1108,1410,1411],{},"drive.runRepeatedly(() -> drive.arcade(forward.getAsDouble(), turn.getAsDouble()))\n",[1108,1413,1414],{"class":1110,"line":1123},[1108,1415,1416],{},"    .named(\"Arcade Drive\");                                   \u002F\u002F repeats until interrupted\n",[1108,1418,1419],{"class":1110,"line":1129},[1108,1420,1421],{},"intake.idle();                                                \u002F\u002F owns the intake, idles\n",[1108,1423,1424],{"class":1110,"line":1135},[1108,1425,1426],{},"Command.waitFor(Seconds.of(5)).named(\"Wait 5 s\");             \u002F\u002F ends after 5 seconds\n",[1108,1428,1429],{"class":1110,"line":1141},[1108,1430,1431],{},"Command.waitUntil(limitSwitch::get).named(\"Wait for Switch\"); \u002F\u002F ends once this is true\n",[1085,1433,1434,1437,1438,1441,1442,1445,1446,1449,1450,1453,1454,1457],{},[1094,1435,1436],{},"runRepeatedly"," takes a plain ",[1094,1439,1440],{},"Runnable"," (Lesson 19.1) and calls it once every loop, yielding for you — a natural fit for a default command (Lesson 25.3). (Here ",[1094,1443,1444],{},"forward"," and ",[1094,1447,1448],{},"turn"," are ",[1094,1451,1452],{},"DoubleSupplier","s reading the joystick axes.) ",[1094,1455,1456],{},"idle()"," is already named and has the lowest possible priority, so anything else can take the mechanism from it.",[1085,1459,1460],{},"Inside a body, the coroutine has helpers for the most common kinds of pausing:",[1358,1462,1463,1468,1474,1480],{},[1361,1464,1465,1467],{},[1094,1466,1207],{}," — pause until the next loop.",[1361,1469,1470,1473],{},[1094,1471,1472],{},"coroutine.wait(Seconds.of(1))"," — pause for a length of time.",[1361,1475,1476,1479],{},[1094,1477,1478],{},"coroutine.waitUntil(limitSwitch::get)"," — pause until a condition is true.",[1361,1481,1482,1485],{},[1094,1483,1484],{},"coroutine.park()"," — pause forever, until something cancels the command.",[1080,1487,1489],{"id":1488},"cleaning-up-when-a-command-ends","Cleaning Up When a Command Ends",[1085,1491,1492,1493,1496,1497,1499,1500,1503,1504,1507],{},"A command that starts a motor usually has to stop it however the command ends — finished, canceled, or interrupted by another command. ",[1094,1494,1495],{},"whenExited(...)"," runs a ",[1094,1498,1440],{}," on ",[1327,1501,1502],{},"every"," exit; ",[1094,1505,1506],{},"whenCanceled(...)"," runs only when the command is stopped early.",[1099,1509,1511],{"className":1101,"code":1510,"language":1103,"meta":1104,"style":1104},"public Command spinCommand()\n{\n    return run(coroutine -> {\n        motor.setThrottle(0.8);\n        coroutine.park();             \u002F\u002F keep spinning until something stops this command\n    }).whenExited(() -> motor.setThrottle(0.0)).named(\"Spin Shooter\");\n}\n",[1094,1512,1513,1518,1522,1526,1531,1536,1541],{"__ignoreMap":1104},[1108,1514,1515],{"class":1110,"line":1111},[1108,1516,1517],{},"public Command spinCommand()\n",[1108,1519,1520],{"class":1110,"line":1117},[1108,1521,1120],{},[1108,1523,1524],{"class":1110,"line":1123},[1108,1525,1126],{},[1108,1527,1528],{"class":1110,"line":1129},[1108,1529,1530],{},"        motor.setThrottle(0.8);\n",[1108,1532,1533],{"class":1110,"line":1135},[1108,1534,1535],{},"        coroutine.park();             \u002F\u002F keep spinning until something stops this command\n",[1108,1537,1538],{"class":1110,"line":1141},[1108,1539,1540],{},"    }).whenExited(() -> motor.setThrottle(0.0)).named(\"Spin Shooter\");\n",[1108,1542,1543],{"class":1110,"line":1147},[1108,1544,1174],{},[1085,1546,1547,1548,1551,1552,1555],{},"Alpha note: ",[1094,1549,1550],{},"whenExited"," (and the ",[1094,1553,1554],{},"onExit()"," hook behind it) was added to v3 in September 2026 — re-check it against the current WPILib docs before the season.",[1080,1557,1559,1560,1563],{"id":1558},"units-durations-are-time-values-not-plain-numbers","Units: Durations Are ",[1094,1561,1562],{},"Time"," Values, Not Plain Numbers",[1085,1565,1566,1567,1569,1570,1573,1574,1577,1578,1581],{},"Every v3 method that takes a duration takes a ",[1094,1568,1562],{}," (from ",[1094,1571,1572],{},"org.wpilib.units.measure","), not a ",[1094,1575,1576],{},"double",". You make one from a unit constant in WPILib's ",[1094,1579,1580],{},"Units"," class, usually brought in with a static import (Lesson 3.3):",[1099,1583,1585],{"className":1101,"code":1584,"language":1103,"meta":1104,"style":1104},"import static org.wpilib.units.Units.Milliseconds;\nimport static org.wpilib.units.Units.Seconds;\n\nTime autoDelay = Seconds.of(2);        \u002F\u002F 2 seconds\nTime nudge = Milliseconds.of(100);     \u002F\u002F 0.1 seconds\n",[1094,1586,1587,1592,1597,1603,1608],{"__ignoreMap":1104},[1108,1588,1589],{"class":1110,"line":1111},[1108,1590,1591],{},"import static org.wpilib.units.Units.Milliseconds;\n",[1108,1593,1594],{"class":1110,"line":1117},[1108,1595,1596],{},"import static org.wpilib.units.Units.Seconds;\n",[1108,1598,1599],{"class":1110,"line":1123},[1108,1600,1602],{"emptyLinePlaceholder":1601},true,"\n",[1108,1604,1605],{"class":1110,"line":1129},[1108,1606,1607],{},"Time autoDelay = Seconds.of(2);        \u002F\u002F 2 seconds\n",[1108,1609,1610],{"class":1110,"line":1135},[1108,1611,1612],{},"Time nudge = Milliseconds.of(100);     \u002F\u002F 0.1 seconds\n",[1085,1614,1615,1616,1619,1620,1623],{},"The payoff: a bare ",[1094,1617,1618],{},"withTimeout(5)"," can't compile, so nobody can ever wonder whether that ",[1094,1621,1622],{},"5"," meant seconds or milliseconds.",[1080,1625,1627],{"id":1626},"command-compositions-building-bigger-actions-from-smaller-ones","Command Compositions: Building Bigger Actions From Smaller Ones",[1085,1629,1630,1631,1634,1635,1637,1638,1640,1641,1644],{},"A ",[1089,1632,1633],{},"command composition"," combines several commands into one — and since a composition is itself a ",[1094,1636,1313],{},", compositions can be nested arbitrarily deep. Like single commands, compositions are built with builders, so they also end in ",[1094,1639,1321],{}," — or ",[1094,1642,1643],{},".withAutomaticName()",", which names the group after its members. Three shapes matter most:",[1358,1646,1647,1662,1681],{},[1361,1648,1649,1652,1653],{},[1089,1650,1651],{},"Sequential"," — runs each command in order, one after another, finishing when the last one finishes:\n",[1099,1654,1656],{"className":1101,"code":1655,"language":1103,"meta":1104,"style":1104},"fooCommand.andThen(barCommand).withAutomaticName(); \u002F\u002F runs fooCommand, then barCommand\n",[1094,1657,1658],{"__ignoreMap":1104},[1108,1659,1660],{"class":1110,"line":1111},[1108,1661,1655],{},[1361,1663,1664,1667,1668,1671,1672],{},[1089,1665,1666],{},"Parallel"," — runs several commands at once, finishing once ",[1327,1669,1670],{},"all"," of them finish:\n",[1099,1673,1675],{"className":1101,"code":1674,"language":1103,"meta":1104,"style":1104},"Command.parallel(twoSec, oneSec, threeSec).named(\"All Three\"); \u002F\u002F ends after 3 seconds\n",[1094,1676,1677],{"__ignoreMap":1104},[1108,1678,1679],{"class":1110,"line":1111},[1108,1680,1674],{},[1361,1682,1683,1686,1687,1690,1691],{},[1089,1684,1685],{},"Race"," — runs several commands at once, finishing as soon as ",[1327,1688,1689],{},"any one"," of them finishes (canceling the rest):\n",[1099,1692,1694],{"className":1101,"code":1693,"language":1103,"meta":1104,"style":1104},"Command.race(twoSec, oneSec, threeSec).named(\"First Done\"); \u002F\u002F ends after 1 second\n",[1094,1695,1696],{"__ignoreMap":1104},[1108,1697,1698],{"class":1110,"line":1111},[1108,1699,1693],{},[1085,1701,1702,1705,1706,1445,1709,1712],{},[1094,1703,1704],{},"Command.sequence(a, b, c)"," builds a sequence from a list, and ",[1094,1707,1708],{},"a.alongWith(b)",[1094,1710,1711],{},"a.raceWith(b)"," are the chained forms of parallel and race. Two decorators add extra end conditions to any command:",[1099,1714,1716],{"className":1101,"code":1715,"language":1103,"meta":1104,"style":1104},"raise.until(limitSwitch::get).named(\"Raise to Switch\"); \u002F\u002F ends early if the switch trips\nraise.withTimeout(Seconds.of(5));                       \u002F\u002F ends after 5 s, no matter what\n",[1094,1717,1718,1723],{"__ignoreMap":1104},[1108,1719,1720],{"class":1110,"line":1111},[1108,1721,1722],{},"raise.until(limitSwitch::get).named(\"Raise to Switch\"); \u002F\u002F ends early if the switch trips\n",[1108,1724,1725],{"class":1110,"line":1117},[1108,1726,1727],{},"raise.withTimeout(Seconds.of(5));                       \u002F\u002F ends after 5 s, no matter what\n",[1085,1729,1730,1731,1734,1735,1737,1738,1741],{},"(",[1094,1732,1733],{},"withTimeout"," returns a finished, automatically named ",[1094,1736,1313],{},", so it needs no ",[1094,1739,1740],{},".named(...)",".)",[1080,1743,1745,1746,1749],{"id":1744},"requirements-of-a-composition-and-the-await-alternative","Requirements of a Composition, and the ",[1094,1747,1748],{},"await"," Alternative",[1085,1751,1752,1753,1755],{},"A built-in composition requires ",[1327,1754,1502],{}," mechanism any of its members requires, for its entire duration — a sequence that uses the intake, then the indexer, then the shooter holds all three the whole time, even while two of them are sitting unused. (Two members of one parallel group can't require the same mechanism at all; building such a group throws an error.)",[1085,1757,1758,1759,1762],{},"v3 offers a finer-grained alternative: a command with no requirements of its own that ",[1089,1760,1761],{},"awaits"," other commands from inside its body. Each awaited command claims its mechanism only while it's actually running:",[1099,1764,1766],{"className":1101,"code":1765,"language":1103,"meta":1104,"style":1104},"Command.noRequirements(coroutine -> {\n    coroutine.await(intake.intakeCommand());   \u002F\u002F intake is claimed only during this step\n    coroutine.await(shooter.fireCommand());    \u002F\u002F then the shooter, only during this step\n}).named(\"Intake Then Fire\");\n",[1094,1767,1768,1773,1778,1783],{"__ignoreMap":1104},[1108,1769,1770],{"class":1110,"line":1111},[1108,1771,1772],{},"Command.noRequirements(coroutine -> {\n",[1108,1774,1775],{"class":1110,"line":1117},[1108,1776,1777],{},"    coroutine.await(intake.intakeCommand());   \u002F\u002F intake is claimed only during this step\n",[1108,1779,1780],{"class":1110,"line":1123},[1108,1781,1782],{},"    coroutine.await(shooter.fireCommand());    \u002F\u002F then the shooter, only during this step\n",[1108,1784,1785],{"class":1110,"line":1129},[1108,1786,1787],{},"}).named(\"Intake Then Fire\");\n",[1085,1789,1790,1445,1793,1796,1797,1800],{},[1094,1791,1792],{},"coroutine.awaitAll(...)",[1094,1794,1795],{},"coroutine.awaitAny(...)"," wait for several commands at once, and ",[1094,1798,1799],{},"coroutine.fork(...)"," starts commands without waiting for them. A command started this way can never outlive the command that started it.",[1080,1802,1804],{"id":1803},"common-pitfalls","Common Pitfalls",[1358,1806,1807,1823,1847,1856],{},[1361,1808,1809,1815,1816,1819,1820,1822],{},[1089,1810,1811,1812,1814],{},"A loop that never calls ",[1094,1813,1207],{},"."," The scheduler runs one command at a time, and a command only gives control back when it yields. A ",[1094,1817,1818],{},"while"," loop without ",[1094,1821,1207],{}," never lets anything else run — not other commands, not trigger checks, not the rest of your robot code — so the whole robot hangs.",[1361,1824,1825,1836,1837,1840,1841,1844,1845,1814],{},[1089,1826,1827,1828,1831,1832,1835],{},"Writing ",[1094,1829,1830],{},"yield()"," without ",[1094,1833,1834],{},"coroutine."," in front."," ",[1094,1838,1839],{},"yield"," is a restricted word in Java (switch expressions use it, Lesson 5.12), so a bare ",[1094,1842,1843],{},"yield();"," is a compile error; the call must be written ",[1094,1846,1207],{},[1361,1848,1849,1852,1853,1814],{},[1089,1850,1851],{},"Using a coroutine that isn't yours."," Each command's body gets its own coroutine; calling methods on a different command's coroutine (for example, one captured by a lambda from an outer command) throws an ",[1094,1854,1855],{},"IllegalStateException",[1361,1857,1858,1861,1862,1865],{},[1089,1859,1860],{},"Forgetting that a sequential composition needs every step to actually finish."," If one command in a sequence never finishes — a loop that never ends, or a ",[1094,1863,1864],{},"park()"," — every command after it in the sequence never runs.",[1080,1867,1869],{"id":1868},"key-takeaways","Key Takeaways",[1358,1871,1872,1878,1884,1897,1930,1940],{},[1361,1873,1874,1875,1877],{},"A v3 command is one body: code before the loop runs once at the start, the loop body runs once per scheduler loop (ending with ",[1094,1876,1207],{},"), and code after the loop runs once at the end.",[1361,1879,1880,1881,1883],{},"Commands are built with staged builders, and every command must be named with ",[1094,1882,1740],{}," — a missing name is a compile error.",[1361,1885,1886,1887,1334,1890,1893,1894,1814],{},"Requirements come from how a command is built: ",[1094,1888,1889],{},"mechanism.run(...)",[1094,1891,1892],{},"Command.requiring(...)",", or ",[1094,1895,1896],{},"Command.noRequirements(...)",[1361,1898,1899,1900,1334,1903,1334,1905,1334,1908,1334,1911,1914,1915,1334,1917,1334,1920,1334,1923,1926,1927,1929],{},"Built-in factories (",[1094,1901,1902],{},"run",[1094,1904,1436],{},[1094,1906,1907],{},"idle",[1094,1909,1910],{},"Command.waitFor",[1094,1912,1913],{},"Command.waitUntil",") and coroutine helpers (",[1094,1916,1839],{},[1094,1918,1919],{},"wait",[1094,1921,1922],{},"waitUntil",[1094,1924,1925],{},"park",") cover most commands in one statement; ",[1094,1928,1495],{}," handles cleanup.",[1361,1931,1932,1933,1935,1936,1939],{},"Durations are ",[1094,1934,1562],{}," values, like ",[1094,1937,1938],{},"Seconds.of(2)"," — never plain numbers.",[1361,1941,1942,1943,1946],{},"Compositions (sequence, parallel, race) combine commands into bigger ones and are themselves ordinary commands; ",[1094,1944,1945],{},"coroutine.await(...)"," lets a command use each mechanism only while it needs it.",[1085,1948,1949,1950,1953,1954,1334,1957,1960,1961,1964,1965,1334,1968,1334,1971,1334,1974,1334,1977,1334,1980,1983],{},"Derived from ",[1094,1951,1952],{},"other-reference-repo",": ",[1094,1955,1956],{},"wpilib\u002Fcommand-based\u002F02-commands.md",[1094,1958,1959],{},"03-command-compositions.md"," (WPILIB 20.2-3); updated for Commands v3 from allwpilib ",[1094,1962,1963],{},"main"," (",[1094,1966,1967],{},"commandsv3\u002F…\u002Fcommand3\u002FCommand.java",[1094,1969,1970],{},"Coroutine.java",[1094,1972,1973],{},"Mechanism.java",[1094,1975,1976],{},"NeedsNameBuilderStage.java",[1094,1978,1979],{},"SequentialGroupBuilder.java",[1094,1981,1982],{},"ParallelGroupBuilder.java",")",[1985,1986,1987],"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":1104,"searchDepth":1117,"depth":1117,"links":1989},[1990,1991,1992,1993,1994,1995,1997,1998,2000,2001],{"id":1082,"depth":1117,"text":1083},{"id":1303,"depth":1117,"text":1304},{"id":1348,"depth":1117,"text":1349},{"id":1395,"depth":1117,"text":1396},{"id":1488,"depth":1117,"text":1489},{"id":1558,"depth":1117,"text":1996},"Units: Durations Are Time Values, Not Plain Numbers",{"id":1626,"depth":1117,"text":1627},{"id":1744,"depth":1117,"text":1999},"Requirements of a Composition, and the await Alternative",{"id":1803,"depth":1117,"text":1804},{"id":1868,"depth":1117,"text":1869},"md",{"outlineRef":2004,"status":2005},"25.2 — Commands & Command Compositions (WPILIB 20.2-3)","new — authored lesson (rewritten for Commands v3, WPILib 2027)",{"title":274,"description":1104},"yfnlYGBftm9IcQvb1rVZgMS9ICwMBy5AklHyqXL0Gyg",{"id":2009,"title":707,"body":2010,"description":1104,"extension":2002,"meta":2464,"navigation":1601,"path":706,"seo":2467,"stem":708,"__hash__":2468},"examples\u002Fshockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F25.2-commands-and-command-compositions.md",{"type":1073,"value":2011,"toc":2453},[2012,2015,2019,2052,2056,2078,2082,2139,2151,2155,2205,2245,2251,2254,2288,2294,2298,2335,2350,2354,2374,2402,2411,2415,2451],[1076,2013,707],{"id":2014},"commands-command-compositions-worked-example",[1080,2016,2018],{"id":2017},"problem","Problem",[1085,2020,1630,2021,1181,2024,2026,2027,1334,2030,1341,2033,2036,2037,2040,2041,2043,2044,2047,2048,2051],{},[1094,2022,2023],{},"Feeder",[1094,2025,1184],{}," has three methods: ",[1094,2028,2029],{},"spin(double speed)",[1094,2031,2032],{},"stop()",[1094,2034,2035],{},"hasPiece()"," (which returns ",[1094,2038,2039],{},"true"," once a game piece is fully loaded). Write a command factory on ",[1094,2042,2023],{}," that spins the feeder at ",[1094,2045,2046],{},"0.6"," until a piece is loaded, and makes sure the feeder stops however the command ends. Then write a short \"back the piece off slightly\" command — spin at ",[1094,2049,2050],{},"-0.2"," for a tenth of a second — so the piece isn't jammed against the shooter wheels, and compose the two into one command.",[1080,2053,2055],{"id":2054},"step-1-plan-it-first","Step 1: Plan It First",[2057,2058,2059,2062,2065,2068,2071],"ol",{},[1361,2060,2061],{},"Sort the behavior into the parts of one command body: what runs once at the start, what repeats every loop, and when it ends.",[1361,2063,2064],{},"Decide where the \"stop the feeder\" cleanup goes so it also runs if the command is canceled.",[1361,2066,2067],{},"Write the feed command with an explicit loop, then shorten it with a coroutine helper.",[1361,2069,2070],{},"Write the back-off command with a timed pause.",[1361,2072,2073,2074,2077],{},"Chain them with ",[1094,2075,2076],{},"andThen(...)"," and name the result.",[1080,2079,2081],{"id":2080},"step-2-sort-the-behavior-into-one-body","Step 2: Sort the Behavior Into One Body",[1210,2083,2084,2094],{},[1213,2085,2086],{},[1216,2087,2088,2091],{},[1219,2089,2090],{},"Part",[1219,2092,2093],{},"What goes there",[1229,2095,2096,2106,2117,2127],{},[1216,2097,2098,2101],{},[1234,2099,2100],{},"Before the loop (once, at the start)",[1234,2102,2103],{},[1094,2104,2105],{},"spin(0.6)",[1216,2107,2108,2111],{},[1234,2109,2110],{},"The loop (once per scheduler loop)",[1234,2112,2113,2114,2116],{},"nothing to do each loop — just ",[1094,2115,1207],{}," to pause",[1216,2118,2119,2121],{},[1234,2120,1262],{},[1234,2122,2123,2124],{},"keep going while ",[1094,2125,2126],{},"!hasPiece()",[1216,2128,2129,2135],{},[1234,2130,2131,2132,2134],{},"Cleanup on ",[1327,2133,1502],{}," exit",[1234,2136,2137],{},[1094,2138,2032],{},[1085,2140,2141,2142,2144,2145,2147,2148,2150],{},"The cleanup can't just go after the loop: if the driver cancels the command before a piece arrives, the body stops at its last ",[1094,2143,1830],{}," and never reaches the code after the loop. ",[1094,2146,1495],{}," runs on every exit — finished or canceled — so that's where ",[1094,2149,2032],{}," belongs.",[1080,2152,2154],{"id":2153},"step-3-write-it-with-an-explicit-loop","Step 3: Write It With an Explicit Loop",[1099,2156,2158],{"className":1101,"code":2157,"language":1103,"meta":1104,"style":1104},"public Command feedUntilLoadedCommand()\n{\n    return run(coroutine -> {\n        spin(0.6);\n        while (!hasPiece())\n        {\n            coroutine.yield();\n        }\n    }).whenExited(() -> stop()).named(\"Feed Until Loaded\");\n}\n",[1094,2159,2160,2165,2169,2173,2178,2183,2187,2192,2196,2201],{"__ignoreMap":1104},[1108,2161,2162],{"class":1110,"line":1111},[1108,2163,2164],{},"public Command feedUntilLoadedCommand()\n",[1108,2166,2167],{"class":1110,"line":1117},[1108,2168,1120],{},[1108,2170,2171],{"class":1110,"line":1123},[1108,2172,1126],{},[1108,2174,2175],{"class":1110,"line":1129},[1108,2176,2177],{},"        spin(0.6);\n",[1108,2179,2180],{"class":1110,"line":1135},[1108,2181,2182],{},"        while (!hasPiece())\n",[1108,2184,2185],{"class":1110,"line":1141},[1108,2186,1144],{},[1108,2188,2189],{"class":1110,"line":1147},[1108,2190,2191],{},"            coroutine.yield();\n",[1108,2193,2194],{"class":1110,"line":1153},[1108,2195,1156],{},[1108,2197,2198],{"class":1110,"line":1159},[1108,2199,2200],{},"    }).whenExited(() -> stop()).named(\"Feed Until Loaded\");\n",[1108,2202,2203],{"class":1110,"line":1165},[1108,2204,1174],{},[1358,2206,2207,2216,2228,2237],{},[1361,2208,2209,2211,2212,2215],{},[1094,2210,1309],{}," is the ",[1094,2213,2214],{},"Mechanism"," interface's factory, so the command automatically requires this feeder — no other command can drive the feeder while this one runs.",[1361,2217,2218,2219,2221,2222,2224,2225,2227],{},"The loop body is only ",[1094,2220,1207],{},": each loop, the command checks ",[1094,2223,2035],{}," and, if there's no piece yet, pauses until the next loop. Without that ",[1094,2226,1830],{},", the loop would spin forever inside one scheduler run and the whole robot would hang.",[1361,2229,2230,2231,2233,2234,2236],{},"When ",[1094,2232,2035],{}," becomes true, the loop ends, the body returns, and the command is finished — then ",[1094,2235,1550],{}," stops the motor.",[1361,2238,2239,2242,2243,1814],{},[1094,2240,2241],{},".named(\"Feed Until Loaded\")"," turns the builder into a finished ",[1094,2244,1313],{},[1080,2246,2248,2249],{"id":2247},"step-4-shorten-it-with-waituntil","Step 4: Shorten It With ",[1094,2250,1922],{},[1085,2252,2253],{},"\"Yield until a condition is true\" is so common that the coroutine has a helper for it:",[1099,2255,2257],{"className":1101,"code":2256,"language":1103,"meta":1104,"style":1104},"public Command feedUntilLoadedCommand()\n{\n    return run(coroutine -> {\n        spin(0.6);\n        coroutine.waitUntil(this::hasPiece);\n    }).whenExited(() -> stop()).named(\"Feed Until Loaded\");\n}\n",[1094,2258,2259,2263,2267,2271,2275,2280,2284],{"__ignoreMap":1104},[1108,2260,2261],{"class":1110,"line":1111},[1108,2262,2164],{},[1108,2264,2265],{"class":1110,"line":1117},[1108,2266,1120],{},[1108,2268,2269],{"class":1110,"line":1123},[1108,2270,1126],{},[1108,2272,2273],{"class":1110,"line":1129},[1108,2274,2177],{},[1108,2276,2277],{"class":1110,"line":1135},[1108,2278,2279],{},"        coroutine.waitUntil(this::hasPiece);\n",[1108,2281,2282],{"class":1110,"line":1141},[1108,2283,2200],{},[1108,2285,2286],{"class":1110,"line":1147},[1108,2287,1174],{},[1085,2289,2290,2293],{},[1094,2291,2292],{},"coroutine.waitUntil(this::hasPiece)"," does exactly what Step 3's loop did — check, yield, check again — so the behavior is identical.",[1080,2295,2297],{"id":2296},"step-5-the-back-off-command","Step 5: The Back-Off Command",[1099,2299,2301],{"className":1101,"code":2300,"language":1103,"meta":1104,"style":1104},"public Command backOffCommand()\n{\n    return run(coroutine -> {\n        spin(-0.2);\n        coroutine.wait(Milliseconds.of(100));\n    }).whenExited(() -> stop()).named(\"Back Off\");\n}\n",[1094,2302,2303,2308,2312,2316,2321,2326,2331],{"__ignoreMap":1104},[1108,2304,2305],{"class":1110,"line":1111},[1108,2306,2307],{},"public Command backOffCommand()\n",[1108,2309,2310],{"class":1110,"line":1117},[1108,2311,1120],{},[1108,2313,2314],{"class":1110,"line":1123},[1108,2315,1126],{},[1108,2317,2318],{"class":1110,"line":1129},[1108,2319,2320],{},"        spin(-0.2);\n",[1108,2322,2323],{"class":1110,"line":1135},[1108,2324,2325],{},"        coroutine.wait(Milliseconds.of(100));\n",[1108,2327,2328],{"class":1110,"line":1141},[1108,2329,2330],{},"    }).whenExited(() -> stop()).named(\"Back Off\");\n",[1108,2332,2333],{"class":1110,"line":1147},[1108,2334,1174],{},[1085,2336,2337,2340,2341,2343,2344,2347,2348,2236],{},[1094,2338,2339],{},"coroutine.wait(...)"," takes a ",[1094,2342,1562],{},", made here with ",[1094,2345,2346],{},"Milliseconds.of(100)"," — a tenth of a second. The body pauses for that long (a few scheduler loops), then returns, and ",[1094,2349,1550],{},[1080,2351,2353],{"id":2352},"step-6-compose-them","Step 6: Compose Them",[1099,2355,2357],{"className":1101,"code":2356,"language":1103,"meta":1104,"style":1104},"Command loadPiece = feeder.feedUntilLoadedCommand()\n    .andThen(feeder.backOffCommand())\n    .withAutomaticName();\n",[1094,2358,2359,2364,2369],{"__ignoreMap":1104},[1108,2360,2361],{"class":1110,"line":1111},[1108,2362,2363],{},"Command loadPiece = feeder.feedUntilLoadedCommand()\n",[1108,2365,2366],{"class":1110,"line":1117},[1108,2367,2368],{},"    .andThen(feeder.backOffCommand())\n",[1108,2370,2371],{"class":1110,"line":1123},[1108,2372,2373],{},"    .withAutomaticName();\n",[1358,2375,2376,2381,2393],{},[1361,2377,2378,2380],{},[1094,2379,2076],{}," makes a sequential composition: the back-off starts only after the feed command finishes. If the piece never arrives, the feed command never finishes, and the back-off never runs — every step of a sequence has to actually finish.",[1361,2382,2383,2385,2386,2389,2390,1814],{},[1094,2384,2076],{}," returns a builder, so the sequence needs a name too; ",[1094,2387,2388],{},"withAutomaticName()"," names it after its members, ",[1094,2391,2392],{},"\"Feed Until Loaded -> Back Off\"",[1361,2394,2395,2398,2399,2401],{},[1094,2396,2397],{},"loadPiece"," is itself just a ",[1094,2400,1313],{},", requiring the feeder for its whole duration — so it can be bound to a button, or composed into something bigger, like any other command.",[1085,2403,2404,2405,2408,2409,1814],{},"Each call to a factory method builds a brand-new command object, so ",[1094,2406,2407],{},"feedUntilLoadedCommand()"," can still be bound to its own button somewhere else without clashing with the one inside ",[1094,2410,2397],{},[1080,2412,2414],{"id":2413},"recap","Recap",[1358,2416,2417,2423,2429,2439],{},[1361,2418,2419,2420,2422],{},"A v3 command is one body: start-up code, a loop that ends in ",[1094,2421,1207],{},", and whatever should happen when the loop's condition says stop.",[1361,2424,2425,2426,2428],{},"Cleanup that must happen however the command ends goes in ",[1094,2427,1495],{},", not after the loop.",[1361,2430,2431,2432,1445,2435,2438],{},"Coroutine helpers like ",[1094,2433,2434],{},"waitUntil(...)",[1094,2436,2437],{},"wait(Milliseconds.of(...))"," replace hand-written yield loops.",[1361,2440,2441,2443,2444,2446,2447,1366,2449,1814],{},[1094,2442,1309],{}," makes the command require its mechanism automatically, and every command — including a composition like ",[1094,2445,2076],{}," — needs ",[1094,2448,1740],{},[1094,2450,1643],{},[1985,2452,1987],{},{"title":1104,"searchDepth":1117,"depth":1117,"links":2454},[2455,2456,2457,2458,2459,2461,2462,2463],{"id":2017,"depth":1117,"text":2018},{"id":2054,"depth":1117,"text":2055},{"id":2080,"depth":1117,"text":2081},{"id":2153,"depth":1117,"text":2154},{"id":2247,"depth":1117,"text":2460},"Step 4: Shorten It With waitUntil",{"id":2296,"depth":1117,"text":2297},{"id":2352,"depth":1117,"text":2353},{"id":2413,"depth":1117,"text":2414},{"outlineRef":2004,"pairsWith":2465,"status":2466},"[`lessons\u002Fch25-command-based-programming\u002F25.2-commands-and-command-compositions.md`](..\u002F..\u002Flessons\u002Fch25-command-based-programming\u002F25.2-commands-and-command-compositions.md)","new — authored worked example (fully solved, walked step by step — not a problem to attempt); rewritten for Commands v3",{"title":707,"description":1104},"mkyagm5FX3cUVgVNifDwub9I1FXN-ULbt_jXVatacUA",{"id":2470,"title":1020,"body":2471,"description":1104,"extension":2002,"meta":3859,"navigation":1601,"path":1019,"seo":3861,"stem":1021,"__hash__":3862},"exercises\u002Fshockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F25.2-commands-and-command-compositions.md",{"type":1073,"value":2472,"toc":3854},[2473,2476,2480,2486,2516,2521,2535,2541,2553,2575,2579,2613,2616,2639,2645,2707,2712,2781,2861,2865,2871,2886,2938,2948,2956,2959,2965,2970,3331,3336,3341,3346,3351,3356,3361,3365,3371,3375,3381,3386,3390,3396,3400,3406,3411,3415,3421,3425,3431,3436,3440,3446,3450,3456,3461,3808,3852],[1076,2474,1020],{"id":2475},"commands-command-compositions-exercises",[1080,2477,2479],{"id":2478},"multiple-choice","Multiple Choice",[1085,2481,2482,2485],{},[1089,2483,2484],{},"Question:"," Roughly how long after it's scheduled does this composition finish?",[1099,2487,2489],{"className":1101,"code":2488,"language":1103,"meta":1104,"style":1104},"Command routine = Command.waitFor(Seconds.of(2)).named(\"Wait 2 s\")\n    .andThen(Command.parallel(\n        Command.waitFor(Seconds.of(1)).named(\"Wait 1 s\"),\n        Command.waitFor(Seconds.of(3)).named(\"Wait 3 s\")).named(\"Both Waits\"))\n    .named(\"Routine\");\n",[1094,2490,2491,2496,2501,2506,2511],{"__ignoreMap":1104},[1108,2492,2493],{"class":1110,"line":1111},[1108,2494,2495],{},"Command routine = Command.waitFor(Seconds.of(2)).named(\"Wait 2 s\")\n",[1108,2497,2498],{"class":1110,"line":1117},[1108,2499,2500],{},"    .andThen(Command.parallel(\n",[1108,2502,2503],{"class":1110,"line":1123},[1108,2504,2505],{},"        Command.waitFor(Seconds.of(1)).named(\"Wait 1 s\"),\n",[1108,2507,2508],{"class":1110,"line":1129},[1108,2509,2510],{},"        Command.waitFor(Seconds.of(3)).named(\"Wait 3 s\")).named(\"Both Waits\"))\n",[1108,2512,2513],{"class":1110,"line":1135},[1108,2514,2515],{},"    .named(\"Routine\");\n",[1085,2517,2518],{},[1089,2519,2520],{},"Options:",[1358,2522,2523,2526,2529,2532],{},[1361,2524,2525],{},"A. About 3 seconds",[1361,2527,2528],{},"B. About 5 seconds",[1361,2530,2531],{},"C. About 6 seconds",[1361,2533,2534],{},"D. About 1 second",[1085,2536,2537,2540],{},[1089,2538,2539],{},"Answer:"," B",[1085,2542,2543,1836,2546,2549,2550,2552],{},[1089,2544,2545],{},"Why:",[1094,2547,2548],{},"andThen"," is sequential: the 2-second wait runs first, and only when it finishes does the parallel group start. A parallel group finishes once ",[1327,2551,1670],{}," of its commands finish, so it lasts as long as its longest member — 3 seconds. Total: 2 + 3 = 5 seconds.",[1358,2554,2555,2566,2569],{},[1361,2556,2557,2558,2561,2562,2565],{},"A is wrong — 2 + 1 = 3 treats the parallel group like a race, which ends when the ",[1327,2559,2560],{},"first"," member finishes. ",[1094,2563,2564],{},"parallel"," waits for the last one.",[1361,2567,2568],{},"C is wrong — 2 + 1 + 3 = 6 runs everything back to back, but the 1-second and 3-second waits run at the same time, not one after the other.",[1361,2570,2571,2572,2574],{},"D is wrong — that would only happen if all three waits raced each other from the start; ",[1094,2573,2548],{}," makes the parallel group wait until the 2-second wait is done.",[1080,2576,2578],{"id":2577},"micro-parsons","Micro-Parsons",[1085,2580,2581,2584,2585,1181,2588,2590,2591,2594,2595,2598,2599,2601,2602,2605,2606,2609,2610,1814],{},[1089,2582,2583],{},"Problem:"," A ",[1094,2586,2587],{},"Climber",[1094,2589,1184],{}," has three methods of its own: ",[1094,2592,2593],{},"extendHook()"," starts the hook motor, ",[1094,2596,2597],{},"hookAtTop()"," returns ",[1094,2600,2039],{}," once the hook is fully extended, and ",[1094,2603,2604],{},"holdPosition()"," holds the hook where it is. Write the factory method ",[1094,2607,2608],{},"extendHookCommand()",": it extends the hook once when the command starts, pauses once per loop until the hook is at the top, and holds position however the command ends. Its name is ",[1094,2611,2612],{},"\"Extend Hook\"",[1085,2614,2615],{},"Given this class:",[1099,2617,2619],{"className":1101,"code":2618,"language":1103,"meta":1104,"style":1104},"public class Climber implements Mechanism\n{\n    \u002F\u002F your fragments go here\n}\n",[1094,2620,2621,2626,2630,2635],{"__ignoreMap":1104},[1108,2622,2623],{"class":1110,"line":1111},[1108,2624,2625],{},"public class Climber implements Mechanism\n",[1108,2627,2628],{"class":1110,"line":1117},[1108,2629,1120],{},[1108,2631,2632],{"class":1110,"line":1123},[1108,2633,2634],{},"    \u002F\u002F your fragments go here\n",[1108,2636,2637],{"class":1110,"line":1129},[1108,2638,1174],{},[1085,2640,2641,2642,2644],{},"Reorder the fragments below into the ",[1094,2643,2608],{}," method:",[1358,2646,2647,2653,2659,2665,2671,2677,2683,2689,2695,2701],{},[1361,2648,2649,2650],{},"a. ",[1094,2651,2652],{},"                coroutine.yield();",[1361,2654,2655,2656],{},"b. ",[1094,2657,2658],{},"    public Command extendHookCommand()",[1361,2660,2661,2662],{},"c. ",[1094,2663,2664],{},"        }).whenExited(() -> holdPosition()).named(\"Extend Hook\");",[1361,2666,2667,2668],{},"d. ",[1094,2669,2670],{},"            extendHook();",[1361,2672,2673,2674],{},"e. ",[1094,2675,2676],{},"    {",[1361,2678,2679,2680],{},"f. ",[1094,2681,2682],{},"            while (!hookAtTop())",[1361,2684,2685,2686],{},"g. ",[1094,2687,2688],{},"        return run(coroutine -> {",[1361,2690,2691,2692],{},"h. ",[1094,2693,2694],{},"    }",[1361,2696,2697,2698],{},"i. ",[1094,2699,2700],{},"            {",[1361,2702,2703,2704],{},"j. ",[1094,2705,2706],{},"            }",[1085,2708,2709,2711],{},[1089,2710,2539],{}," b, e, g, d, f, i, a, j, c, h",[1099,2713,2715],{"className":1101,"code":2714,"language":1103,"meta":1104,"style":1104},"public class Climber implements Mechanism\n{\n    public Command extendHookCommand()\n    {\n        return run(coroutine -> {\n            extendHook();\n            while (!hookAtTop())\n            {\n                coroutine.yield();\n            }\n        }).whenExited(() -> holdPosition()).named(\"Extend Hook\");\n    }\n}\n",[1094,2716,2717,2721,2725,2730,2735,2740,2745,2750,2755,2760,2765,2770,2776],{"__ignoreMap":1104},[1108,2718,2719],{"class":1110,"line":1111},[1108,2720,2625],{},[1108,2722,2723],{"class":1110,"line":1117},[1108,2724,1120],{},[1108,2726,2727],{"class":1110,"line":1123},[1108,2728,2729],{},"    public Command extendHookCommand()\n",[1108,2731,2732],{"class":1110,"line":1129},[1108,2733,2734],{},"    {\n",[1108,2736,2737],{"class":1110,"line":1135},[1108,2738,2739],{},"        return run(coroutine -> {\n",[1108,2741,2742],{"class":1110,"line":1141},[1108,2743,2744],{},"            extendHook();\n",[1108,2746,2747],{"class":1110,"line":1147},[1108,2748,2749],{},"            while (!hookAtTop())\n",[1108,2751,2752],{"class":1110,"line":1153},[1108,2753,2754],{},"            {\n",[1108,2756,2757],{"class":1110,"line":1159},[1108,2758,2759],{},"                coroutine.yield();\n",[1108,2761,2762],{"class":1110,"line":1165},[1108,2763,2764],{},"            }\n",[1108,2766,2767],{"class":1110,"line":1171},[1108,2768,2769],{},"        }).whenExited(() -> holdPosition()).named(\"Extend Hook\");\n",[1108,2771,2773],{"class":1110,"line":2772},12,[1108,2774,2775],{},"    }\n",[1108,2777,2779],{"class":1110,"line":2778},13,[1108,2780,1174],{},[1085,2782,2783,2786,2787,2790,2791,2794,2795,1964,2798,2801,2802,1964,2804,2807,2808,1334,2811,1334,2814,1334,2817,2820,2821,2823,2824,2826,2827,2830,2831,2833,2834,2837,2838,2840,2841,2843,2844,2847,2848,2850,2851,2854,2855,2857,2858,2860],{},[1089,2784,2785],{},"Why this order:"," The method's signature (",[1094,2788,2789],{},"b",") and brace (",[1094,2792,2793],{},"e",") come first. ",[1094,2796,2797],{},"return run(coroutine -> {",[1094,2799,2800],{},"g",") starts building a command that requires this climber, with one body. Inside the body, ",[1094,2803,2593],{},[1094,2805,2806],{},"d",") comes before the loop, so it runs exactly once, when the command starts. The loop (",[1094,2809,2810],{},"f",[1094,2812,2813],{},"i",[1094,2815,2816],{},"a",[1094,2818,2819],{},"j",") keeps checking ",[1094,2822,2597],{},", and its body is ",[1094,2825,1207],{}," — pausing until the next scheduler loop. Without that yield, the loop would never give control back and the whole robot would hang. Then ",[1094,2828,2829],{},"})"," closes the body and the ",[1094,2832,1309],{}," call on the same fragment (",[1094,2835,2836],{},"c","), which adds ",[1094,2839,1495],{}," — so ",[1094,2842,2604],{}," runs whether the hook reaches the top or the command is canceled early — and finishes with ",[1094,2845,2846],{},".named(\"Extend Hook\")",", which turns the builder into a ",[1094,2849,1313],{},". The method's brace closes last (",[1094,2852,2853],{},"h","). No ",[1094,2856,1296],{}," appears anywhere: building the command with the climber's own ",[1094,2859,1309],{}," makes it require the climber automatically.",[1080,2862,2864],{"id":2863},"coding","Coding",[1085,2866,2867,2870],{},[1089,2868,2869],{},"Mode:"," full-program",[1085,2872,2873,2875,2876,2878,2879,2882,2883,2885],{},[1089,2874,2583],{}," An ",[1094,2877,1180],{}," (below, partly written) is a Commands v3 mechanism. ",[1094,2880,2881],{},"atTop()"," reads the top limit\nswitch (here a flag that the fixed ",[1094,2884,1963],{}," flips). Write two pieces:",[1358,2887,2888,2913],{},[1361,2889,2890,2893,2894,2897,2898,2900,2901,2909,2910,1814],{},[1094,2891,2892],{},"Elevator.raiseCommand()",": a command that ",[1089,2895,2896],{},"requires the elevator",", pauses once per loop (with\n",[1094,2899,1207],{},") ",[1089,2902,2903,2904,2906,2907],{},"until ",[1094,2905,2881],{}," is ",[1094,2908,2039],{},", and is named ",[1094,2911,2912],{},"\"Raise Elevator\"",[1361,2914,2915,2918,2919,2922,2923,2926,2927,2930,2931,2934,2935,2937],{},[1094,2916,2917],{},"Autos.raiseThenWait(elevator, label)",": a ",[1089,2920,2921],{},"sequence"," that runs the raise command, then a\n",[1094,2924,2925],{},"Command.waitFor(...)"," pause of ",[1089,2928,2929],{},"2 seconds"," named ",[1094,2932,2933],{},"label",". Finish the sequence with\n",[1094,2936,1643],{},", so its name is built from its members.",[1085,2939,2940,2941,2943,2944,2947],{},"The fixed ",[1094,2942,1963],{}," reads a label and a number of loops, builds both commands, and prints what it can\ntell about them. Then it ",[1089,2945,2946],{},"runs the real scheduler"," (on a fake clock): first the raise command,\nwith the top switch tripping after that many loops, then the whole routine over simulated seconds.\nFor the input below:",[1099,2949,2954],{"className":2950,"code":2952,"language":2953,"meta":1104},[2951],"language-text","Lift And Hold\n2\n","text",[1094,2955,2952],{"__ignoreMap":1104},[1085,2957,2958],{},"the output is:",[1099,2960,2963],{"className":2961,"code":2962,"language":2953,"meta":1104},[2951],"Raise Elevator | requires elevator: true\nRaise Elevator -> Lift And Hold | requires elevator: true\nloop 1: raise running = true\nloop 2: raise running = true\nloop 3: raise running = false\nloop 4: raise running = false\nroutine running = true\nroutine running = true\nroutine running = false\nroutine running = false\n",[1094,2964,2962],{"__ignoreMap":1104},[1085,2966,2967],{},[1089,2968,2969],{},"Starter:",[1099,2971,2973],{"className":1101,"code":2972,"language":1103,"meta":1104,"style":1104},"import java.util.*;\nimport org.wpilib.command3.Command;\nimport org.wpilib.command3.Mechanism;\nimport org.wpilib.command3.Scheduler;\nimport org.wpilib.command3.TestSupport;\nimport static org.wpilib.units.Units.Seconds;\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 label = in.nextLine();\n        int loopsUntilTop = in.nextInt();\n\n        Elevator elevator = new Elevator();\n        Command raise = elevator.raiseCommand();\n        Command routine = Autos.raiseThenWait(elevator, label);\n        System.out.println(raise.name() + \" | requires elevator: \" + raise.requires(elevator));\n        System.out.println(routine.name() + \" | requires elevator: \" + routine.requires(elevator));\n\n        \u002F\u002F Run the raise command: the top switch trips after loopsUntilTop loops.\n        Scheduler scheduler = Scheduler.getDefault();\n        scheduler.schedule(raise);\n        for (int loop = 1; loop \u003C= 4; loop++)\n        {\n            elevator.setAtTop(loop > loopsUntilTop);\n            scheduler.run();\n            System.out.println(\"loop \" + loop + \": raise running = \" + scheduler.isRunning(raise));\n        }\n\n        \u002F\u002F Run the whole routine on a fake clock. The elevator is already at the top.\n        elevator.setAtTop(true);\n        scheduler.schedule(routine);\n        for (double step : new double[] { 0.0, 1.0, 1.0, 1.0 })\n        {\n            TestSupport.advance(step);\n            scheduler.run();\n            System.out.println(\"routine running = \" + scheduler.isRunning(routine));\n        }\n    }\n}\n\nclass Elevator implements Mechanism\n{\n    private boolean atTop = false;\n\n    public boolean atTop()\n    {\n        return atTop;\n    }\n\n    public void setAtTop(boolean atTop)\n    {\n        this.atTop = atTop;\n    }\n\n    \u002F\u002F TODO: raiseCommand()\n}\n\nclass Autos\n{\n    \u002F\u002F TODO: raiseThenWait(Elevator elevator, String label)\n}\n",[1094,2974,2975,2980,2985,2990,2995,3000,3004,3008,3013,3017,3022,3027,3031,3036,3042,3048,3054,3059,3065,3071,3077,3083,3089,3094,3100,3106,3112,3118,3123,3129,3135,3141,3146,3151,3157,3163,3169,3175,3180,3186,3191,3197,3202,3207,3212,3217,3223,3228,3234,3239,3245,3250,3256,3261,3266,3272,3277,3283,3288,3293,3299,3304,3309,3315,3320,3326],{"__ignoreMap":1104},[1108,2976,2977],{"class":1110,"line":1111},[1108,2978,2979],{},"import java.util.*;\n",[1108,2981,2982],{"class":1110,"line":1117},[1108,2983,2984],{},"import org.wpilib.command3.Command;\n",[1108,2986,2987],{"class":1110,"line":1123},[1108,2988,2989],{},"import org.wpilib.command3.Mechanism;\n",[1108,2991,2992],{"class":1110,"line":1129},[1108,2993,2994],{},"import org.wpilib.command3.Scheduler;\n",[1108,2996,2997],{"class":1110,"line":1135},[1108,2998,2999],{},"import org.wpilib.command3.TestSupport;\n",[1108,3001,3002],{"class":1110,"line":1141},[1108,3003,1596],{},[1108,3005,3006],{"class":1110,"line":1147},[1108,3007,1602],{"emptyLinePlaceholder":1601},[1108,3009,3010],{"class":1110,"line":1153},[1108,3011,3012],{},"public class Main\n",[1108,3014,3015],{"class":1110,"line":1159},[1108,3016,1120],{},[1108,3018,3019],{"class":1110,"line":1165},[1108,3020,3021],{},"    \u002F\u002F Don't change main\n",[1108,3023,3024],{"class":1110,"line":1171},[1108,3025,3026],{},"    public static void main(String[] args)\n",[1108,3028,3029],{"class":1110,"line":2772},[1108,3030,2734],{},[1108,3032,3033],{"class":1110,"line":2778},[1108,3034,3035],{},"        TestSupport.init(); \u002F\u002F a fake robot clock and opmode, so the scheduler can run without a robot\n",[1108,3037,3039],{"class":1110,"line":3038},14,[1108,3040,3041],{},"        Scanner in = new Scanner(System.in);\n",[1108,3043,3045],{"class":1110,"line":3044},15,[1108,3046,3047],{},"        String label = in.nextLine();\n",[1108,3049,3051],{"class":1110,"line":3050},16,[1108,3052,3053],{},"        int loopsUntilTop = in.nextInt();\n",[1108,3055,3057],{"class":1110,"line":3056},17,[1108,3058,1602],{"emptyLinePlaceholder":1601},[1108,3060,3062],{"class":1110,"line":3061},18,[1108,3063,3064],{},"        Elevator elevator = new Elevator();\n",[1108,3066,3068],{"class":1110,"line":3067},19,[1108,3069,3070],{},"        Command raise = elevator.raiseCommand();\n",[1108,3072,3074],{"class":1110,"line":3073},20,[1108,3075,3076],{},"        Command routine = Autos.raiseThenWait(elevator, label);\n",[1108,3078,3080],{"class":1110,"line":3079},21,[1108,3081,3082],{},"        System.out.println(raise.name() + \" | requires elevator: \" + raise.requires(elevator));\n",[1108,3084,3086],{"class":1110,"line":3085},22,[1108,3087,3088],{},"        System.out.println(routine.name() + \" | requires elevator: \" + routine.requires(elevator));\n",[1108,3090,3092],{"class":1110,"line":3091},23,[1108,3093,1602],{"emptyLinePlaceholder":1601},[1108,3095,3097],{"class":1110,"line":3096},24,[1108,3098,3099],{},"        \u002F\u002F Run the raise command: the top switch trips after loopsUntilTop loops.\n",[1108,3101,3103],{"class":1110,"line":3102},25,[1108,3104,3105],{},"        Scheduler scheduler = Scheduler.getDefault();\n",[1108,3107,3109],{"class":1110,"line":3108},26,[1108,3110,3111],{},"        scheduler.schedule(raise);\n",[1108,3113,3115],{"class":1110,"line":3114},27,[1108,3116,3117],{},"        for (int loop = 1; loop \u003C= 4; loop++)\n",[1108,3119,3121],{"class":1110,"line":3120},28,[1108,3122,1144],{},[1108,3124,3126],{"class":1110,"line":3125},29,[1108,3127,3128],{},"            elevator.setAtTop(loop > loopsUntilTop);\n",[1108,3130,3132],{"class":1110,"line":3131},30,[1108,3133,3134],{},"            scheduler.run();\n",[1108,3136,3138],{"class":1110,"line":3137},31,[1108,3139,3140],{},"            System.out.println(\"loop \" + loop + \": raise running = \" + scheduler.isRunning(raise));\n",[1108,3142,3144],{"class":1110,"line":3143},32,[1108,3145,1156],{},[1108,3147,3149],{"class":1110,"line":3148},33,[1108,3150,1602],{"emptyLinePlaceholder":1601},[1108,3152,3154],{"class":1110,"line":3153},34,[1108,3155,3156],{},"        \u002F\u002F Run the whole routine on a fake clock. The elevator is already at the top.\n",[1108,3158,3160],{"class":1110,"line":3159},35,[1108,3161,3162],{},"        elevator.setAtTop(true);\n",[1108,3164,3166],{"class":1110,"line":3165},36,[1108,3167,3168],{},"        scheduler.schedule(routine);\n",[1108,3170,3172],{"class":1110,"line":3171},37,[1108,3173,3174],{},"        for (double step : new double[] { 0.0, 1.0, 1.0, 1.0 })\n",[1108,3176,3178],{"class":1110,"line":3177},38,[1108,3179,1144],{},[1108,3181,3183],{"class":1110,"line":3182},39,[1108,3184,3185],{},"            TestSupport.advance(step);\n",[1108,3187,3189],{"class":1110,"line":3188},40,[1108,3190,3134],{},[1108,3192,3194],{"class":1110,"line":3193},41,[1108,3195,3196],{},"            System.out.println(\"routine running = \" + scheduler.isRunning(routine));\n",[1108,3198,3200],{"class":1110,"line":3199},42,[1108,3201,1156],{},[1108,3203,3205],{"class":1110,"line":3204},43,[1108,3206,2775],{},[1108,3208,3210],{"class":1110,"line":3209},44,[1108,3211,1174],{},[1108,3213,3215],{"class":1110,"line":3214},45,[1108,3216,1602],{"emptyLinePlaceholder":1601},[1108,3218,3220],{"class":1110,"line":3219},46,[1108,3221,3222],{},"class Elevator implements Mechanism\n",[1108,3224,3226],{"class":1110,"line":3225},47,[1108,3227,1120],{},[1108,3229,3231],{"class":1110,"line":3230},48,[1108,3232,3233],{},"    private boolean atTop = false;\n",[1108,3235,3237],{"class":1110,"line":3236},49,[1108,3238,1602],{"emptyLinePlaceholder":1601},[1108,3240,3242],{"class":1110,"line":3241},50,[1108,3243,3244],{},"    public boolean atTop()\n",[1108,3246,3248],{"class":1110,"line":3247},51,[1108,3249,2734],{},[1108,3251,3253],{"class":1110,"line":3252},52,[1108,3254,3255],{},"        return atTop;\n",[1108,3257,3259],{"class":1110,"line":3258},53,[1108,3260,2775],{},[1108,3262,3264],{"class":1110,"line":3263},54,[1108,3265,1602],{"emptyLinePlaceholder":1601},[1108,3267,3269],{"class":1110,"line":3268},55,[1108,3270,3271],{},"    public void setAtTop(boolean atTop)\n",[1108,3273,3275],{"class":1110,"line":3274},56,[1108,3276,2734],{},[1108,3278,3280],{"class":1110,"line":3279},57,[1108,3281,3282],{},"        this.atTop = atTop;\n",[1108,3284,3286],{"class":1110,"line":3285},58,[1108,3287,2775],{},[1108,3289,3291],{"class":1110,"line":3290},59,[1108,3292,1602],{"emptyLinePlaceholder":1601},[1108,3294,3296],{"class":1110,"line":3295},60,[1108,3297,3298],{},"    \u002F\u002F TODO: raiseCommand()\n",[1108,3300,3302],{"class":1110,"line":3301},61,[1108,3303,1174],{},[1108,3305,3307],{"class":1110,"line":3306},62,[1108,3308,1602],{"emptyLinePlaceholder":1601},[1108,3310,3312],{"class":1110,"line":3311},63,[1108,3313,3314],{},"class Autos\n",[1108,3316,3318],{"class":1110,"line":3317},64,[1108,3319,1120],{},[1108,3321,3323],{"class":1110,"line":3322},65,[1108,3324,3325],{},"    \u002F\u002F TODO: raiseThenWait(Elevator elevator, String label)\n",[1108,3327,3329],{"class":1110,"line":3328},66,[1108,3330,1174],{},[1085,3332,3333],{},[1089,3334,3335],{},"Scenario 1 (visible):",[1085,3337,3338],{},[1089,3339,3340],{},"Input:",[1099,3342,3344],{"className":3343,"code":2952,"language":2953,"meta":1104},[2951],[1094,3345,2952],{"__ignoreMap":1104},[1085,3347,3348],{},[1089,3349,3350],{},"Expected output:",[1099,3352,3354],{"className":3353,"code":2962,"language":2953,"meta":1104},[2951],[1094,3355,2962],{"__ignoreMap":1104},[1085,3357,3358],{},[1089,3359,3360],{},"Scenario 2 (visible):",[1085,3362,3363],{},[1089,3364,3340],{},[1099,3366,3369],{"className":3367,"code":3368,"language":2953,"meta":1104},[2951],"Auto Lift\n0\n",[1094,3370,3368],{"__ignoreMap":1104},[1085,3372,3373],{},[1089,3374,3350],{},[1099,3376,3379],{"className":3377,"code":3378,"language":2953,"meta":1104},[2951],"Raise Elevator | requires elevator: true\nRaise Elevator -> Auto Lift | requires elevator: true\nloop 1: raise running = false\nloop 2: raise running = false\nloop 3: raise running = false\nloop 4: raise running = false\nroutine running = true\nroutine running = true\nroutine running = false\nroutine running = false\n",[1094,3380,3378],{"__ignoreMap":1104},[1085,3382,3383],{},[1089,3384,3385],{},"Scenario 3 (hidden):",[1085,3387,3388],{},[1089,3389,3340],{},[1099,3391,3394],{"className":3392,"code":3393,"language":2953,"meta":1104},[2951],"Hold\n4\n",[1094,3395,3393],{"__ignoreMap":1104},[1085,3397,3398],{},[1089,3399,3350],{},[1099,3401,3404],{"className":3402,"code":3403,"language":2953,"meta":1104},[2951],"Raise Elevator | requires elevator: true\nRaise Elevator -> Hold | requires elevator: true\nloop 1: raise running = true\nloop 2: raise running = true\nloop 3: raise running = true\nloop 4: raise running = true\nroutine running = true\nroutine running = true\nroutine running = false\nroutine running = false\n",[1094,3405,3403],{"__ignoreMap":1104},[1085,3407,3408],{},[1089,3409,3410],{},"Scenario 4 (hidden):",[1085,3412,3413],{},[1089,3414,3340],{},[1099,3416,3419],{"className":3417,"code":3418,"language":2953,"meta":1104},[2951],"A B C\n1\n",[1094,3420,3418],{"__ignoreMap":1104},[1085,3422,3423],{},[1089,3424,3350],{},[1099,3426,3429],{"className":3427,"code":3428,"language":2953,"meta":1104},[2951],"Raise Elevator | requires elevator: true\nRaise Elevator -> A B C | requires elevator: true\nloop 1: raise running = true\nloop 2: raise running = false\nloop 3: raise running = false\nloop 4: raise running = false\nroutine running = true\nroutine running = true\nroutine running = false\nroutine running = false\n",[1094,3430,3428],{"__ignoreMap":1104},[1085,3432,3433],{},[1089,3434,3435],{},"Scenario 5 (hidden):",[1085,3437,3438],{},[1089,3439,3340],{},[1099,3441,3444],{"className":3442,"code":3443,"language":2953,"meta":1104},[2951],"Score Prep Lift\n3\n",[1094,3445,3443],{"__ignoreMap":1104},[1085,3447,3448],{},[1089,3449,3350],{},[1099,3451,3454],{"className":3452,"code":3453,"language":2953,"meta":1104},[2951],"Raise Elevator | requires elevator: true\nRaise Elevator -> Score Prep Lift | requires elevator: true\nloop 1: raise running = true\nloop 2: raise running = true\nloop 3: raise running = true\nloop 4: raise running = false\nroutine running = true\nroutine running = true\nroutine running = false\nroutine running = false\n",[1094,3455,3453],{"__ignoreMap":1104},[1085,3457,3458],{},[1089,3459,3460],{},"Solution:",[1099,3462,3464],{"className":1101,"code":3463,"language":1103,"meta":1104,"style":1104},"import java.util.*;\nimport org.wpilib.command3.Command;\nimport org.wpilib.command3.Mechanism;\nimport org.wpilib.command3.Scheduler;\nimport org.wpilib.command3.TestSupport;\nimport static org.wpilib.units.Units.Seconds;\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 label = in.nextLine();\n        int loopsUntilTop = in.nextInt();\n\n        Elevator elevator = new Elevator();\n        Command raise = elevator.raiseCommand();\n        Command routine = Autos.raiseThenWait(elevator, label);\n        System.out.println(raise.name() + \" | requires elevator: \" + raise.requires(elevator));\n        System.out.println(routine.name() + \" | requires elevator: \" + routine.requires(elevator));\n\n        \u002F\u002F Run the raise command: the top switch trips after loopsUntilTop loops.\n        Scheduler scheduler = Scheduler.getDefault();\n        scheduler.schedule(raise);\n        for (int loop = 1; loop \u003C= 4; loop++)\n        {\n            elevator.setAtTop(loop > loopsUntilTop);\n            scheduler.run();\n            System.out.println(\"loop \" + loop + \": raise running = \" + scheduler.isRunning(raise));\n        }\n\n        \u002F\u002F Run the whole routine on a fake clock. The elevator is already at the top.\n        elevator.setAtTop(true);\n        scheduler.schedule(routine);\n        for (double step : new double[] { 0.0, 1.0, 1.0, 1.0 })\n        {\n            TestSupport.advance(step);\n            scheduler.run();\n            System.out.println(\"routine running = \" + scheduler.isRunning(routine));\n        }\n    }\n}\n\nclass Elevator implements Mechanism\n{\n    private boolean atTop = false;\n\n    public boolean atTop()\n    {\n        return atTop;\n    }\n\n    public void setAtTop(boolean atTop)\n    {\n        this.atTop = atTop;\n    }\n\n    public Command raiseCommand()\n    {\n        return run(coroutine -> {\n            while (!atTop())\n            {\n                coroutine.yield();\n            }\n        }).named(\"Raise Elevator\");\n    }\n}\n\nclass Autos\n{\n    public static Command raiseThenWait(Elevator elevator, String label)\n    {\n        return Command.sequence(\n            elevator.raiseCommand(),\n            Command.waitFor(Seconds.of(2)).named(label)\n        ).withAutomaticName();\n    }\n}\n",[1094,3465,3466,3470,3474,3478,3482,3486,3490,3494,3498,3502,3506,3510,3514,3518,3522,3526,3530,3534,3538,3542,3546,3550,3554,3558,3562,3566,3570,3574,3578,3582,3586,3590,3594,3598,3602,3606,3610,3614,3618,3622,3626,3630,3634,3638,3642,3646,3650,3654,3658,3662,3666,3670,3674,3678,3682,3686,3690,3694,3698,3702,3707,3711,3715,3720,3724,3728,3732,3738,3743,3748,3753,3758,3763,3769,3774,3780,3786,3792,3798,3803],{"__ignoreMap":1104},[1108,3467,3468],{"class":1110,"line":1111},[1108,3469,2979],{},[1108,3471,3472],{"class":1110,"line":1117},[1108,3473,2984],{},[1108,3475,3476],{"class":1110,"line":1123},[1108,3477,2989],{},[1108,3479,3480],{"class":1110,"line":1129},[1108,3481,2994],{},[1108,3483,3484],{"class":1110,"line":1135},[1108,3485,2999],{},[1108,3487,3488],{"class":1110,"line":1141},[1108,3489,1596],{},[1108,3491,3492],{"class":1110,"line":1147},[1108,3493,1602],{"emptyLinePlaceholder":1601},[1108,3495,3496],{"class":1110,"line":1153},[1108,3497,3012],{},[1108,3499,3500],{"class":1110,"line":1159},[1108,3501,1120],{},[1108,3503,3504],{"class":1110,"line":1165},[1108,3505,3021],{},[1108,3507,3508],{"class":1110,"line":1171},[1108,3509,3026],{},[1108,3511,3512],{"class":1110,"line":2772},[1108,3513,2734],{},[1108,3515,3516],{"class":1110,"line":2778},[1108,3517,3035],{},[1108,3519,3520],{"class":1110,"line":3038},[1108,3521,3041],{},[1108,3523,3524],{"class":1110,"line":3044},[1108,3525,3047],{},[1108,3527,3528],{"class":1110,"line":3050},[1108,3529,3053],{},[1108,3531,3532],{"class":1110,"line":3056},[1108,3533,1602],{"emptyLinePlaceholder":1601},[1108,3535,3536],{"class":1110,"line":3061},[1108,3537,3064],{},[1108,3539,3540],{"class":1110,"line":3067},[1108,3541,3070],{},[1108,3543,3544],{"class":1110,"line":3073},[1108,3545,3076],{},[1108,3547,3548],{"class":1110,"line":3079},[1108,3549,3082],{},[1108,3551,3552],{"class":1110,"line":3085},[1108,3553,3088],{},[1108,3555,3556],{"class":1110,"line":3091},[1108,3557,1602],{"emptyLinePlaceholder":1601},[1108,3559,3560],{"class":1110,"line":3096},[1108,3561,3099],{},[1108,3563,3564],{"class":1110,"line":3102},[1108,3565,3105],{},[1108,3567,3568],{"class":1110,"line":3108},[1108,3569,3111],{},[1108,3571,3572],{"class":1110,"line":3114},[1108,3573,3117],{},[1108,3575,3576],{"class":1110,"line":3120},[1108,3577,1144],{},[1108,3579,3580],{"class":1110,"line":3125},[1108,3581,3128],{},[1108,3583,3584],{"class":1110,"line":3131},[1108,3585,3134],{},[1108,3587,3588],{"class":1110,"line":3137},[1108,3589,3140],{},[1108,3591,3592],{"class":1110,"line":3143},[1108,3593,1156],{},[1108,3595,3596],{"class":1110,"line":3148},[1108,3597,1602],{"emptyLinePlaceholder":1601},[1108,3599,3600],{"class":1110,"line":3153},[1108,3601,3156],{},[1108,3603,3604],{"class":1110,"line":3159},[1108,3605,3162],{},[1108,3607,3608],{"class":1110,"line":3165},[1108,3609,3168],{},[1108,3611,3612],{"class":1110,"line":3171},[1108,3613,3174],{},[1108,3615,3616],{"class":1110,"line":3177},[1108,3617,1144],{},[1108,3619,3620],{"class":1110,"line":3182},[1108,3621,3185],{},[1108,3623,3624],{"class":1110,"line":3188},[1108,3625,3134],{},[1108,3627,3628],{"class":1110,"line":3193},[1108,3629,3196],{},[1108,3631,3632],{"class":1110,"line":3199},[1108,3633,1156],{},[1108,3635,3636],{"class":1110,"line":3204},[1108,3637,2775],{},[1108,3639,3640],{"class":1110,"line":3209},[1108,3641,1174],{},[1108,3643,3644],{"class":1110,"line":3214},[1108,3645,1602],{"emptyLinePlaceholder":1601},[1108,3647,3648],{"class":1110,"line":3219},[1108,3649,3222],{},[1108,3651,3652],{"class":1110,"line":3225},[1108,3653,1120],{},[1108,3655,3656],{"class":1110,"line":3230},[1108,3657,3233],{},[1108,3659,3660],{"class":1110,"line":3236},[1108,3661,1602],{"emptyLinePlaceholder":1601},[1108,3663,3664],{"class":1110,"line":3241},[1108,3665,3244],{},[1108,3667,3668],{"class":1110,"line":3247},[1108,3669,2734],{},[1108,3671,3672],{"class":1110,"line":3252},[1108,3673,3255],{},[1108,3675,3676],{"class":1110,"line":3258},[1108,3677,2775],{},[1108,3679,3680],{"class":1110,"line":3263},[1108,3681,1602],{"emptyLinePlaceholder":1601},[1108,3683,3684],{"class":1110,"line":3268},[1108,3685,3271],{},[1108,3687,3688],{"class":1110,"line":3274},[1108,3689,2734],{},[1108,3691,3692],{"class":1110,"line":3279},[1108,3693,3282],{},[1108,3695,3696],{"class":1110,"line":3285},[1108,3697,2775],{},[1108,3699,3700],{"class":1110,"line":3290},[1108,3701,1602],{"emptyLinePlaceholder":1601},[1108,3703,3704],{"class":1110,"line":3295},[1108,3705,3706],{},"    public Command raiseCommand()\n",[1108,3708,3709],{"class":1110,"line":3301},[1108,3710,2734],{},[1108,3712,3713],{"class":1110,"line":3306},[1108,3714,2739],{},[1108,3716,3717],{"class":1110,"line":3311},[1108,3718,3719],{},"            while (!atTop())\n",[1108,3721,3722],{"class":1110,"line":3317},[1108,3723,2754],{},[1108,3725,3726],{"class":1110,"line":3322},[1108,3727,2759],{},[1108,3729,3730],{"class":1110,"line":3328},[1108,3731,2764],{},[1108,3733,3735],{"class":1110,"line":3734},67,[1108,3736,3737],{},"        }).named(\"Raise Elevator\");\n",[1108,3739,3741],{"class":1110,"line":3740},68,[1108,3742,2775],{},[1108,3744,3746],{"class":1110,"line":3745},69,[1108,3747,1174],{},[1108,3749,3751],{"class":1110,"line":3750},70,[1108,3752,1602],{"emptyLinePlaceholder":1601},[1108,3754,3756],{"class":1110,"line":3755},71,[1108,3757,3314],{},[1108,3759,3761],{"class":1110,"line":3760},72,[1108,3762,1120],{},[1108,3764,3766],{"class":1110,"line":3765},73,[1108,3767,3768],{},"    public static Command raiseThenWait(Elevator elevator, String label)\n",[1108,3770,3772],{"class":1110,"line":3771},74,[1108,3773,2734],{},[1108,3775,3777],{"class":1110,"line":3776},75,[1108,3778,3779],{},"        return Command.sequence(\n",[1108,3781,3783],{"class":1110,"line":3782},76,[1108,3784,3785],{},"            elevator.raiseCommand(),\n",[1108,3787,3789],{"class":1110,"line":3788},77,[1108,3790,3791],{},"            Command.waitFor(Seconds.of(2)).named(label)\n",[1108,3793,3795],{"class":1110,"line":3794},78,[1108,3796,3797],{},"        ).withAutomaticName();\n",[1108,3799,3801],{"class":1110,"line":3800},79,[1108,3802,2775],{},[1108,3804,3806],{"class":1110,"line":3805},80,[1108,3807,1174],{},[1085,3809,3810,1836,3812,3814,3815,3817,3818,3820,3821,3823,3824,3826,3827,3830,3831,3834,3835,3837,3838,3840,3841,3844,3845,3847,3848,3851],{},[1089,3811,2545],{},[1094,3813,1365],{}," starts a command that requires ",[1094,3816,1373],{}," automatically, and ",[1094,3819,1740],{}," is\nwhat finishes it. The ",[1094,3822,1818],{}," loop calls ",[1094,3825,1207],{}," each pass, so the command ",[1089,3828,3829],{},"stays\nrunning"," until the switch trips, which is exactly when the loop condition becomes false: with\n",[1094,3832,3833],{},"loopsUntilTop = 2",", loops 1 and 2 are still running, and it finishes on loop 3. Without the\n",[1094,3836,1830],{},", the loop would never give control back to the scheduler. A built-in composition requires\nevery mechanism any member requires, so the sequence requires the elevator too.\n",[1094,3839,2388],{}," builds the sequence's name from its members, joined by ",[1094,3842,3843],{},"->",", so the printed\nname shows that it is a ",[1327,3846,2921],{}," (a parallel group would print ",[1094,3849,3850],{},"&",") and the order of the steps.\nThe routine's running line also shows the 2-second pause: it stays running through the first two\nsimulated seconds of waiting and is done once the 2 seconds are up.",[1985,3853,1987],{},{"title":1104,"searchDepth":1117,"depth":1117,"links":3855},[3856,3857,3858],{"id":2478,"depth":1117,"text":2479},{"id":2577,"depth":1117,"text":2578},{"id":2863,"depth":1117,"text":2864},{"outlineRef":2004,"pairsWith":2465,"status":3860},"new — authored exercises (Multiple Choice + Micro-Parsons + Coding); rewritten for Commands v3",{"title":1020,"description":1104},"pNMukQ8QpPU-knLlWUBXPrHaGa8zp-FO-o7Pu8w0BZM",1792718166788]