47 lines
995 B
Haskell
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) ||]
|