diff --git a/miscellaneous/suckless-conf/lib/Data/Config/Suckless/Script/Internal.hs b/miscellaneous/suckless-conf/lib/Data/Config/Suckless/Script/Internal.hs index 366da9b7..abc4e5ed 100644 --- a/miscellaneous/suckless-conf/lib/Data/Config/Suckless/Script/Internal.hs +++ b/miscellaneous/suckless-conf/lib/Data/Config/Suckless/Script/Internal.hs @@ -33,6 +33,7 @@ import Data.Kind import Data.List (isPrefixOf) import Data.List qualified as List import Data.Maybe +import Data.Either import Data.String import Data.Text.IO qualified as TIO import Data.Text qualified as Text @@ -966,9 +967,13 @@ internalEntries = do _ -> throwIO (TypeCheckError @C nil) entry $ bindMatch "head" $ \case - [ ListVal es ] -> pure (head es) + [ ListVal es ] -> pure (headDef nil es) _ -> throwIO (TypeCheckError @C nil) + entry $ bindMatch "cons" $ \case + [ e, ListVal es ] -> pure (mkList (e:es)) + _ -> throwIO (BadFormException @C nil) + brief "get tail of list" $ args [arg "list" "list"] $ desc "nil if the list is empty; error if not list" @@ -1140,6 +1145,11 @@ internalEntries = do e@(SymbolVal x) -> wrapWith e _ -> id + + entry $ bindMatch "top:stdin" $ const do + liftIO TIO.getContents + <&> either (const nil) (mkList . fmap fixContext) . parseTop + brief "parses string as toplevel and produces a form" $ desc "parse:top:string SYMBOL STRING-LIKE" $ entry $ bindMatch "parse:top:string" $ \case