This commit is contained in:
2026-05-10 17:06:59 -06:00
parent c32e4b1a36
commit 3ce87bbb3d
2 changed files with 46 additions and 54 deletions

View File

@@ -4,23 +4,41 @@
module Gyehoek.Sexp
( let_
, nonempty
, nonEmptyGrammar
, encode
, decode
)
where
import Data.Text (Text)
import Language.SexpGrammar as Sexp hiding (List)
import Language.SexpGrammar as Sexp hiding (List, encode, decode)
import Language.SexpGrammar qualified as Sexp
import Language.SexpGrammar.Generic
import Data.InvertibleGrammar.Base qualified as IG
import Data.InvertibleGrammar.Base qualified as IGB
import Data.InvertibleGrammar qualified as IG
import Data.InvertibleGrammar.Base ((:-)((:-)))
import Data.List.NonEmpty (NonEmpty ((:|)))
import Data.List (List)
import GHC.Generics
import Data.Text.Encoding
import GHC.Generics (Generic)
import Control.Lens
encode :: SexpIso a => a -> Either _ Text
encode = (_Right %~ decodeUtf8 . view strict) . Sexp.encode
decode :: SexpIso a => Text -> Either String a
decode = Sexp.decode . view lazy . encodeUtf8
nonEmptyGrammar :: Grammar p (NonEmpty x :- t) (List x :- x :- t)
nonEmptyGrammar = IGB.Iso
(\((x:|xs) :- t) -> xs :- x :- t)
(\(xs :- x :- t) -> (x:|xs) :- t)
nonempty :: SexpGrammar a -> SexpGrammar (NonEmpty a)
nonempty a =
list (el a >>> rest a) >>>
pair >>> iso (uncurry (:|)) (\(x :| xs) -> (x, xs))
IG.flipped nonEmptyGrammar
let_
:: (forall t. Grammar Position (Sexp :- t) (a :- t))