Skip to content

Instantly share code, notes, and snippets.

@alexandercerutti
Created December 29, 2021 00:08
Show Gist options
  • Save alexandercerutti/e1af968f90f6dce2bfb51b83f1f009fd to your computer and use it in GitHub Desktop.
Save alexandercerutti/e1af968f90f6dce2bfb51b83f1f009fd to your computer and use it in GitHub Desktop.

Revisions

  1. alexandercerutti created this gist Dec 29, 2021.
    55 changes: 55 additions & 0 deletions right-identifiers-usage-example.ts
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,55 @@
    enum States {
    LOADING /***/ = 0b0000,
    FAILED /****/ = 0b0001,
    LOADED /****/ = 0b1110,
    PLAYING /***/ = 0b0100,
    STOPPED /***/ = 0b1000
    }

    const currentState: number = getStateSomehow();

    /** We can use AND operation to compare the states **/

    currentState & States.FAILED

    // ================ //

    /** We can use OR operation to check multiple states together - explanation right below **/

    currentState & (States.STOPPED | States.FAILED)

    /**
    * =======================
    * STOPPED : 0b 1 0 0 0
    * FAILED : 0b 0 0 0 1
    * ============ OR =======
    * O1 : 0b 1 0 0 1 ( Stopped | Failed )
    * CURRENT : 0b 0 1 0 0 ( Playing )
    * ============ AND ======
    * O2 : 0b 0 0 0 0 ( Same identifier as loading, but it doesn't mean it )
    */

    // ================ //

    /**
    * We can use XOR to assign a new state. This is actually a bit (pun intended) out of scope,
    * since our example does not allow having a "currentState" that is the combination of multiple
    * statuses at the same time. The scope of the article was to show how can be related states be
    * combined, but states can also be unrelated (so each can have its own unique identifer) and we
    * would still be able to benefit of these feature.
    *
    * But let's fake it and let's say that PLAYING, FAILED and STOPPED can be mixed up together.
    */

    currentState = currentState ^ (States.STOPPED | STATES.FAILED)

    /**
    * =======================
    * STOPPED : 0b 1 0 0 0
    * FAILED : 0b 0 0 0 1
    * ============ OR =======
    * O1 : 0b 1 0 0 1 ( Stopped | Failed )
    * CURRENT : 0b 0 1 0 0 ( Playing )
    * ============ XOR ======
    * O2 : 0b 1 1 0 1 ( Da faq is this?!)
    */