{-# LANGUAGE BangPatterns #-} module Data.RangeMin.Int.Catalan.Table where import Data.RangeMin.Int.Linearithmic.Combinators import qualified Data.RangeMin.Fusion as F import Data.RangeMin.Common.Vector import qualified Data.Vector.Primitive as UV maxLog :: Int maxLog = 17 {-# NOINLINE catalans #-} catalans :: UV.Vector Int catalans = buildRowsUnf maxLog maxLog (Just 0) (F.convert $ F.replicate maxLog 1) $ const (F.convert . F.postscanl (\ !i !j -> i + j) 0 . UV.unsafeTail) catalan :: Int -> Int -> Int catalan = getRow (maxLog - 1) catalans