{-# LANGUAGE BangPatterns #-}
module Data.RangeMin.Int.Catalan.Table where

import Data.RangeMin.Common.Vector
import qualified Data.RangeMin.Fusion as F
import Data.RangeMin.Int.Linearithmic.Combinators
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