module Network.IPFS.SparseTree
( SparseTree (..)
, Error.Linearization (..)
, linearize
, cIDs
) where
import Network.IPFS.Prelude
import qualified Network.IPFS.Internal.UTF8 as UTF8
import qualified Network.IPFS.Error as Error
import Network.IPFS.CID.Types
import Network.IPFS.Name.Types
import Network.IPFS.Path.Types
import Network.IPFS.SparseTree.Types
linearize :: SparseTree -> Either Error.Linearization Path
linearize = fmap Path . go
where
go :: SparseTree -> Either Error.Linearization Text
go = \case
Stub (Name name) -> Right <| UTF8.textShow name
Content (CID _) -> Right ""
Directory [(tag, value)] -> fromPath tag <$> go value
badDir -> Left <| Error.NonLinear badDir
where
fromPath tag "" = fromKey tag
fromPath tag text = fromKey tag <> "/" <> text
fromKey :: Tag -> Text
fromKey = UTF8.stripN 1 . \case
Hash (CID cid) -> cid
Key (Name name) -> UTF8.textShow name
cIDs :: (Monoid (f CID), Applicative f) => SparseTree -> f CID
cIDs (Stub _) = mempty
cIDs (Content cid) = pure cid
cIDs (Directory kv) = foldMap cIDs kv