stringTokens   :: String -> [Token]
stringTokens s = go [] s
  where
    go acc ""  = reverse acc
    go acc s   = let (w, s')   = span (not . isSpace) s
                     (sp, s'') = span (isSpace) s'
                 in
                     go ((WhiteSpace sp) : (Word w) : acc) s''
stringTokens   :: String -> [Token]
stringTokens s = go [] s
  where
    go acc ""  = reverse acc
    go acc s   = let (w, s')   = span (not . isSpace) s
                     (sp, s'') = span (isSpace) s'
                 in
                     go ((WhiteSpace sp) : (Word w) : acc) s''
stringTokens s = go [] s
  where
    go acc ""  = reverse acc
    go acc s   = let (w, s')   = span (not . isSpace) s
                     (sp, s'') = span (isSpace) s'
                 in
                     go ((WhiteSpace sp) : (Word w) : acc) s''