{- 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) ||]