axel-0.0.9: src/Axel/Eff/Resource.hs
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeOperators #-}
module Axel.Eff.Resource where
import Axel.Eff.FileSystem as FS (FileSystem, readFile)
import Control.Monad ((>=>))
import Control.Monad.Freer (type (~>), Eff, LastMember, Members, interpretM)
import Control.Monad.Freer.TH (makeEffect)
import Paths_axel (getDataFileName)
import System.FilePath ((</>))
newtype ResourceId =
ResourceId String
data Resource a where
GetResourcePath :: ResourceId -> Resource FilePath
makeEffect ''Resource
runEff :: (LastMember IO effs) => Eff (Resource ': effs) ~> Eff effs
runEff =
interpretM
(\case
GetResourcePath (ResourceId resource) ->
getDataFileName ("resources" </> resource))
readResource ::
(Members '[ FileSystem, Resource] effs) => ResourceId -> Eff effs String
readResource = getResourcePath >=> FS.readFile
astDefinition :: ResourceId
astDefinition = ResourceId "autogenerated/macros/AST.hs"
macroDefinitionAndEnvironmentFooter :: ResourceId
macroDefinitionAndEnvironmentFooter =
ResourceId "macros/MacroDefinitionAndEnvironmentFooter.hs"
macroDefinitionAndEnvironmentHeader :: ResourceId
macroDefinitionAndEnvironmentHeader =
ResourceId "macros/MacroDefinitionAndEnvironmentHeader.hs"
macroScaffold :: ResourceId
macroScaffold = ResourceId "macros/Scaffold.hs"
newProjectTemplate :: ResourceId
newProjectTemplate = ResourceId "new-project-template"