module XMonad.Wallpaper.Expand where

import Control.Monad.State
import Data.List
import Data.Char

import System.Posix.Env
import Data.Maybe
import Control.Applicative

data AST = Variable String | Literal String
    deriving (Show)

isExpr a = isAlphaNum a || a == '_'

literal str =
    let (a, b) = break (== '$') str in (Literal a, b)

variable ('{':as) =
    let (a, b) = break (== '}') as in (Variable a, tail b)
variable as = 
    let (a, b) = break (not . isExpr) as in (Variable a, b)

parse []       = []
parse ('$':as) =
    let (a, b) = variable as in a : parse b
parse as = 
    let (a, b) = literal as in a : parse b
    
t0 = do
    let ast = parse "$HOME/Pictures/Wallpapers"
    values <- mapM interpolate ast
    putStrLn $ show values

interpolate (Variable var) = maybe "" id <$> getEnv var
interpolate (Literal str) = return str

expand str = do
    let ast = parse str
    concat <$> mapM interpolate ast