Files
gyehoek-hs/src/Gyehoek/Wasm.hs
T
2026-08-24 23:41:52 -06:00

47 lines
995 B
Haskell

{- HLINT ignore "Use newtype instead of data" -}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE OverloadedLists #-}
{-# LANGUAGE TemplateHaskellQuotes #-}
module Gyehoek.Wasm
(
-- * syntax
Module
, Program
, Function
, Expr
-- ** quasiquoters
, watM
, wat
)
where
import Data.List (List)
import GHC.Generics (Generic)
import Language.Haskell.TH.Quote (QuasiQuoter)
import Gyehoek.Sexp qualified as S
import Gyehoek.Sexp (Datum, (>>>))
import Data.Data (Data)
type Program = Module
type Function = Datum
type Expr = List Datum
newtype Module = MkModule { inner :: List Datum }
deriving (Show, Generic, Data)
deriving newtype (Semigroup, Monoid)
instance S.DatumIso Module where
datumIso = S.with \g ->
S.list (S.el (S.sym "module") >>> S.rest S.datumIso)
>>> g
-- quasiquoters
wat :: QuasiQuoter
wat = S.makeSxs [|| S.fromDataUnsafe (S.dataIso @(List Datum)) ||]
watM :: QuasiQuoter
watM = S.makeSx [|| S.fromDatumUnsafe (S.datumIso @Module) ||]