This commit is contained in:
msyds committed 2026-05-10 17:06:59 -06:00
1 parent c32e4b1a36
commit 3ce87bbb3d
2 files changed
+46 -54

No files matched your search

+22 -4
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))