pushBlock :: Level -> Coord -> Direction -> Level
pushBlock lvl pos dir
  | S.member pos blocks = moveBlock lvl' pos newPos
  | otherwise           = lvl
  where
    blocks = lBlocks lvl
    newPos = pos + dirToCoord dir
    lvl'   = pushBlock lvl newPos dir
pushBlock :: Level -> Coord -> Direction -> Level
pushBlock lvl pos dir
  | S.member pos blocks = moveBlock lvl' pos newPos
  | otherwise           = lvl
  where
    blocks = lBlocks lvl
    newPos = pos + dirToCoord dir
    lvl'   = pushBlock lvl newPos dir
pushBlock lvl pos dir
  | S.member pos blocks = moveBlock lvl' pos newPos
  | otherwise           = lvl
  where
    blocks = lBlocks lvl
    newPos = pos + dirToCoord dir
    lvl'   = pushBlock lvl newPos dir