module Text.Numeral.Render.Utils
    ( addCtx
    , mulCtx
    , outsideCtx
    ) where

--------------------------------------------------------------------------------
-- Imports
--------------------------------------------------------------------------------

import "this" Text.Numeral


--------------------------------------------------------------------------------
-- Utility functions for rendering numerals
--------------------------------------------------------------------------------

addCtx :: Integer -> s -> (Ctx Exp -> s) -> Ctx Exp -> s
addCtx val match other ctx =
    case ctx of
      CtxAdd _ (Lit n) _ | val == n -> match
      _ -> other ctx

mulCtx :: Integer -> s -> (Ctx Exp -> s) -> Ctx Exp -> s
mulCtx val match other ctx =
    case ctx of
      CtxMul _ (Lit n) _ | val == n -> match
      _ -> other ctx

outsideCtx :: Side -> s -> (Ctx Exp -> s) -> Ctx Exp -> s
outsideCtx side match other ctx =
    if isOutside side ctx
    then match
    else other ctx