{-# LANGUAGE OverloadedStrings #-} module Funcons.Core.Abstractions.Thunk where import Funcons.EDSL import Funcons.Types library = libFromList [ ("thunk", NonStrictFuncon stepThunk) , ("thunks", StrictFuncon stepThunks) ] thunk_ :: [Funcons] -> Funcons thunk_ fargs = applyFuncon "thunk" fargs stepThunk [f] = rewriteTo $ FValue $ Thunk f stepThunk fs = sortErr (applyFuncon "thunk" fs) "thunk not applied to a single funcon" stepThunks [ComputationType ct] = rewriteTo $ type_ $ Thunks ct stepThunks vs = sortErr (applyFuncon "thunks" (fvalues vs)) "thunks not applied to computation-type"