NLinker icon

Pattern matching for directions

NLinker | PRO | 07/04/17 09:22:45 PM UTC | 0 ⭐ | 972 👁️ | Never ⏰ | []
Haskell |

1.92 KB

|

None

|

0 👍

/

0 👎

data Diff = Diff { x :: Float, y :: Float, z :: Float }
 
data Direction =
    DIR_UP_NORTH_WEST
  | DIR_UP_SOUTH_WEST
  | DIR_UP_WEST
  | DIR_UP_NORTH_EAST
  | DIR_UP_SOUTH_EAST
  | DIR_UP_EAST
  | DIR_UP_NORTH
  | DIR_UP_SOUTH
  | DIR_UP
  | DIR_DOWN_NORTH_WEST
  | DIR_DOWN_SOUTH_WEST
  | DIR_DOWN_WEST
  | DIR_DOWN_NORTH_EAST
  | DIR_DOWN_SOUTH_EAST
  | DIR_DOWN_EAST
  | DIR_DOWN_NORTH
  | DIR_DOWN_SOUTH
  | DIR_DOWN
  | DIR_NORTH_WEST
  | DIR_SOUTH_WEST
  | DIR_WEST
  | DIR_NORTH_EAST
  | DIR_SOUTH_EAST
  | DIR_EAST
  | DIR_NORTH
  | DIR_SOUTH
  | DIR_NONE
 
test :: Diff -> Direction
test diff =
  let zero = 0.0 in
  let c1 = compare zero (x diff) in
  let c2 = compare zero (y diff) in
  let c3 = compare zero (z diff) in
  decide (c1, c2, c3)
  where
    decide :: (Ordering, Ordering, Ordering) -> Direction
    decide (LT, LT, LT) = DIR_UP_NORTH_WEST
    decide (LT, LT, EQ) = DIR_UP_SOUTH_WEST
    decide (LT, LT, GT) = DIR_UP_WEST
    decide (LT, EQ, LT) = DIR_UP_NORTH_EAST
    decide (LT, EQ, EQ) = DIR_UP_SOUTH_EAST
    decide (LT, EQ, GT) = DIR_UP_EAST
    decide (LT, GT, LT) = DIR_UP_NORTH
    decide (LT, GT, EQ) = DIR_UP_SOUTH
    decide (LT, GT, GT) = DIR_UP
    decide (EQ, LT, LT) = DIR_DOWN_NORTH_WEST
    decide (EQ, LT, EQ) = DIR_DOWN_SOUTH_WEST
    decide (EQ, LT, GT) = DIR_DOWN_WEST
    decide (EQ, EQ, LT) = DIR_DOWN_NORTH_EAST
    decide (EQ, EQ, EQ) = DIR_DOWN_SOUTH_EAST
    decide (EQ, EQ, GT) = DIR_DOWN_EAST
    decide (EQ, GT, LT) = DIR_DOWN_NORTH
    decide (EQ, GT, EQ) = DIR_DOWN_SOUTH
    decide (EQ, GT, GT) = DIR_DOWN
    decide (GT, LT, LT) = DIR_NORTH_WEST
    decide (GT, LT, EQ) = DIR_SOUTH_WEST
    decide (GT, LT, GT) = DIR_WEST
    decide (GT, EQ, LT) = DIR_NORTH_EAST
    decide (GT, EQ, EQ) = DIR_SOUTH_EAST
    decide (GT, EQ, GT) = DIR_EAST
    decide (GT, GT, LT) = DIR_NORTH
    decide (GT, GT, EQ) = DIR_SOUTH
    decide (GT, GT, GT) = DIR_NONE

Comments