packages feed

freer-effects-0.3.0.0: examples/src/Capitalize.hs

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE TypeOperators #-}
module Capitalize where

import Data.Char (toUpper)

import Control.Monad.Freer
import Control.Monad.Freer.Internal

data Capitalize v where
    Capitalize :: String -> Capitalize String

capitalize :: Member Capitalize r => String -> Eff r String
capitalize = send . Capitalize

runCapitalizeM :: Eff (Capitalize ': r) w -> Eff r w
runCapitalizeM (Val x) = return x
runCapitalizeM (E u q) = case decomp u of
    Right (Capitalize s) -> runCapitalizeM (qApp q (map toUpper s))
    Left u'              -> E u' (tsingleton (runCapitalizeM . qApp q))