module Text.Madlibs.Cata.Run ( run
, runCata ) where
import Control.Monad.Random.Class
import Data.Functor.Foldable.Exotic (cataM)
import qualified Data.Text as T
import Text.Madlibs.Internal.Types
import Text.Madlibs.Internal.Utils
run :: (MonadRandom m) => RandTok -> m T.Text
run tok@List{} = do
value <- getRandomR (0,1)
let ret = ((snd . head) . filter ((>=value) . fst)) $ mkCdf tok
case ret of
(Value txt) -> pure txt
tokNest@List{} -> run tokNest
run (Value txt) = pure txt
runCata :: (MonadRandom m) => RandTok -> m T.Text
runCata = cataM alg where
alg (ListF tok) = do
value <- getRandomR (0,1)
pure $ ((snd . head) . filter ((>= value) . fst)) $ mkCdfCata tok
alg (ValueF txt) = pure txt
mkCdf :: RandTok -> [(Prob, RandTok)]
mkCdf (List rs) = zip (cdf . fmap fst $ rs) (fmap snd rs)
mkCdf v@Value{} = [(1, v)]
mkCdfCata :: [(Prob, T.Text)] -> [(Prob, T.Text)]
mkCdfCata rs = zip (cdf . fmap fst $ rs) (fmap snd rs)