40 lines
1.1 KiB
Haskell
40 lines
1.1 KiB
Haskell
module Data.Config.Suckless.Parse.Fuzzy
|
|
( parseTop
|
|
, parseSyntax
|
|
-- , C
|
|
) where
|
|
|
|
import Data.Config.Suckless.Syntax
|
|
import Data.Text.Fuzzy.SExp qualified as P
|
|
import Data.Text.Fuzzy.SExp (C0(..),SExpParseError,ForMicroSexp(..))
|
|
|
|
import Data.Functor
|
|
import Data.Text
|
|
import Control.Monad.Except
|
|
import Control.Monad.Identity
|
|
import Data.Coerce
|
|
|
|
|
|
parseTop :: Text -> Either SExpParseError [Syntax C]
|
|
parseTop what = runIdentity (runExceptT (P.parseTop what)) <&> fmap toSyntax
|
|
|
|
parseSyntax :: Text -> Either SExpParseError (Syntax C)
|
|
parseSyntax txt = runIdentity (runExceptT (P.parseSexp txt)) <&> toSyntax
|
|
|
|
|
|
toSyntax :: P.MicroSexp C0 -> Syntax C
|
|
toSyntax = \case
|
|
P.List_ co a -> List (toContext co) (fmap toSyntax a)
|
|
P.Symbol_ co a -> Symbol (toContext co) (Id a)
|
|
P.String_ co a -> Literal (toContext co) (LitStr a)
|
|
P.Boolean_ co a -> Literal (toContext co) (LitBool a)
|
|
P.Number_ co v -> case v of
|
|
P.NumInteger n -> Literal (toContext co) (LitInt n)
|
|
P.NumDouble n -> Literal (toContext co) (LitScientific (realToFrac n))
|
|
|
|
toContext :: C0 -> Context C
|
|
toContext (C0 what) = SimpleContext (fromIntegral <$> what)
|
|
|
|
|
|
|