extensible-0.4: examples/tangle.hs
{-# LANGUAGE TemplateHaskell, DataKinds #-}
import Control.Monad.Trans.Class
import Data.Extensible
import Data.Functor.Identity
import Data.Proxy
mkField "foo bar baz"
type Rec = ["foo" :> String, "bar" :> Int, "baz" :> Double, "qux" :> Bool]
class MakeRec kv where
make :: proxy kv -> TangleT (Field Identity) Rec IO (AssocValue kv)
instance MakeRec ("foo" :> String) where
make _ = lift getLine
instance MakeRec ("bar" :> Int) where
make _ = lift $ length <$> getLine
instance MakeRec ("baz" :> Double) where
make _ = lift readLn
instance MakeRec ("qux" :> Bool) where
make _ = do
str <- lasso foo
x <- lasso baz
return $ str == show x
makeRec :: IO (Record Rec)
makeRec = runTangles
(htabulateFor (Proxy :: Proxy MakeRec)
$ \m -> Comp $ Field . pure <$> make m)
(wrench Nil)