/**
  The HATETRIS rotation system
*/ 'use strict' ; const unmodified = { I : [ [ '....' , '####' , '....' , '....' ] , [ '..#.' , '..#.' , '..#.' , '..#.' ] , [ '....' , '....' , '####' , '....' ] , [ '.#..' , '.#..' , '.#..' , '.#..' ] ] , J : [ [ '....' , '.##.' , '.#..' , '.#..' ] , [ '....' , '###.' , '..#.' , '....' ] , [ '..#.' , '..#.' , '.##.' , '....' ] , [ '....' , '.#..' , '.###' , '....' ] ] , L : [ [ '....' , '.###' , '.#..' , '....' ] , [ '....' , '.##.' , '..#.' , '..#.' ] , [ '....' , '..#.' , '###.' , '....' ] , [ '.#..' , '.#..' , '.##.' , '....' ] ] , O : [ [ '....' , '.##.' , '.##.' , '....' ] , [ '....' , '.##.' , '.##.' , '....' ] , [ '....' , '.##.' , '.##.' , '....' ] , [ '....' , '.##.' , '.##.' , '....' ] ] , S : [ [ '....' , '..##' , '.##.' , '....' ] , [ '....' , '.#..' , '.##.' , '..#.' ] , [ '....' , '.##.' , '##..' , '....' ] , [ '.#..' , '.##.' , '..#.' , '....' ] ] , T : [ [ '....' , '.###' , '..#.' , '....' ] , [ '....' , '..#.' , '.##.' , '..#.' ] , [ '....' , '.#..' , '###.' , '....' ] , [ '.#..' , '.##.' , '.#..' , '....' ] ] , Z : [ [ '....' , '.##.' , '..##' , '....' ] , [ '....' , '..#.' , '.##.' , '.#..' ] , [ '....' , '##..' , '.##.' , '....' ] , [ '..#.' , '.##.' , '.#..' , '....' ] ] } ; const rotations = Object . fromEntries ( Object . entries ( unmodified ) . map ( ( [ pieceId , visuals ] ) => [ pieceId , visuals . map ( visual => { let xMin = Infinity ; let xMax = - Infinity ; let yMin = Infinity ; let yMax = - Infinity ; const allRows = visual . map ( ( visualRow , y ) => { let row = 0 ; visualRow . split ( '' ) . forEach ( ( chr , x ) => { if ( chr === '#' ) { row += 1 << x ; xMin = Math . min ( xMin , x ) ; xMax = Math . max ( xMax , x + 1 ) ; yMin = Math . min ( yMin , y ) ; yMax = Math . max ( yMax , y + 1 ) ; } } ) ; return row ; } ) ; const rows = allRows . slice ( yMin , yMax ) . map ( row => row >> xMin ) ; return { xMin , yMin , xDim : xMax - xMin , yDim : yMax - yMin , rows } ; } ) ] ) ) ; const placeNewPiece = ( wellWidth , pieceId ) => ( { id : pieceId , x : Math . floor ( ( wellWidth - 4 ) / 2 ) , y : 0 , o : 0 } ) ; export default { placeNewPiece , rotations } ;