module Hydrogen.Util where
import Hydrogen.Prelude
-- | Infix to postfix notation (an implementation of the Shunting-Yard-Algorithm)
sya :: (Ord p, Eq o)
=> (a -> Maybe o) -- ^ Determine operator
-> (o -> Bool) -- ^ Is left precedence?
-> (o -> p) -- ^ Precedence of given operator
-> [a] -- ^ The input stream (infix notation)
-> [a] -- ^ The output stream (postfix notation)
sya mkOp isL p = sy []
where
sy (t : ts) (x : xs)
| isOp x && isOp t && cmp t x = t : sy ts (x : xs)
sy ts (x : xs)
| isOp x = sy (x : ts) xs
| otherwise = x : sy ts xs
sy ts [] = ts
isOp = isJust . mkOp
cmp o1 o2 = isL o1' && p o1' == p o2' || p o1' > p o2'
where
Just o1' = mkOp o1
Just o2' = mkOp o2