module Trie where

import qualified Data.Map.Monoidal.Strict as Mm
data Trie k m = Trie
  { load :: m,
    down :: Mm.MonoidalMap k (Trie k m)
  }
  deriving (Eq, Show)

instance (Ord k, Semigroup m) => Semigroup (Trie k m) where
  Trie fi t <> Trie fi' t' = Trie (fi <> fi') (t <> t')

instance (Ord k, Monoid m) => Monoid (Trie k m) where
  mempty = Trie mempty mempty