packages feed

moonlight-category-0.1.0.0: src-laws/Moonlight/Category/Effect/SitePathEnumeration.hs

module Moonlight.Category.Effect.SitePathEnumeration
  ( allEqual,
    sitePathObjectValues,
    sitePathObjects,
    sitePathMorphisms,
  )
where

import Data.Function ((&))
import Data.Maybe (mapMaybe)
import qualified Data.Set as Set
import Moonlight.Category.Pure.Site
  ( SitePathCategory,
    SitePathMorphism,
    SitePathObject,
    mkSitePathObject,
    siteObjects,
    sitePathManifest,
    sitePathMorphismsBetween,
  )

allEqual :: Eq a => [a] -> Bool
allEqual values =
  case values of
    [] -> True
    firstValue : restValues -> all (== firstValue) restValues

sitePathObjectValues :: SitePathCategory obj -> [obj]
sitePathObjectValues category =
  siteObjects (sitePathManifest category)
    & Set.toList

sitePathObjects :: Ord obj => SitePathCategory obj -> [SitePathObject obj]
sitePathObjects category =
  sitePathObjectValues category
    & mapMaybe (mkSitePathObject category)

sitePathMorphisms :: Ord obj => SitePathCategory obj -> [SitePathMorphism obj]
sitePathMorphisms category =
  let objectValues = sitePathObjectValues category
   in objectValues
        >>= (\sourceValue -> objectValues >>= sitePathMorphismsBetween category sourceValue)