never executed always true always false
    1 module Reanimate.Math.Triangulate
    2   ( Triangulation
    3   , edgesToTriangulation
    4   , edgesToTriangulationM
    5   , trianglesToTriangulation
    6   , trianglesToTriangulationM
    7   )
    8 where
    9 
   10 import           Control.Monad
   11 import qualified Data.IntSet                   as ISet
   12 import qualified Data.Vector                   as V
   13 import qualified Data.Vector.Mutable           as MV
   14 import           Control.Monad.ST
   15 
   16 -- Max edges: n-2
   17 -- Each edge is represented twice: 2n-4
   18 -- Flat structure:
   19 --   edges   :: V.Vector Int -- max length (2n-4)
   20 --   offsets :: V.Vector Int -- length n
   21 -- Combine the two vectors? < n => offsets, >= n => edges?
   22 type Triangulation = V.Vector [Int]
   23 
   24 -- FIXME: Move to Common or a Triangulation module
   25 -- O(n)
   26 edgesToTriangulation :: Int -> [(Int, Int)] -> Triangulation
   27 edgesToTriangulation size edges = runST $ do
   28   v <- edgesToTriangulationM size edges
   29   V.unsafeFreeze v
   30 
   31 edgesToTriangulationM :: Int -> [(Int, Int)] -> ST s (V.MVector s [Int])
   32 edgesToTriangulationM size edges = do
   33   v <- MV.replicate size []
   34   forM_ edges $ \(e1, e2) -> do
   35     MV.modify v (e1 :) e2
   36     MV.modify v (e2 :) e1
   37   forM_ [0 .. size - 1] $ \i -> MV.modify v (ISet.toList . ISet.fromList) i
   38   return v
   39 
   40 trianglesToTriangulation :: Int -> V.Vector (Int, Int, Int) -> Triangulation
   41 trianglesToTriangulation size edges = runST $ do
   42   v <- trianglesToTriangulationM size edges
   43   V.unsafeFreeze v
   44 
   45 trianglesToTriangulationM
   46   :: Int -> V.Vector (Int, Int, Int) -> ST s (V.MVector s [Int])
   47 trianglesToTriangulationM size trigs = do
   48   v <- MV.replicate size []
   49   forM_ (V.toList trigs) $ \(a, b, c) -> do
   50     MV.modify v (\x -> b : c : x) a
   51     MV.modify v (\x -> a : c : x) b
   52     MV.modify v (\x -> a : b : x) c
   53   forM_ [0 .. size - 1] $ \i -> MV.modify v (ISet.toList . ISet.fromList) i
   54   return v