snippet-0.0.0.0: src/Snippet.hs
-- |
--
-- Module : Snippet
-- Copyright : (c) 2026 Patrick Brisbin
-- License : AGPL-3
-- Maintainer : pbrisbin@gmail.com
-- Stability : experimental
-- Portability : POSIX
module Snippet
( Region (..)
, Snippet
, snippetFromFile
, snippetFromContents
) where
import Prelude
import Data.List.NonEmpty (nonEmpty)
import Data.Maybe (fromMaybe)
import Data.Text (Text, pack)
import Data.Text qualified as T
import Data.Text.IO qualified as T
import Snippet.Lines
import Snippet.Region
import Snippet.Snippet
import System.Directory (doesFileExist)
snippetFromFile :: Region -> FilePath -> IO (Maybe Snippet)
snippetFromFile region path = do
exists <- doesFileExist path
if exists
then do
contents <- T.readFile path
pure $ snippetFromContents region (pack path) contents
else pure Nothing
snippetFromContents
:: Region
-> Text
-- ^ URI
-> Text
-- ^ Code content
-> Maybe Snippet
snippetFromContents region uri =
fmap mkSnippet . nonEmpty . drop (sl - 1) . take el . T.lines
where
mkSnippet = Snippet uri region . makeLines region
sl = region.startLine
el = fromMaybe sl region.endLine