@@ -405,9 +405,13 @@ pSynSym = try (do lchar '['; n <- pName; lchar ']'
406pFunDecl' :: SyntaxInfo -> IParser PDecl
406pFunDecl' :: SyntaxInfo -> IParser PDecl
407pFunDecl' syn = try (do pushIndent
407pFunDecl' syn = try (do pushIndent
409+ let initOpts = if default_total ist
408− opts <- pFnOpts
412+ opts <- pFnOpts initOpts
409 acc <- pAccessibility
413 acc <- pAccessibility
410− opts' <- pFnOpts
414+ opts' <- pFnOpts opts
411 n_in <- pfName
415 n_in <- pfName
412 let n = expandNS syn n_in
416 let n = expandNS syn n_in
413 ty <- pTSig (impOK syn)
417 ty <- pTSig (impOK syn)
@@ -415,7 +419,7 @@ pFunDecl' syn = try (do pushIndent
415 pTerminator
419 pTerminator
416-- ty' <- implicit syn n ty
420-- ty' <- implicit syn n ty
417 addAcc n acc
421 addAcc n acc
418− return (PTy syn fc (opts ++ opts') n ty))
422+ return (PTy syn fc opts' n ty))
419 <|> try (pPattern syn)
423 <|> try (pPattern syn)
420 <|> try (pCAF syn)
424 <|> try (pCAF syn)
@@ -612,6 +616,11 @@ pOpFront = maybeWithNS pOpFrontNoNS False []
612pfName = try pOpFront
616pfName = try pOpFront
613 <|> pName
617 <|> pName
619+pTotality :: IParser Bool
621+ = do reserved "total"; return True
622+ <|> do reserved "partial"; return False
615pAccessibility' :: IParser Accessibility
624pAccessibility' :: IParser Accessibility
616pAccessibility'
625pAccessibility'
617 = do reserved "public"; return Public
626 = do reserved "public"; return Public
@@ -623,16 +632,17 @@ pAccessibility
623 = do acc <- pAccessibility'; return (Just acc)
632 = do acc <- pAccessibility'; return (Just acc)
624 <|> return Nothing
633 <|> return Nothing
626−pFnOpts :: IParser [FnOpt]
635+pFnOpts :: [FnOpt] -> IParser [FnOpt]
627−pFnOpts = do reserved "total"; xs <- pFnOpts; return (TotalFn : xs)
636+pFnOpts opts
637+ = do reserved "total"; pFnOpts (TotalFn : opts)
638+ <|> do reserved "partial"; pFnOpts (opts \\ [TotalFn])
628− <|> try (do lchar '%'; reserved "export"; c <- strlit; xs <- pFnOpts
639+ <|> try (do lchar '%'; reserved "export"; c <- strlit;
629− return (CExport c : xs))
640+ pFnOpts (CExport c : opts))
630− <|> do lchar '%'; reserved "assert_total"; xs <- pFnOpts; return (AssertTotal : xs)
641+ <|> do lchar '%'; reserved "assert_total"; pFnOpts (AssertTotal : opts)
631 <|> do lchar '%'; reserved "specialise";
642 <|> do lchar '%'; reserved "specialise";
632 lchar '['; ns <- sepBy pfName (lchar ','); lchar ']'
643 lchar '['; ns <- sepBy pfName (lchar ','); lchar ']'
634− return (Specialise ns : xs)
644+ pFnOpts (Specialise ns : opts)
635− <|> return []
645+ <|> return opts
637addAcc :: Name -> Maybe Accessibility -> IParser ()
647addAcc :: Name -> Maybe Accessibility -> IParser ()
638addAcc n a = do i <- getState
648addAcc n a = do i <- getState
@@ -1363,6 +1373,11 @@ pDirective = try (do lchar '%'; reserved "lib"; lib <- strlit;
1363 <|> try (do lchar '%'; reserved "access"; acc <- pAccessibility'
1373 <|> try (do lchar '%'; reserved "access"; acc <- pAccessibility'
1364 return [PDirective (do i <- getIState
1374 return [PDirective (do i <- getIState
1365 putIState (i { default_access = acc }))])
1375 putIState (i { default_access = acc }))])
1376+ <|> try (do lchar '%'; reserved "default"; tot <- pTotality
1378+ setState (i { default_total = tot } )
1379+ return [PDirective (do i <- getIState
1380+ putIState (i { default_total = tot }))])
1366 <|> try (do lchar '%'; reserved "logging"; i <- natural;
1381 <|> try (do lchar '%'; reserved "logging"; i <- natural;
1367 return [PDirective (setLogLevel (fromInteger i))])
1382 return [PDirective (setLogLevel (fromInteger i))])