-- like moveUp
moveDown :: State -> ItemSet -> State
moveDown (State f v) is = let
        shift1 = f * stateFloorSize
        shift2 = shift1 - stateFloorSize
    in
        State (f - 1) (v `xor` (is `unsafeShiftL` shift1) `xor` (is `unsafeShiftL` shift2))
moveDown :: State -> ItemSet -> State
moveDown (State f v) is = let
        shift1 = f * stateFloorSize
        shift2 = shift1 - stateFloorSize
    in
        State (f - 1) (v `xor` (is `unsafeShiftL` shift1) `xor` (is `unsafeShiftL` shift2))
moveDown (State f v) is = let
        shift1 = f * stateFloorSize
        shift2 = shift1 - stateFloorSize
    in
        State (f - 1) (v `xor` (is `unsafeShiftL` shift1) `xor` (is `unsafeShiftL` shift2))