@@ -405,9 +405,13 @@ pSynSym = try (do lchar '['; n <- pName; lchar ']'
405405
406406pFunDecl' :: SyntaxInfo -> IParser PDecl
407407pFunDecl' syn = try (do pushIndent
408− opts <- pFnOpts
408+ ist <- getState
409+ let initOpts = if default_total ist
410+ then [TotalFn]
411+ else []
412+ opts <- pFnOpts initOpts
409413 acc <- pAccessibility
410− opts' <- pFnOpts
414+ opts' <- pFnOpts opts
411415 n_in <- pfName
412416 let n = expandNS syn n_in
413417 ty <- pTSig (impOK syn)
@@ -415,7 +419,7 @@ pFunDecl' syn = try (do pushIndent
415419 pTerminator
416420-- ty' <- implicit syn n ty
417421 addAcc n acc
418− return (PTy syn fc (opts ++ opts') n ty))
422+ return (PTy syn fc opts' n ty))
419423 <|> try (pPattern syn)
420424 <|> try (pCAF syn)
421425
@@ -612,6 +616,11 @@ pOpFront = maybeWithNS pOpFrontNoNS False []
612616pfName = try pOpFront
613617 <|> pName
614618
619+pTotality :: IParser Bool
620+pTotality
621+ = do reserved "total"; return True
622+ <|> do reserved "partial"; return False
623+
615624pAccessibility' :: IParser Accessibility
616625pAccessibility'
617626 = do reserved "public"; return Public
@@ -623,16 +632,17 @@ pAccessibility
623632 = do acc <- pAccessibility'; return (Just acc)
624633 <|> return Nothing
625634
626−pFnOpts :: IParser [FnOpt]
627−pFnOpts = do reserved "total"; xs <- pFnOpts; return (TotalFn : xs)
628− <|> try (do lchar '%'; reserved "export"; c <- strlit; xs <- pFnOpts
629− return (CExport c : xs))
630− <|> do lchar '%'; reserved "assert_total"; xs <- pFnOpts; return (AssertTotal : xs)
635+pFnOpts :: [FnOpt] -> IParser [FnOpt]
636+pFnOpts opts
637+ = do reserved "total"; pFnOpts (TotalFn : opts)
638+ <|> do reserved "partial"; pFnOpts (opts \\ [TotalFn])
639+ <|> try (do lchar '%'; reserved "export"; c <- strlit;
640+ pFnOpts (CExport c : opts))
641+ <|> do lchar '%'; reserved "assert_total"; pFnOpts (AssertTotal : opts)
631642 <|> do lchar '%'; reserved "specialise";
632643 lchar '['; ns <- sepBy pfName (lchar ','); lchar ']'
633− xs <- pFnOpts
634− return (Specialise ns : xs)
635− <|> return []
644+ pFnOpts (Specialise ns : opts)
645+ <|> return opts
636646
637647addAcc :: Name -> Maybe Accessibility -> IParser ()
638648addAcc n a = do i <- getState
@@ -1363,6 +1373,11 @@ pDirective = try (do lchar '%'; reserved "lib"; lib <- strlit;
13631373 <|> try (do lchar '%'; reserved "access"; acc <- pAccessibility'
13641374 return [PDirective (do i <- getIState
13651375 putIState (i { default_access = acc }))])
1376+ <|> try (do lchar '%'; reserved "default"; tot <- pTotality
1377+ i <- getState
1378+ setState (i { default_total = tot } )
1379+ return [PDirective (do i <- getIState
1380+ putIState (i { default_total = tot }))])
13661381 <|> try (do lchar '%'; reserved "logging"; i <- natural;
13671382 return [PDirective (setLogLevel (fromInteger i))])
13681383