sourceafQuickFlux::IconSrc.fan

using gfx::Image
using afIoc::ConcurrentState
using afIoc::RegistryShutdownHub

const class IconSrc {
    private const ConcurrentState   conState    := ConcurrentState(IconsSrcState#)  

    new make(RegistryShutdownHub shutdownHub) {
        icons := this
        shutdownHub.addRegistryShutdownListener("disposeIcons", [,]) |->| {
            withState { 
                images.vals.each { it.dispose }
                images.clear
            }
        }
    }
    
    @Operator
    Image? get(Uri? icoUri) {
        if (icoUri == null)
            return null
        return getState {
            images.getOrAdd(icoUri) {
                Image(icoUri)
            }
        }
    }
    
    internal Void withState(|IconsSrcState| state) {
        conState.withState(state)
    }

    internal Obj getState(|IconsSrcState -> Obj| state) {
        conState.getState(state)
    }   
}

@Serializable
internal class IconsSrcState {
    Uri:Image   images  := Uri:Image[:]
}