packages feed

axel-0.0.13: src/Axel/Eff/Resource.hs

{-# LANGUAGE TemplateHaskell #-}

module Axel.Eff.Resource where

import Axel.Prelude

import Axel.Eff ((:>>))
import Axel.Eff.FileSystem as FS (FileSystem, readFile)
import Axel.Utils.FilePath ((</>))

import Control.Lens
import Control.Monad ((>=>))

import Data.Text.Lens (unpacked)

import Effectful ((:>))
import qualified Effectful as Eff
import qualified Effectful.Dispatch.Dynamic as Eff
import qualified Effectful.TH as Eff

import qualified Paths_axel as Paths (getDataFileName)

newtype ResourceId =
  ResourceId Text

data Resource :: Eff.Effect where
  GetResourcePath :: ResourceId -> Resource m FilePath

Eff.makeEffect ''Resource

getDataFileName :: FilePath -> IO FilePath
getDataFileName = _Wrapping' FilePath (unpacked Paths.getDataFileName)

runResource ::
     (Eff.IOE :> effs) => Eff.Eff (Resource ': effs) a -> Eff.Eff effs a
runResource =
  Eff.interpret $ \_ ->
    \case
      GetResourcePath (ResourceId resource) ->
        Eff.liftIO $
        getDataFileName (FilePath "resources" </> FilePath resource)

readResource ::
     ('[ FileSystem, Resource] :>> effs) => ResourceId -> Eff.Eff effs Text
readResource = getResourcePath >=> FS.readFile

newProjectTemplate :: ResourceId
newProjectTemplate = ResourceId "new-project-template"