package cangjie_tpc::prism4cj.prism

public abstract class Pattern <: Hashable & Equatable<Pattern> & ToString {
    public func regex(): Regex

    public func lookbehind(): Bool

    public func greedy(): Bool

    public func alias(): ?String

    public func inside(): ?Grammar
}

public class PatternImpl <: Pattern {
    var patternRegex: Regex
    var patternLookbehind: Bool
    var patternGreedy: Bool
    var patternAlias: ?String
    var patternInside: ?Grammar

    public init(regex: Regex, lookbehind: Bool, greedy: Bool, alias: ?String, inside: ?Grammar) {
        this.patternRegex = regex
        this.patternLookbehind = lookbehind
        this.patternGreedy = greedy
        this.patternAlias = alias
        this.patternInside = inside
    }

    public override func regex(): Regex {
        return patternRegex
    }

    public override func lookbehind(): Bool {
        return patternLookbehind
    }

    public override func greedy(): Bool {
        return patternGreedy
    }

    public override func alias(): ?String {
        return patternAlias
    }

    public override func inside(): ?Grammar {
        return patternInside
    }

    public operator func ==(other: Pattern): Bool {
        return refEq(this, other)
    }

    public operator func !=(other: Pattern): Bool {
        return !refEq(this, other)
    }

    @OverflowWrapping
    public override func hashCode(): Int64 {
        return 31 * patternRegex.string().hashCode()
    }

    public override func toString(): String {
        return PrismToString.toString(this)
    }
}