Skip to content

Commit

Permalink
allow implicit args
Browse files Browse the repository at this point in the history
  • Loading branch information
janmasrovira committed Nov 20, 2024
1 parent 768f45d commit ccd9044
Showing 1 changed file with 16 additions and 9 deletions.
25 changes: 16 additions & 9 deletions src/Juvix/Compiler/Internal/Translation/FromConcrete.hs
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@ import Juvix.Compiler.Store.Scoped.Data.InfoTable qualified as S
import Juvix.Compiler.Store.Scoped.Language (createExportsTable)
import Juvix.Compiler.Store.Scoped.Language qualified as S
import Juvix.Prelude
import Juvix.Prelude.Stream qualified as Stream
import Safe (lastMay)

-- | Needed to generate field projections and deriving instances
Expand Down Expand Up @@ -602,10 +601,15 @@ deriveEq pragmas instanceName funParams (eqName, args) = do
Internal.ConstructorName ->
Sem r Internal.LambdaClause
lambdaClause band btrue bisEqual c = do
numArgs :: Int <- getNumArgs
let mkpat = do
xs <- mapM (Internal.freshVar (getLoc instanceName)) (Stream.take numArgs allWords)
return (xs, Internal.mkConstructorVarPattern Explicit c ((Explicit,) <$> xs))
numArgs :: [IsImplicit] <- getNumArgs
let loc = getLoc instanceName
mkpat :: Sem r ([Internal.VarName], Internal.PatternArg)
mkpat = runOutputList . runStreamOf allWords $ do
xs :: [(IsImplicit, Internal.VarName)] <- forM numArgs $ \impl -> do
v <- yield >>= Internal.freshVar loc
output v
return (impl, v)
return (Internal.mkConstructorVarPattern Explicit c xs)
(v1, p1) <- mkpat
(v2, p2) <- mkpat
return
Expand All @@ -628,12 +632,15 @@ deriveEq pragmas instanceName funParams (eqName, args) = do
mkEq :: (Internal.IsExpression expr) => expr -> expr -> Internal.Expression
mkEq a b = bisEqual Internal.@@ a Internal.@@ b

getNumArgs :: Sem r Int
getNumArgs :: Sem r [IsImplicit]
getNumArgs = do
def <- getDefinedConstructor c
let cargs :: [Internal.FunctionParameter] = Internal.constructorArgs (def ^. Internal.constructorInfoType)
unless (all ((== Explicit) . (^. Internal.paramImplicit)) cargs) (error "TODO all args must be explicit")
return (length cargs)
return $
def
^.. Internal.constructorInfoType
. to Internal.constructorArgs
. each
. Internal.paramImplicit

goFunctionDef ::
forall r.
Expand Down

0 comments on commit ccd9044

Please sign in to comment.