packages feed

rest-rewrite-0.1: src/Language/REST/MetaTerm.hs

{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}

module Language.REST.MetaTerm where

import Data.String
import Data.Hashable
import GHC.Generics (Generic)
import qualified Data.Set as S

import Language.REST.Op
import Language.REST.RuntimeTerm

data MetaTerm =
    Var String
  | RWApp Op [MetaTerm] deriving (Eq, Ord, Show, Generic, Hashable)

instance IsString MetaTerm where
  fromString = Var

class ToMetaTerm a where
  toMetaTerm :: a -> MetaTerm

instance ToMetaTerm MetaTerm where
  toMetaTerm = id

instance ToMetaTerm RuntimeTerm where
  toMetaTerm (App f xs) = RWApp f (map toMetaTerm xs)

termOps :: ToMetaTerm a => a -> S.Set Op
termOps = go . toMetaTerm where
  go :: MetaTerm -> S.Set Op
  go (Var _)         = S.empty
  go (RWApp op trms) = S.insert op (S.unions (map go trms))