module Main where import Prelude import Control.Monad.Eff (Eff) import Control.Monad.Eff.Console (CONSOLE, logShow) import Data.Symbol (class IsSymbol, SProxy(..), reflectSymbol) import Type.Proxy (Proxy(..)) import Type.Row (class ListToRow, class RowToList, Cons, Nil, kind RowList) class RollMySausage (rowList :: RowList) where rollMySausage :: forall row . RowToList row rowList => Proxy (Record row) -> Array String instance rmsCons :: ( IsSymbol name , RollMySausage tail , ListToRow tail tailRow , RowToList tailRow tail ) => RollMySausage (Cons name ty tail) where rollMySausage _ = [name] <> rest where name = reflectSymbol (SProxy :: SProxy name) rest = rollMySausage (Proxy :: Proxy (Record tailRow)) instance rmsNil :: RollMySausage Nil where rollMySausage _ = [] type MyTest = { a :: Int , b :: String , c :: Boolean } main :: forall e. Eff (console :: CONSOLE | e) Unit main = do logShow $ rollMySausage (Proxy :: Proxy MyTest) -- outputs ["a","b","c"]